unity快捷放置物體操作


最佳實踐系列文章將探討我們在與客戶合作時遇到的一些常見的問題。這些都是我們的合作團隊辛苦得出的經驗和教訓,我們很自豪能夠和大家分享他們的智慧。我們已經為大家分享過以下內容:
 
 
 
 
 
 
這其中的很多問題只有在真正制作主機游戲、手機游戲、或者處理巨量游戲內容時才會出現。如果能在開發早期就將這些問題考慮進去,那么開發過程就會更輕松,而游戲也會更炫酷。
 
將對象放置到理想位置
 
盡管擺放對象是在Unity中最為常見的任務之一,我們還是看到不少團隊為了如何能更好地完成這項工作而苦惱。要把對象排列完美,不讓角色跑出世界,不讓尋路出現障礙,並讓各個物理對象能夠放置在理想的位置,這的確不是件輕松的事。
 
 
 
Unity提供了一些工具來方便處理這個問題,這些工具各自扮演着不同的角色。尤其是在我們想要制作大量重復使用的內容,或是制作一張放置了大量動態物理對象的場景,了解這些工具的使用方法則尤為重要。
 
使用正確的輔助工具
 
Unity中提供了變換、旋轉和縮放工具,在Unity 2017.3中還加入了能同時擁有這三個功能的通用工具。這些小工具能在3D環境下修改游戲對象的變換屬性。除此之外,還有2D環境下處理對象的矩形變換工具(Rect Transform)。
 
所有這些輔助工具的運作方式都與其所處的工作模式直接相關。如果將模式設為中心(Center),輔助工具將使用根據對象邊界計算得出的對象中心點。這個計算結果是個近似值,所以在處理復雜對象時或許會感覺該中心點偏移了真正的中心點。
 
如果將輔助工具模式設為軸心(Pivot),輔助工具將使用對象自身引用框的原點(0,0,0)。這個軸心點是由創建該資源的作者在制作時設定的。通常需要將對象按照彼此相對的位置進行擺放時,我們推薦使用軸心模式,而且在制作資源時要留意軸心點的位置。
 
第二個切換按鈕,全局/局部(Global / Local)切換按鈕,確定了操作對象時所處的空間。設為全局(Global)意味着輔助工具將會對齊世界(x,y,z)坐標軸,而設為局部(Local)將會對齊對象自身的(x,y,z)坐標軸。通常我們需要在局部空間下處理對象。但如果我們想要讓多個對象互相對齊,則會切換到全局坐標系,並使用網格對齊工具來排列對象。
 
吸附對象
 
在Unity中,最為直接的定位工具是按下CTRL鍵(Windows系統)或是Command鍵(OSX系統)來吸附網格。在我們通過坐標軸手柄(也就是分別為藍、紅、綠的坐標軸輔助工具)來移動對象時,按下吸附鍵會讓對象根據當前網格大小計算的增量而移動,這個增量可以自行修改。
 
 
 
自動吸附設置(Snap Settings)菜單能為網格大小設置每個軸的數值,讓我們控制旋轉角度和縮放大小的吸附,還能將所選對象的當前變換屬性近似取其最近的網格線。
 
吸附所有坐標軸(Snap All Axes)按鈕在排列任意對象時十分有用。我們可以選擇一組對象,將它們在坐標軸上吸附到網格,然后重新定位,這樣就能把他們排列好了。效果如下圖所示:
 
 
 
這個方法在處理規則幾何體、大型關卡布局和設置碰撞塊時十分管用。如果我們需要處理更為復雜的放置情況,則需要下面這些工具。
 
頂點吸附
 
在使用變換工具時按住V,變換輔助工具會切換為頂點吸附模式,顯示為一個小方框。然后點擊所選對象網格上的一個頂點,將其拖到光標下的任意頂點上。在處理任意網格的對齊時,尤其是要處理那些復雜的或是不存在碰撞的網格對齊時,這個方法很實用。
 
 
 
