(預計繪製出來的效果)
那就讓我們開始吧,先從笛卡爾座標(方形)的部分看。
先前的程式碼是繼承自
EditorWindow,而這個類別主要是用來繪製視窗中的元素(如變數的欄位),如果要能夠像之前的Gizmo或Handles一樣直接繪製在遊戲場景中的話,我們就會需要向
SceneView註冊事件(有點像是要場景顯示器在每次更新的時候來通知你,而你會依照場景顯示器給的資訊來做動作)。
注意:記得要在關閉(OnDisable/Destroy)時去撤銷原本註冊的事件,否則你之後會很難再去處理該事件 (雖然整個程式關閉就沒了)
注意2:我這邊是寫onSceneGUIDelegate,但是如果你用的Unity2019的版本的話,它現在已經改成了
DuringSceneGui。
(記得這裡事件的函式要帶入規定的參數)
說完基本的部分後就來看怎麼繪製網格吧。
(這邊特別加了一行Handles.zTest...,這一段是設定說Handles要繪製的東西符合某條件的時候才去繪製,而zTest則是深度檢測,離鏡頭越近的東西數值越小,越遠則越大)
這邊先為了方便,我們就只先繪製出原點(座標0,0,0)周遭各延伸距離16的網格,讓我們看一下編輯器那邊的效果。
讀者:等等,這張截圖……
好啦XD讓我再重新弄一張圖。
這時候你可能會想問說要怎樣繪製出類似Unity編輯器預設的全圖網格?
這個嘛,最簡單的方式就是直接把剛才繪製的範圍寫到很大,但是那樣子對電腦負擔會比較重(應該啦),畢竟你會要求Handles去繪製一堆不在畫面內東西,而要比較嚴格限制繪製範圍在視線中的方法有些繁瑣,我就先留到後面再提,這裡我們先接著看極座標的部分。
極座標的位置校正
這裡我打算回去改寫先前的SnapSelections函式。
(我必須承認這一段跟開發者工具已經有點沒有關係了XD只是單純的在算數學)
這邊讓我們改成自己去取出所有選取的遊戲物件並一一校正,未必需要這麼做,只是極座標的校正點算起來比較繁雜,所以我想說拆開來比較好,接著讓我們接著看到GetSnappedPos的部分。
(極座標的校正點取得法)
(極座標的網格繪製方法)
寫完功能後記得前面那裡要去呼叫
(具體效果)
如何繪製全圖的網格?
這部分有點麻煩,而且寫完後會覺得有點沒必要QwQ (<-而且拉遠的時候看起來超亂
首先我先去寫了另一種笛卡爾座標的網格繪製函式
接著我們要想辦法去取得這個範圍 (最大和最小的XY值),為此我們會需要用到投影的方法
試著去算出Camera的邊角看向平面(y=0)時會形成的範圍,為此我們前面呼叫時會需要宣告一個邏輯上的平面。
接著再去計算Camera的每個角落看出去的向量(這裡用Ray來算)
(下面三個基本上都是一樣的邏輯,所以我就先合起來了)
利用Plane.Raycast的方式檢測說射線會不會跟它有所交集,有的話就將交集點拿去計算說是否為該範圍內的最大或最小值。
(用來取向量中最大或最小的函式)
寫完後應該就能看到先前的效果
好啦,那這次的筆記分享就先寫到這裡了,什麼? 你問我要怎麼繪製極座標的全圖網格呢?
恩……我還沒想到XD,不過我應該暫時沒有要繼續研究那一部分,之後有想法的話我再寫寫看吧,希望各位喜歡這次的筆記分享!