前言
在部分場景搭建中需要整齊擺放一些物品(如倉庫中的貨堆、貨架等),因為有交互的操作在單個模型上,每次總是手動拖動模型操作起來也是繁瑣和勞累。
在這背景下,我編寫了一個在運行或者編輯狀態(tài)下都可以進行一鍵排序模型的腳步。方便在場景搭建時,可以快速搭建這種有規(guī)律的模型;在運行時有模型排序功能需求時,能調用接口一鍵排序。
效果
X軸居中排序:
X軸左對齊排序:
XY軸左排序:
XY軸居中排序:
xyz軸居中排序:
多重嵌套排序:
多重嵌套YZ軸排序:
實現(xiàn)
功能的設計是在腳步的Inspector上進行排序相關的參數(shù)設置,并提供一鍵排序的按鈕。點擊后子節(jié)點按配置要求進行位置修改。
配置內容
首先是排序的對齊方式(alignment),這里提供如下枚舉:
public enum RankAlign {
Center =1,
Left =2,
Right = 3
}
Center為居中的方式,Left是以父節(jié)點的位置為左側(這里不是嚴格意義上的左,而是從坐標軸的0–正軸方向排序),Right與Left相反。
其它配置,主要就是三個軸系中的配置內容:
[Header("x軸對齊方式")]
public RankAlign rankXAlign = RankAlign.Center;
[Header("y軸對齊方式")]
public RankAlign rankYAlign = RankAlign.Center;
[Header("z軸對齊方式")]
public RankAlign rankZAlign = RankAlign.Center;
[Header("啟用x軸排序)")]
public bool isXAxis;
[Header("啟用y軸排序)")]
public bool isYAxis;
[Header("啟用z軸排序)")]
public bool isZAxis;
[Header("x軸間距)")]
public float XDis;
[Header("y軸間距)")]
public float YDis;
[Header("z軸間距)")]
public float ZDis;
[Header("x軸默認值)")]
public float XDef;
[Header("y軸默認值)")]
public float YDef;
[Header("z軸默認值)")]
public float ZDef;
其中 isXAxis、isYAxis和isZAxis是啟用對應軸上排序的開關。
完整的配置如圖:
排序邏輯
再者就是排序處理:
public void RankingChildren() {
int total = transform.childCount;
if (isXAxis)
XMidIdx = GetMiddleIndex(total, rankXAlign);
if (isYAxis)
YMidIdx = GetMiddleIndex(total, rankYAlign);
if (isZAxis)
ZMidIdx = GetMiddleIndex(total, rankZAlign);
for (int i = 0; i < total; i++)
SetRankPos(transform.GetChild(i), i, total);
}
這里的處理就是根據(jù)各個軸排序對齊方式找到中間點,根據(jù)這個軸向上的中間點和節(jié)點間距計算出對應軸上的位置,如果不啟用排序的則使用對應軸的默認值。
編輯器拓展
因為要使用編輯器的類Editor,所以要新建一個Editor文件夾放入編輯器拓展的腳本,或者在腳步中判斷是否為編輯器環(huán)境。否則無法打包。這里在Editor文件夾下新建一個ModelRankingEditor腳本:
[CustomEditor(typeof(ModelRanking))]
public class ModelRankingEditor : Editor
{
// Start is called before the first frame update
void Start()
{
}
public override void OnInspectorGUI()
{
DrawDefaultInspector();
ModelRanking modelRanking = (ModelRanking)target;
if (GUILayout.Button("排序節(jié)點", new GUILayoutOption[] { GUILayout.ExpandWidth(false) }))
{
modelRanking.RankingChildren();
}
}
}
其處理方式就是重寫OnInspectorGUI函數(shù),繪制一個排序節(jié)點的按鈕,按鈕事件綁定RankingChildren() 函數(shù)。 還有一點要在編輯器未運行下可執(zhí)行排序,腳本上需要加上
[ExecuteInEditMode]。
測試場景
測試場景可以隨意搭建一下,基于SampleScene新建一個空節(jié)點,新增幾個Cube節(jié)點作為子節(jié)點:
在排序節(jié)點上添加上排序腳本,進行簡單的配置后,點擊排序節(jié)點按鈕即可:文章來源:http://www.zghlxwxcb.cn/news/detail-799251.html
如果需要,在程序運行中進行排序,可以使用AddComponent()來添加組件,
添加后對其配置屬性進行簡單設置,以上步驟也可以預先添加設置好;然后調用==modelRanking.RankingChildren();==函數(shù)進行排序即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-799251.html
到了這里,關于Unity3d C#實現(xiàn)場景編輯/運行模式下3D模型XYZ軸混合一鍵排序功能(含源碼工程)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!