Unity遮挡透明渐变

遮挡透明若没有渐变实现方法:

  1、透明中物体存在list中

  2、每过一段时间(可以每帧,但是流畅性会降低)摄像机发送一条射线向玩家,out hitInfo

  3、list与hitInfo比对,将在list中但是没有在hitInfo中的物体转变成不透明,list.remove;将在hitInfo中但是没有在list中转变成透明,list.add

若有渐变,实现比较麻烦一点,物体有两个状态:转变成透明过程中、转变成不透明过程中,添加两个list(InTransparent,outTransparent)对应两种状态,那么维护两个list即可:

  1、未遮挡->遮挡,查看outTransparent,如果有该物体,从outTransparent移入InTransparent,outTransparent remove;如果没有添加新的加入InTransparent

  2、遮挡->未遮挡,查看InTransparent,如果有该物体,从InTransparent移入outTransparent,InTransparent remove;如果没有添加新的加入outTransparent

摄像机CameraFollow.cs:

 1 public class CameraFollow : MonoBehaviour 2 { 3  4     public static CameraFollow instance; 5     public Transform Player; 6  7     public List<CameraMaskInfo> Mask; 8     public List<CameraMaskInfo> InTransparentList; 9     public List<CameraMaskInfo> OutTransparentList;10 11     RaycastHit[] hitInfo;12 13     void Awake()14     {15         instance = this;16     }17     void Start()18     {19         StartCoroutine(IEMask());20     }21     public void ClearMask()22     {23         Mask.Clear();24         InTransparentList.Clear();25         OutTransparentList.Clear();26     }27 28     IEnumerator IEMask()29     {30         while (true)31         {32             hitInfo = Physics.CapsuleCastAll(FollowTarget.position + Vector3.up * 0.2f, FollowTarget.position - Vector3.up * 0.1f, 0.2f, (transform.position - FollowTarget.position).normalized, 100f, layerMask);33             bool flag;34             for (int i = Mask.Count - 1; i >= 0; i--)35             {36                 flag = false;37                 for (int j = 0; j < hitInfo.Length; j++)38                 {39                     if (Mask[i].GetObj() == hitInfo[j].collider.gameObject)40                     {41                         flag = true;42                         break;43                     }44                 }45                 if (!flag)46                 {47                     Mask[i].PutOutTransparent();48                     Mask.RemoveAt(i);49                 }50             }51 52             for (int i = 0; i < hitInfo.Length; i++)53             {54                 flag = false;55                 for (int j = 0; j < Mask.Count; j++)56                 {57                     if (hitInfo[i].collider.gameObject == Mask[j].GetObj())58                     {59                         flag = true;60                         break;61                     }62                 }63                 if (!flag)64                 {65                     CameraMaskInfo maskInfo = new CameraMaskInfo(hitInfo[i].collider.gameObject);66                     maskInfo.PutInTransparent();67                     Mask.Add(maskInfo);68                 }69             }70         }71         yield return new WaitForSeconds(0.2f);72     }73 74     void Update()75     {76         for (int i = InTransparentList.Count - 1; i >= 0; i--)77         {78             InTransparentList[i].Sub();79         }80 81         for (int i = OutTransparentList.Count - 1; i >= 0; i--)82         {83             OutTransparentList[i].Add();84         }85     }86 }

View Code

遮挡物体CameraMaskInfo.cs:

using UnityEngine;using System.Collections;public class CameraMaskInfo {    private GameObject obj;    private Shader[] preMaterialShader;    public bool isDestroy;    #region get    public GameObject GetObj()    {        return obj;    }    public Shader[] GetpreMaterialShader()    {        return preMaterialShader;    }    #endregion    public CameraMaskInfo(GameObject obj)    {        this.obj = obj;    }    public void PutInTransparent()    {        int id = -1;         for (int i = 0; i < CameraFollow.instance.OutTransparentList.Count; i++)        {            if (CameraFollow.instance.OutTransparentList[i].GetObj() == obj)            {                id = i;                //如果在out里面有,那么说明该物体的shader已经被改变,只能从之前的获得                preMaterialShader = CameraFollow.instance.OutTransparentList[i].GetpreMaterialShader();                CameraFollow.instance.InTransparentList.Add(CameraFollow.instance.OutTransparentList[i]);                CameraFollow.instance.OutTransparentList.RemoveAt(i);                break;            }        }        if (id==-1)        {            preMaterialShader = new Shader[obj.renderer.materials.Length];            for (int i = 0; i < obj.renderer.materials.Length; i++)            {                preMaterialShader[i] = obj.renderer.materials[i].shader;                obj.renderer.materials[i].shader = Shader.Find("Transparent/Diffuse");            }            CameraFollow.instance.InTransparentList.Add(this);        }    }    public void PutOutTransparent()    {        int id = -1;        for (int i = 0; i < CameraFollow.instance.InTransparentList.Count; i++)        {            if (CameraFollow.instance.InTransparentList[i].GetObj() == obj)            {                id = i;                CameraFollow.instance.OutTransparentList.Add(CameraFollow.instance.InTransparentList[i]);                CameraFollow.instance.InTransparentList.RemoveAt(i);                break;            }        }        if (id == -1)        {            CameraFollow.instance.OutTransparentList.Add(this);        }    }    public void Add()    {        for (int i = 0; i < obj.renderer.materials.Length; i++)        {            obj.renderer.materials[i].color = new Color(obj.renderer.materials[i].color.r, obj.renderer.materials[i].color.g, obj.renderer.materials[i].color.b, obj.renderer.materials[i].color.a + Time.deltaTime * 2f);        }        if (obj.renderer.materials[0].color.a >= 0.95f)        {            for (int i = 0; i < obj.renderer.materials.Length; i++)            {                obj.renderer.materials[i].color = new Color(obj.renderer.materials[i].color.r, obj.renderer.materials[i].color.g, obj.renderer.materials[i].color.b, 1f);            }            SetPreShader();            CameraFollow.instance.OutTransparentList.Remove(this);        }    }    public void Sub()    {        for (int i = 0; i < obj.renderer.materials.Length; i++)        {            obj.renderer.materials[i].color = new Color(obj.renderer.materials[i].color.r, obj.renderer.materials[i].color.g, obj.renderer.materials[i].color.b, obj.renderer.materials[i].color.a - Time.deltaTime * 2f);        }        if (obj.renderer.materials[0].color.a <= 0.3f)        {            CameraFollow.instance.InTransparentList.Remove(this);        }    }    private void SetPreShader()    {        for (int i = 0; i < obj.renderer.materials.Length; i++)        {            obj.renderer.materials[i].shader = preMaterialShader[i];        }    }}

View Code

效果:

人性最可怜的就是:我们总是梦想着天边的一座奇妙的玫瑰园,

Unity遮挡透明渐变

相关文章:

你感兴趣的文章:

标签云: