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);
}
}
答案 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();
}
}