我可以使GameObject的所有内容透明吗?(Unity3D 2017.3)

Dae*_*vin 0 c# unity-game-engine

我正在制作一个ARCore应用程序(应该没关系,不应该吗?),在放置之前,您可以在屏幕中央看到可见的模型.用户可以更改这些模型.

我想要获得的效果是在你将它设置为"幻影"/半透明之前获得你所看到的模型.我理想的是拥有一个空的GameObject(现在名为GhostWrapper),它是Ghost的父级,并且GhostWrapper中的所有内容都是半透明的.这是因为Ghost模型可以随用户输入而改变,然后当用户想要放置Ghost时,Ghost会在飞机上实例化:

public void SetPlaceableModel(GameObject newModel)
{
    PlaceableModel = newModel;
    var pos = (Ghost != null) ? Ghost.transform.position : FirstPersonCamera.ScreenToWorldPoint(new Vector3(Screen.width / 2f, Screen.height / 2f, -100f));
    var rot = (Ghost != null) ? Ghost.transform.rotation : Quaternion.identity;
    Destroy(Ghost);
    Ghost = Instantiate(PlaceableModel, pos, rot, GhostWrapper.transform);
}
Run Code Online (Sandbox Code Playgroud)

我无法让GhostWrapper工作,所以下面是我试图直接对Ghost做的事情,但我更愿意,如果我可以拥有,实质上,GhostWrapper导致其中的所有内容看起来都是半透明的(它不必强迫它的孩子透明,但让它们看起来像它).

我已经谷歌了很多,并尝试了顶级结果中建议的方式,但几乎所有似乎都是"获得MeshRenderer并设置.material.color为透明"的变体,这似乎并没有起作用.我也尝试在我的模型上设置材质以使用不同的着色器并将颜色设置为alpha,但这些都没有起作用(我看到的所有答案似乎都来自2009-2014,所以也许他们"刚刚过时了吗?" 我也试过Unity文档所说的无济于事.

我想过让GhostWrapper成为一个真正的盒子模型,它包含Ghost并操纵它以使内部的项目显得透明,但由于模型的形状/大小可以大不相同,并且用户可以靠近它们移动,可能只是在盒子内移动,它会失去效果.

谁能帮我这个?

注意:我正在使用的模型有Unit/Texture着色器.我很乐意改变它,如果我可以让它工作,但我已经改为其他几个,包括使用Standard和更改Render Modeto Fade和Transparent.仍然没有运气.

Pro*_*mer 5

您无法修改单位/纹理着色器的透明度,因为该着色器中没有允许您这样做的属性.使用单位/纹理着色器执行此操作的一种方法是获取基本纹理属性,使用其中一个Texture2D.SetPixelXXX函数对其进行修改,并将alpha设置为您想要的任何内容.这是缓慢且不必要的.仅当您必须使用单位/纹理着色器时才能使用此路线.

使用标准着色器.以下是使用标准着色器时的步骤.

1.将材质着色器更改为标准

2.将材质的渲染模式更改为淡入淡出

您也可以使用以下代码执行此操作:

void changeMaterialModeToFadeMode(Renderer rd)
{
    rd.material.SetFloat("_Mode", 2);
    rd.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
    rd.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
    rd.material.SetInt("_ZWrite", 0);
    rd.material.DisableKeyword("_ALPHATEST_ON");
    rd.material.EnableKeyword("_ALPHABLEND_ON");
    rd.material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
    rd.material.renderQueue = 3000;
}
Run Code Online (Sandbox Code Playgroud)

3.最后,这是如何更改alpha:

GameObject ghost = ....;
Renderer ghostRenderer = ghost.GetComponent<Renderer>();

//Get current Color
Color meshColor = ghostRenderer.material.color;

//Set Alpha
const float alpha = 0.5f;
meshColor.a = alpha;

//Apply the new color to the material
ghostRenderer.material.color = meshColor;
Run Code Online (Sandbox Code Playgroud)