阻挡角色的墙面替换为透明shader的材质替换操作

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


/// <summary>
/// 注意:词典 AllHide那部分还可以优化,恢复材质后清空
/// </summary>



public class TransparentManager : MonoBehaviour
{
    RaycastHit hitInfo;
    Material transparent;//隐身材质  里面的shader是隐身的
    Dictionary<string, Material[]> AllMat = new Dictionary<string, Material[]>();//所有材质
    Dictionary<GameObject, bool> AllHide = new Dictionary<GameObject, bool>();
    Transform playerTrans;//
                          // bool isGround;//
    List<GameObject> list1 = new List<GameObject>();
    float timer = 0;
    float timeInterval = 0.3f;
    Material Transparent;//透明材质
    void Start()
    {
        Transparent = Resources.Load<Material>("Material/" + "Transparent1");
    }
    void FixedUpdate()
    {
        if (RPlayer.I == null)//赋值角色
            return;
        else
        {
            if (!playerTrans)
                playerTrans = RPlayer.I.trans;
        }

        if (timer < Time.time)   //时间判断
        {
            timer += timeInterval;
        }
        else
            return;
        if (playerTrans == null)//表示还没赋值
        {
            return;
        }
        #region 参照代码
        /* if(Input.GetMouseButton(0))
         {
             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出到点击坐标的射线
             RaycastHit hitInfo;
            if(Physics.Raycast(ray,out hitInfo))
             {
                 Debug.DrawLine(ray.origin, hitInfo.point);//划出射线,只有在scene视图中才能看到
                 GameObject gameObj = hitInfo.collider.gameObject;
                 xuqi.Log("click object name is " + gameObj.name);
                 if(gameObj.tag == "boot")//当射线碰撞目标为boot类型的物品 ,执行拾取操作
                 {
                     xuqi.Log("pick up!");
                 }
             }
         }*/
        #endregion
        Vector3 dir = Camera.main.transform.position - playerTrans.position;
        list1.AddRange(AllHide.Keys);
        foreach (var k in list1)//全部变成false
        {
            //bool b;
            //AllHide.TryGetValue(k, out b);
            //b = false;
            AllHide[k] = false;
        }
        if (Physics.Raycast(playerTrans.position, dir, out hitInfo, 200.0f, 1 << LayerMask.NameToLayer("Wall")))//
        {

            RaycastHit[] rts = Physics.RaycastAll(playerTrans.position, dir, 200.0f, 1 << LayerMask.NameToLayer("Wall"));
            int ALL = rts.Length;
            for (int i = 0; i < ALL; i++)
            {
                /////  xuqi.Log("hitInfo.collider.name:" + "  " + i + "  " + rts[i].collider.name);
                GameObject go = rts[i].collider.gameObject;//获取该物体
                                                           //  xuqi.Log("扫到    go:" + go.name);
                if (go.GetComponent<MeshRenderer>() == null && go.GetComponent<SkinnedMeshRenderer>() == null)
                {// xuqi.Log("没找到" + go.name);
                    continue;
                }
                else
                {

                    //   xuqi.Log("找到mesh:"+go.name);
                    bool b;
                    // AllHide.TryGetValue(go, out b);
                    if (!AllHide.ContainsKey(go))
                    {
                        //  xuqi.Log("添加  词典  表示需要隐藏的物品");
                        AllHide.Add(go, true);//添加所有的
                    }
                    else
                    {
                        //   xuqi.Log("词典修改值为true");
                        // AllHide.TryGetValue(go, out b);//此路不通
                        //   b = true;
                        AllHide[go] = true;
                    }
                }
                Material[] mts;//nowmts多余 shit
                if (go.GetComponent<MeshRenderer>() != null)
                {
                    mts = go.GetComponent<MeshRenderer>().materials;
                }
                else mts = go.GetComponent<SkinnedMeshRenderer>().materials;

                Material[] nowmts = new Material[mts.Length];
                // if(mts.le)
                if (!AllMat.ContainsKey(go.name))
                    AllMat.Add(go.name, mts);//加入材质词典
                                             //    var nowmts = go.GetComponent<MeshRenderer>().materials;
                for (int j = 0; j < mts.Length; j++)
                {
                    Texture temp = mts[j].mainTexture;//主材质
                    if (temp == null) continue;
                    transparent = new Material(Transparent);//创建新材质
                    transparent.mainTexture = temp;//更换材质
                    nowmts[j] = transparent;//更换材质求
                                            // xuqi.Log("j:" + j + "  更换材质球 :" + transparent.name + "贴图名称:" + temp.name);
                }
                //   go.GetComponent<Renderer>().materials = nowmts;

                if (go.GetComponent<MeshRenderer>() != null)
                {
                    go.GetComponent<MeshRenderer>().materials = nowmts;
                }
                else go.GetComponent<SkinnedMeshRenderer>().materials = nowmts;
            }
            #region 废除  射线怎么画来着
            //  重点在   out RaycastHit hitInfo
            //   hehe();
            //   xuqi.Log("hitInfo.collider.name:" + hitInfo.collider.name);//
            // 在场景视图中绘制射线  
            //Debug.DrawLine(hitInfo., hitInfo.point, Color.red);
            #endregion
            // isGround = true;
        }
        else
        {
            // isGround = false;
        }
        RecoverMt();//

    }
    void RecoverMt()
    {
        //xuqi.Log("恢复所有替换shader的");
        //没有任何视线阻挡我们才切换回来材质
        int all = AllHide.Count;//所有的隐藏的需要回复回来的
                                // xuqi.Log("需要恢复个数:" + all);
        if (all == 0) return;//表示没有需要回复的
        foreach (var a in AllHide)
        {
            // xuqi.Log(" 现在AllHide辞典中  key:" + a.Key + "   value: " + a.Value);
            if (a.Value == false)//我们要恢复false并且删除该词典
            {
                Material[] mts;
                GameObject go = a.Key;
                //  xuqi.Log("恢复的对象名称为:" + goTemp.name);
                AllMat.TryGetValue(go.name, out mts);//查找出来材质
                if (mts.Length == 0)
                {
                    xuqi.Log("一个材质都没有????");
                }


                //   goTemp.GetComponent<Renderer>().materials = mts;//回到最初             //去掉Mesh  

                if (go.GetComponent<MeshRenderer>() != null)
                {
                    //   xuqi.Log("确定替换回去1");
                    go.GetComponent<MeshRenderer>().materials = mts;
                }
                else
                {
                    go.GetComponent<SkinnedMeshRenderer>().materials = mts;
                    //   xuqi.Log("mtsmts mtsmts:"+ mts[0].name);
                    // xuqi.Log("确定替换回去2");
                }
            }
            //else
            //    continue;

            //   AllHide.Remove(a.Key);//删除了该词典
        }

    }
    void hehe()
    {
        //RaycastHit[] rts = Physics.RaycastAll(this.transform.position, dir, 200.0f, 1 << LayerMask.NameToLayer("Wall");

    }
}

猜你喜欢

转载自blog.csdn.net/qq_22012149/article/details/79050556