<td id="mukkm"><td id="mukkm"></td></td>
  • <nav id="mukkm"></nav>
  • <nav id="mukkm"></nav>
     找回密碼
     注冊帳號

    掃一掃,訪問微社區

    Like Game視圖選擇Scene物體

    10
    回復
    5812
    查看
    打印 上一主題 下一主題
    [ 復制鏈接 ]
    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

    UID
    354297
    好友
    0
    蠻牛幣
    477
    威望
    0
    注冊時間
    2020-11-3
    在線時間
    1126 小時
    最后登錄
    2022-8-17

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

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

    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, 下載次數: 10, 售價: 10 蠻牛幣)











    回復

    使用道具 舉報

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

    3

    主題

    85

    帖子

    1817

    積分

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

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

    使用道具 舉報

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

    0

    主題

    9528

    帖子

    1萬

    積分

    Rank: 9Rank: 9Rank: 9

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

    使用道具 舉報

    4四處流浪
    303/500

    0

    主題

    49

    帖子

    303

    積分

    Rank: 4

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

    使用道具 舉報

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

    5

    主題

    272

    帖子

    3300

    積分

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

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

    有點意思
    回復

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

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

    使用道具 舉報

    7日久生情
    3311/5000
    排名
    12880
    昨日變化

    4

    主題

    322

    帖子

    3311

    積分

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

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

    使用道具 舉報

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

    0

    主題

    104

    帖子

    740

    積分

    Rank: 5Rank: 5

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

    使用道具 舉報

    0

    主題

    11

    帖子

    12

    積分

    Rank: 1

    UID
    360346
    好友
    0
    蠻牛幣
    3
    威望
    0
    注冊時間
    2021-11-1
    在線時間
    2 小時
    最后登錄
    2021-11-9
    9#
    2021-11-2 14:18:53 只看該作者
    henbucuo youxiangfa
    回復 支持 反對

    使用道具 舉報

    7日久生情
    2379/5000
    排名
    3437
    昨日變化

    0

    主題

    114

    帖子

    2379

    積分

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

    UID
    266946
    好友
    0
    蠻牛幣
    1083
    威望
    0
    注冊時間
    2018-1-30
    在線時間
    1831 小時
    最后登錄
    2022-4-6
    10#
    2021-11-22 14:11:45 只看該作者
    沒啥用 感覺
    回復

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

    UID
    354297
    好友
    0
    蠻牛幣
    477
    威望
    0
    注冊時間
    2020-11-3
    在線時間
    1126 小時
    最后登錄
    2022-8-17
    11#
    樓主 2021-12-2 09:50:38 只看該作者

    作用是用來從game視圖去選中目標,看它的inspect面板,比如你玩fps游戲刷怪你就方便看被你打中的怪物屬性了
    回復 支持 反對

    使用道具 舉報

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

    本版積分規則

    關注游戲蠻牛公眾號送vip
    免费一级AA片毛片在线播放
    <td id="mukkm"><td id="mukkm"></td></td>
  • <nav id="mukkm"></nav>
  • <nav id="mukkm"></nav>