在上圖中,不管是電線還是台燈都沒有緊湊的碰撞網格,而且它們也都不是規則的立方體,所以它們不能用網格吸附或碰撞吸附處理。
 
如果需要這樣放置多個游戲對象,我們也可以將頂點吸附模式保持在打開狀態。按下Ctrl+Shift+V打開,按下Ctrl+V關閉。這樣便不需要一直按住V就能頂點吸附多個對象了。
 
碰撞吸附
 
按下CTRL + SHIFT可以啟用碰撞吸附。啟用后,必須拖拽變換輔助工具中心的黃色小方框,而不是使用坐標軸控制工具。這樣會讓所選對象與光標下對象的碰撞體相對齊。
 
 
 
用頂點吸附或網格吸附來對齊網格在處理靜態幾何體時十分出色,但如果要處理動態對象,比如說互相穿透並在觸碰后發射到空中的對象時,應該吸附到碰撞體而不是可見網格。
 
碰撞安置
 
如果有大量動態物理對象,或是十分復雜的關節系統,利用碰撞吸附來放置對象也許就不太合適。幸運的是,現在Unity編輯器中可以運行PhysX。它能模擬幾秒的游戲時間,完成物理效果,然后保存完成時對象的位置信息。
 
 
 
下方是示例代碼,代碼中不僅有大量注釋,還包含了調試信息繪制和一個菜單項。只要將其放入項目中的任何一個Editor文件夾里,便能看到一個新的GameMenu->Settle Physics菜單項。
 
示例代碼:PhysicsSettler.cs
 
using UnityEngine; using UnityEditor; [InitializeOnLoad] class PhysicsSettler { static bool registered = false; static bool active = false; static Rigidbody[] workList; static bool cachedAutoSimulation; const float timeToSettle = 10f; static float activeTime = 0f; static PhysicsSettler() { if (!registered) { EditorApplication.update += Update; SceneView.onSceneGUIDelegate += OnSceneGUI; registered = true; } } [MenuItem("GameMenu/Settle Physics")] static void Activate() { if( !active ) { active = true; workList = Object.FindObjectsOfType<Rigidbody>(); cachedAutoSimulation = Physics.autoSimulation; activeTime = 0f; foreach( Rigidbody body in workList ) { body.WakeUp(); } } } [MenuItem("GameMenu/Settle Physics", true)] static bool checkMenu() { return !active; } static void Update() { if( active ) { activeTime += Time.deltaTime; Physics.autoSimulation = false; bool allSleeping = true; foreach( Rigidbody body in workList ) { if( body != null ) { allSleeping &= body.IsSleeping(); } } if( allSleeping || activeTime >= timeToSettle) { Physics.autoSimulation = cachedAutoSimulation; active = false; } else { Physics.Simulate(Time.deltaTime); } } } static void OnSceneGUI(SceneView sceneView) { if( active ) { Handles.BeginGUI(); Color cacheColor = GUI.color; GUI.color = Color.red; GUILayout.Label("Simulating Physics.", GUI.skin.box, GUILayout.Width(200)); GUILayout.Label(string.Format("Time Remaining: {0:F2}",(timeToSettle - activeTime)), GUI.skin.box, GUILayout.Width(200)); Handles.EndGUI(); foreach( Rigidbody body in workList ) { if( body != null ) { bool isSleeping = body.IsSleeping(); if( !isSleeping ) { GUI.color = Color.green; Handles.Label(body.transform.position, "SIMULATING"); } } } GUI.color = cacheColor; } } }
 
當了解了何時和為何使用網格、頂點吸附、碰撞吸附時,我們將在關卡設計工作流程獲得更好的開發體驗。推薦開發者們多多嘗試這些工具,例如:對比軸心(Pivot)和中心(Center)模式的區別,或是比較全局(Global)和局部(Local)模式的不同,這樣就可以知道什么模式更為適合。花費在布置虛擬對象的時間越少,那么在開發時得到的樂趣就越多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM