因为之前有学习过DX9,处理方式为从摄像机处向玩家所在位置反射一条射线,如果射线撞上了其他物体,则改变该物体的alpha值,使之透明。unity3d作为一款引擎存在让这个问题变的无比的简单,因为几乎要用到的东西它都给封装好了。所以在这里记录下代码方便自己看也顺便可以帮助下有需要的朋友们。
效果图,红线是从玩家角色身上向摄像机发出的射线
代码如下:
using UnityEngine;
using System.Collections;
public class IntersectTest : MonoBehaviour {
public float m_alpha = 0.3f;
public GameObject m_player;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
int layMask = 1 << 9;//忽略player层,player层需要自己创建
Vector3 pointBegin = m_player.transform.position;
Vector3 dir = (transform.position - pointBegin).normalized;
Ray ray = new Ray(pointBegin, dir);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity, ~layMask))
{
Debug.DrawLine(pointBegin, hit.point, Color.red);
Collider c = hit.collider;
if (c.tag.CompareTo("MainCamera") != 0)
{
c.renderer.material.shader = Shader.Find("Transparent/Diffuse");
Color color = c.renderer.material.color;
color.a = m_alpha;
c.renderer.material.color = color;
}
}
}
}
效果图,红线是从玩家角色身上向摄像机发出的射线
PS:射线碰撞需要给物体套上外接体。
PPS:该方法同样可以用在自由视角下的摄像机拉近拉远的问题上。