2013-11-01 46 views
0

我从列表中产生对象,所以我让他们找到已经存在于场景中的父对象。问题是Random.Range( )不像我想要的那样工作。我希望列出的对象产生到一个随机的父对象,相反,他们产生到它们是相对于列表顺序的父对象。Unity3d:Random.Range()不按我想要的方式工作

Ex。 0,1,2,3,4,5,6,7,8,9 = Bad Ex。 8,3,1,4,6,3,7,9,5,2 =好 笑

var theRange = Random.Range(obj1.Length,obj1.Length); 
    for(var i: int = 0; i < theRange; i++){ 
     var obj2 : GameObject = obj1[i]; 
     if(obj2.transform.childCount == 0){ 
     objfromList.transform.parent = obj2.transform; 
     objfromList.transform.localPosition = Vector3(0,-2,0); 
    } 
    } 

深表感谢

+0

如果'obj1.length'是10,那么你的语句Random.Range(obj1.Length,obj1.Length);'读取'Random.Range(10,10);'所以它不会返回任何东西,除了10此外Random.Range不保证你不会看到重复。 – Jerdak

+0

你说得对,我确实将它改为Random.Range(0,obj1.Length);而且它们产生的方式没有区别。另外我检查了子女数是否为0.他们也只有十个父母和十个孩子,所以复制完全被杀死。谢谢Jerdak – n900orbit

回答

1

对我的评论跟进,这听起来像你只是想要一个洗牌功能。下面是一个简单Fisher-Yates shuffle

void shuffle(int[] a){ 
    for(int i = a.Length-1; i>=0; i--){ 
     int j = Random.Range(0,i); 
     int tmp = a[i]; 
     a[i] = a[j]; 
     a[j] = tmp; 
    } 
} 

void usage(){ 
    int[] a = {0,1,2,3,4,5}; // assumes obj1.Length = 6 
    shuffle(a); 
    for(int i = 0; i < a.Length; i++){ 
     GameObject obj2 = obj1[a[i]]; 
     GameObject objFromList = GetNextObject(); // dummy method grabbing next list object 

     objFromList.transform.parent = obj2.transform; 
     objFromList.transform.localPosition = Vector3(0,-2,0); 
    } 
} 

这应该让你的一部分的方式,你需要什么。如果obj1的顺序不重要,则可以直接对其进行混洗,而不是在我的示例中使用像a这样的辅助数组。

+0

我会试试这个,让你知道这是否有帮助。 – n900orbit

+0

我刚试过,它给了我一个错误(对象引用未设置为对象的实例...)。这可能是因为我执行错了吗?在我把shuffle代码片段替换为(var obj2:GameObject = obj1 [i];)和(var obj2:GameObject = obj1 [tmp];)之后,哦,对不起,我之前没有说过什么,但是我是目前使用Unity脚本,但我没有任何问题转换。 – n900orbit

+0

这对我来说是使用C#的。我非常不喜欢'UnityScript',所以我避免了它。我不知道你设置了'tmp',但是我建议进行调试,以确保'tmp'的值在'[0,obj1.Length-1]'范围内。还要注意'objFromList'需要改变for循环的每一次迭代,否则它只会被设置为混洗数组的最后一个值。您可以随时用您的所有代码更新您的原始问题,这可能有助于了解已完成的工作。 – Jerdak

相关问题