今天遇到了这样的一个需求觉得很有建设性:在摄像机跟随角色移动的过程中,如果遇到物体遮挡,将其变为透明材质,物体移开后还原初始材质。
下面是我的实现方式:~
1、创建射线。(顺便把透明材质球加载出来)
private Ray ray;
//透明材质球
private Material alphaMate;
void Start()
{
ray = Camera.main.ScreenPointToRay(transform.position);
alphaMate = Resources.Load<Material>("Ambient Particle");
}
2、准备工作。
RaycastHit hit;
//照射到的物体
private GameObject selectModel;
//遮挡物的所有材质
private MeshRenderer[] targetMeshs;
//用来存储遮挡物变透明之前的所有材质
private List<Material> tempMats = new List<Material>();
3、接下来就是替换方法了(如果是实时监测,别忘了放Update里)。
void ChangeMates()
{
//圆柱形射线检测:起点为摄像机位置,圆柱半径0.5,方向沿摄像机Z轴正方向射出500的长度。
if (Physics.SphereCast(CameraTrans.position, 0.5f, CameraTrans.forward, out hit, 500))
{
//通过碰撞物体的名字判断是否为遮挡物
if (hit.collider.gameObject.name == "Collider")
{
//将遮挡物暂存在selectModel中,以便之后的还原材质
selectModel = hit.collider.gameObject;
if (selectModel != null)
{
//获取到遮挡物中的所有原始材质球
targetMeshs = hit.collider.transform.parent.GetComponentsInChildren<MeshRenderer>();
//更换材质球
for (int i = 0; i < targetMeshs.Length; i++)
{
//暂存遮挡物的原始材质
tempMats.Add(targetMeshs[i].material);
//更换透明材质
targetMeshs[i].material = alphaMate;
}
}
}
else //遮挡物移开
{
//判断遮挡物是否已经被更换完毕
if (selectModel != null)
{
for (int i = 0; i < targetMeshs.Length; i++)
{
//还原材质
targetMeshs[i].material = tempMats[i];
}
//清空selectModel信息和list。
selectModel = null;
tempMats.Clear();
}
}
4、有更好的方法欢迎指点。