<address id="fblfv"><form id="fblfv"></form></address>

    <noframes id="fblfv"><address id="fblfv"><nobr id="fblfv"></nobr></address>
    <span id="fblfv"></span>

         找回密碼
         注冊帳號

        掃一掃,訪問微社區

        Like Game視圖選擇Scene物體

        7
        回復
        4100
        查看
        打印 上一主題 下一主題
        [ 復制鏈接 ]
        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18

        馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

        您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

        x
        【前言】

        之前做很多項目的時候,在畫面中突然出現的物體想要去選取調試,基本上都只能在scene去找,或者直接選擇相機物體,在相機視野里雙擊物體查找,知道最近,在做一個項目時需要選擇視野里的地磚查看視圖,就想了卻一下多年的心愿,寫了這個插件。


        配圖:game視圖選取地磚


        【思路分析】

        由于是Game視圖選擇物體,所以Game視圖一般有兩種選取方式:
        一、使用射線檢測碰撞體,也就意味著場景的物體身上必須有合適的碰撞體,然后根據檢測信息知道物體選擇物體。
        二、UGUI有事件系統可以知道鼠標是否在UI上,這個接口或者EventTrigger需要勾選RaycastTarget,所以就猜想是否是射線檢測,為此也寫射線調試了下勾選了RaycastTarget的UI,好像是行不通,又或者是UI底層的射線和我們平時用的射線有所區別,由于UI沒碰撞體的,所以可能是由屏幕位置來知道是否在UI上吧,反正我沒看過UGUI源碼不得而知。

        綜上所述,我們選擇了第一種方式實現,這樣的話索要選擇的物體必須加碰撞體,如果場景中加碰撞體麻煩,建議在預制體加比較快。




        【進入開發環節】

        在開發過程中,我發現暫停后Update等生命周期函數會停止,于是乎我意識到,假設一個怪物在Game視圖中突然出現很快消失,那么很不利于選擇到該怪物,所以只能暫停停止生命周期,選擇怪物,于是我舍棄了Update,改用了EditorApplication.update來替代Update相關功能,在暫停模式,這個方法便代替了Update執行動態選取。

        1.Start方法生成Sphere(代替鼠標方便查看),再生成一個Sphere用于顯示高亮效果,然后最最最重要的一點就是注冊EditorApplication.update事件

        private void Start()
        {
        print(\"Start\");
        // 鼠標的屏幕坐標轉成世界坐標的點
        mousePoint = GameObject.CreatePrimitive(PrimitiveType.Sphere).GetComponent<Transform>();//創建一個Sphere物體
        DestroyImmediate(mousePoint.GetComponent<Collider>());//去除掉碰撞體
        mousePoint.localScale = Vector3.one * 0.1f;//設置尺寸

        // 用于邊緣效果展示的物體
        highLightObj = GameObject.CreatePrimitive(PrimitiveType.Sphere).GetComponent<Transform>(); print(\"highLightObj=\" + highLightObj);//創建一個Sphere用于選中邊緣描邊
        DestroyImmediate(highLightObj.GetComponent<Collider>());//同樣去掉碰撞體
        highLightObj.GetComponent<MeshRenderer>().material = Resources.Load<Material>(\"MT_Silhouette\");//更換成邊緣描邊材質球
        highLightObj.gameObject.SetActive(false);//初始化關閉描邊的物體
        EditorApplication.update += Update0;//注冊EditorApplication.update事件
        }

        2.Update0里面動態做射線檢測,用于比對前后幀的物體來更換材質球,來顯示到描邊效果,最后在鼠標左鍵單擊,來定位到選擇的物體上。


        void Update0()
        {
        print(\"update\");
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit raycastHit = new RaycastHit();
        if (Physics.Raycast(ray out raycastHit))
        {
        //print(!nowObj);
        if (!nowObj || nowObj.name != raycastHit.transform.name)//把上次檢測到的物體和新檢測的raycastHit的物體名比對,如果不是上一次的物體進入邏輯
        {
        if (nowObj)
        {
        // 換回原來的材質
        nowObj.GetComponent<MeshRenderer>().material = oldMaterial;
        }
        // 射線當前檢測到的物體
        nowObj = raycastHit.transform.gameObject;
        // 更換材質球
        oldMaterial = raycastHit.transform.GetComponent<MeshRenderer>().sharedMaterial;
        nowObj.GetComponent<MeshRenderer>().material = Resources.Load<Material>(\"MT_HighLingh\");
        // 顯示選中效果
        highLightObj.position = raycastHit.transform.position;
        highLightObj.rotation = raycastHit.transform.rotation;
        highLightObj.localScale = raycastHit.transform.localScale;
        highLightObj.GetComponent<MeshFilter>().mesh = raycastHit.collider.GetComponent<MeshFilter>().sharedMesh;
        highLightObj.gameObject.SetActive(true);
        print(nowObj);
        }
        if (Input.GetMouseButtonDown(0))
        {
        if (nowObj != null)//如果選取的對象存在,那么在scene視圖定位到該物體
        {
        Selection.activeGameObject = nowObj;
        SceneView.lastActiveSceneView.FrameSelected();
        }
        }
        }
        else
        {
        //print(\"射線未射到\");
        if (highLightObj.gameObject.activeSelf)
        {
        //print(\"highLightObj處于激活\");
        // 隱藏選中效果
        highLightObj.gameObject.SetActive(false);
        // 換回原來的材質
        nowObj.GetComponent<MeshRenderer>().material = oldMaterial;
        // 置空射線檢測到的物體
        nowObj = null;
        }
        }
        Debug.DrawRay(Camera.main.transform.position GetMousePositionOnWorld() - Camera.main.transform.position Color.red);//將射線繪制出來,方便查看
        mousePoint.position = GetMousePositionOnWorld();//將鼠標的屏幕坐標轉換成世界坐標
        }


        【最后想說】

        底下有源碼資源包,起初,我想過沒有運行前也能從Game視圖選擇物體,雖然EditorApplication.update支持刷新,但是射線的相關功能好像在主線程中才能使用(運行unity后),所以沒有運行選取沒有想到更好的解決方案,如果有更好的意見,可以留言我,評論我都會一一查看的。


        案例源碼:
        碼云下載Game視圖選擇物體unitypackage.txt (49 Bytes, 下載次數: 9, 售價: 10 蠻牛幣)











        回復

        使用道具 舉報

        7日久生情
        1678/5000
        排名
        2120
        昨日變化

        3

        主題

        82

        帖子

        1678

        積分

        Rank: 7Rank: 7Rank: 7Rank: 7

        UID
        9302
        好友
        1
        蠻牛幣
        5681
        威望
        0
        注冊時間
        2013-12-1
        在線時間
        941 小時
        最后登錄
        2021-9-15
        沙發
        2021-1-23 11:40:14 只看該作者
        有點意思
        回復

        使用道具 舉報

        9以壇為家
        12454/50000
        排名
        1656
        昨日變化

        0

        主題

        8347

        帖子

        1萬

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        185339
        好友
        1
        蠻牛幣
        59
        威望
        0
        注冊時間
        2016-11-20
        在線時間
        3327 小時
        最后登錄
        2021-9-15
        板凳
        2021-1-26 09:11:41 只看該作者
        {:107:}{:107:}
        回復

        使用道具 舉報

        4四處流浪
        302/500

        0

        主題

        49

        帖子

        302

        積分

        Rank: 4

        UID
        349739
        好友
        0
        蠻牛幣
        125
        威望
        0
        注冊時間
        2020-7-2
        在線時間
        253 小時
        最后登錄
        2021-8-19
        地板
        2021-3-6 21:55:51 只看該作者
        有點意思
        回復

        使用道具 舉報

        7日久生情
        2946/5000
        排名
        4262
        昨日變化

        5

        主題

        243

        帖子

        2946

        積分

        Rank: 7Rank: 7Rank: 7Rank: 7

        UID
        122909
        好友
        1
        蠻牛幣
        7
        威望
        0
        注冊時間
        2015-9-17
        在線時間
        2443 小時
        最后登錄
        2021-9-15
        5#
        2021-3-10 15:23:51 只看該作者

        有點意思
        回復

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        6#
        樓主 2021-3-12 09:55:57 只看該作者
        案例中Game選擇物體Scene視圖定位,有點類似于Scene視圖雙擊物體定位一樣,除此之外,還做了選擇的物體描邊,還有一些編輯器功能
        回復 支持 反對

        使用道具 舉報

        7日久生情
        2056/5000
        排名
        12879
        昨日變化

        4

        主題

        319

        帖子

        2056

        積分

        Rank: 7Rank: 7Rank: 7Rank: 7

        UID
        256916
        好友
        0
        蠻牛幣
        1586
        威望
        0
        注冊時間
        2017-11-29
        在線時間
        1663 小時
        最后登錄
        2021-9-15
        7#
        2021-3-12 10:54:20 只看該作者
        很實用的功能
        回復

        使用道具 舉報

        5熟悉之中
        716/1000
        排名
        9773
        昨日變化

        0

        主題

        102

        帖子

        716

        積分

        Rank: 5Rank: 5

        UID
        29289
        好友
        0
        蠻牛幣
        16
        威望
        0
        注冊時間
        2014-6-11
        在線時間
        500 小時
        最后登錄
        2021-6-20
        8#
        2021-3-27 13:01:18 只看該作者
        好教程!學習了
        回復

        使用道具 舉報

        您需要登錄后才可以回帖 登錄 | 注冊帳號

        本版積分規則

        關注游戲蠻牛公眾號送vip
        欧美野性肉体狂欢大派对