如何创建隐藏列表实例,例如Unity3D中的转换

时间:2014-09-14 23:57:09

标签: c# list unity3d instance-variables

Unity为每个GameObject都有Transform

Unity允许您这样做:

foreach(Transform t in transform)
   t.name;

这段代码可让您遍历嵌套在对象transform下的子变换列表。因此,在这种情况下,transform的行为类似于列表。

同时,所有GameObjects都有这个transform变量,让你可以像任何普通的实例变量那样做:

Vector3 pos = transform.position;
Quaternion rot = transform.rotation;

我如何为自己的课程创建类似的东西?也就是说,有能力表现为列表以及普通实例变量的东西?


对我来说,这是一些巫术。如果我想要相同的功能,我需要这样做:

public class MyTransform
{
   private MyTransform [] list;
   private Vector3 position;
} 

public class MyGameObject 
{
    protected MyTransform transform = new MyTransform();

    void Start()
    {
       transform.list[i] = obj;
       transform.position = new Vector3(0,0,0);
    }
}

2 个答案:

答案 0 :(得分:0)

在您的班级中实施IEnumerator / IEnumerable。

实际上,您可以创建一个私有列表并使用IEnumerator

公开它
public class SomeObject : IEnumerable<SomeObject>
{  
    private List<SomeObject> myList = new List<SomeObject>();

    public IEnumerable<SomeObject>(){
        return myList.GetEnumerator();
    }
}

答案 1 :(得分:0)

你可以implement IEnumerable<T>使它遍历子树......

class Transform : IEnumerable<Transform>
{
    private IList<Transform> childTransforms;
    public IEnumerator<Transform> GetEnumerator()
    {
        //change to Queue<T> and use Enqueue/Dequeue instead of
        //Push/Pop for breadth-first traversal
        Stack<Transform> stk=new Stack<Transform>();
        stk.Push(this); //or items in childTransforms if 'this' isn't needed
        while(stk.Any())
        {
            var v = stk.Pop();
            yield v;
            if(v.childTransforms == null) continue;
            foreach(var child in v.childTransforms)
            {
                stk.Push(child);
            }
        }
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

}