3D游戏,经常会看到透视效果,例如《王者荣耀》草丛透视,《拥挤城市》建筑透视。
实现原理:把3D模型MeshRenderer中Materials替换成透明材质球。
举例:《拥挤城市》3D房子建筑透视效果实现,效果如下图,建筑阻碍了相机看到主角,建筑变成白色透明。 **步骤1:创建一个材质球,选择Shader为Unlit/Transparent,然后把透明贴图(透明度高的图片)赋给材质球。 ** 步骤2:代码检测(射线检测)
using UnityEngine;
using System.Collections;
public class PlayerViewProtect : MonoBehaviour
{
public LayerMask LayerMask;
public Material ProtectMaterial;
private Material[] originMaterials;
private GameObject hitObj;
private void Update()
{
Ray ray = new Ray(Camera.main.transform.position, directionTo(Camera.main.transform.position,transform.position));
Debug.DrawRay(ray.origin,ray.direction);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 50 , LayerMask))
{
if(hitObj == null || hitObj != hit.collider.gameObject)
{
Renderer r;
if(hitObj != null)
{
r = hitObj.GetComponent<Renderer>();
r.materials = originMaterials;
}
hitObj = hit.collider.gameObject;
r = hit.collider.gameObject.GetComponent<Renderer>();
if(r == null)
{
hitObj = null;
}
else
{
originMaterials = r.materials;
r.material = ProtectMaterial;
}
}
}
else
{
if(hitObj != null)
{
Renderer r = hitObj.GetComponent<Renderer>();
r.materials = originMaterials;
hitObj = null;
originMaterials = null;
}
}
}
private Vector3 directionTo(Vector3 rFrom, Vector3 rTo)
{
Vector3 lDifference = rTo - rFrom;
return lDifference.normalized;
}
}
LayerMask:要检测的层级,这里只检测建筑Buildings。 ProtectMaterial:替换建筑的透明材质球。 代码中使用射线检测镜头和主角之间是否存在LayerMask层的建筑,如果检测到则执行步骤3。 步骤3:建筑MeshRenderer中Materials替换成透明材质球
github.com/jambestwick 持续更新unity3d用法
转载文章,原文https://blog.csdn.net/qq_37254525/article/details/106995345
|