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

时间:2018-01-12 19:59:40

标签: c# unity3d

我正在制作一个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);
}

我还没有能够让GhostWrapper工作,所以下面就是我试图直接对Ghost做的事情,但是我更愿意,如果我本来可以拥有GhostWrapper的原因其中的所有内容都看起来是半透明的(它不必强迫它的孩子透明,但让它们看起来像它)。

我已经谷歌了很多,并尝试了最佳结果中建议的方式,但几乎所有方法似乎都是"变为MeshRenderer并设置其{{ 1}}到透明",并且似乎没有效果。我也尝试在我的模型上设置材质以使用不同的着色器并将颜色设置为alpha,但这些都不起作用(all the answers I've seen appear to be from 2009-2014,所以也许他们只是出去了 - 过期?)。我也试过Unity documentation says无效。

我已经考虑过让GhostWrapper成为一个包含Ghost的实际盒子模型,并对其进行操作以使内部的项目显得透明,但由于模型的形状/大小可能大不相同,并且用户可以移动靠近他们,他们可能只是在盒子内移动,它会失去效果。

任何人都可以帮我吗?

注意:我使用的模型具有.material.color着色器。我非常愿意改变它,如果我可以让它工作,但我已将其更改为其他几个,包括使用Unit/Texture并将Standard更改为Render Mode和{{1} }。仍然没有运气。

1 个答案:

答案 0 :(得分: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;
}

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;