Unity 组件的排序问题

来源:互联网 发布:业务下单网站源码 编辑:程序博客网 时间:2024/05/16 09:35

好久不写博客,今天来一篇。
记得NGUI里的UIGrid和UITable用起来很不错,但是不用插件时就要这两个脚本,由于NGUI的耦合型比较高,不怎么容易提取出这两个脚本。

所以就自己琢磨写了一个简单的。刚好应用了以下最近学的编辑器。


首先排序的核心就是计算transform的位置,另外要使它可以实时排序。


主要写了两个脚本:

首先是排序方法脚本GridTransform.cs

<pre name="code" class="csharp">using UnityEngine;using System.Collections;public class GridTransform : MonoBehaviour {//排序的列数public int column=1;//间距的宽和高public float space_w;public float space_h;//组件对象的宽和高public float width;public float Height;//排序对象的数目public int itemNumber;//字段封装实时排序public bool repositionNow{set{_repositionNow=value;if(value){Sort();_repositionNow=false;}}get{return _repositionNow;}}[HideInInspector]public bool _repositionNow;//排序方法void Sort(){itemNumber = transform.childCount;;for(int i=0;i<itemNumber;i++){transform.GetChild(i).localPosition=new Vector3((width+space_w)*((i)%(column)),-((i)/column)*(Height+space_h),0);}}}


然后是编辑器的封装:

using UnityEngine;using System.Collections;using UnityEditor;[CustomEditor(typeof(GridTransform))]public class GridEditor : Editor {public override void OnInspectorGUI (){base.OnInspectorGUI ();GridTransform g=target as GridTransform;g.repositionNow=EditorGUILayout.BeginToggleGroup("resert",g.repositionNow);EditorGUILayout.EndToggleGroup();}}

最终的属性面板如图所示:


每点击一次resert就排序一次,点击完自动为false


下面我们举个列子,在场景中建一个空物体和几个立方体子物体,空物体挂上Grid Transform脚本,如下图所示:



这样就可以排序了,组件可以是任意形式的对象,虽然Unity自带了GridLayoutGroup但是只适用于自带的ui层,自己写的组件或者三维层都不适用。

0 0
原创粉丝点击