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