尝试在Unity Monodevelop环境中使用Array.Copy,特别是我要做的是将数组的第一个插槽中的值移动到holder变量中,然后将数组中的每个值向前移动一个插槽,然后将值从holder变量移回到最后一个槽中的Array。我的相关代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class TurnController : MonoBehaviour {
//Array will hold all units (Being that they all have the EidolonClass script attached), then will be sorted by Speed, descending
private EidolonClass[] AllUnitArray;
...
void Awake(){
//Find anything with the EidolonClass and then add it to the Array
AllUnitArray = FindObjectsOfType (typeof(EidolonClass)) as EidolonClass[];
//Sort the array by speed, descending (Highest speed listed first)
Array.Sort (AllUnitArray, delegate(EidolonClass one, EidolonClass two) {
return two.Speed.CompareTo(one.Speed);
});
}
void pushArray(){
EidolonClass store = AllUnitArray [0];
for(int i=1;i<=AllUnitArray.Length;i++){
Array.Copy (AllUnitArray, i, AllUnitArray, i-1, AllUnitArray.Length-1);
}
AllUnitArray [AllUnitArray.Length] = store;
for(int i=0;i<=AllUnitArray.Length;i++) {
Debug.Log (AllUnitArray[i].name.ToString ());
}
}
void Update () {
if (Input.GetKeyDown (KeyCode.K)) {
pushArray ();
}
}
此代码在Monodevelop中编译,但是当我尝试运行脚本的这一部分时,它会返回以下错误:
ArgumentException:length
System.Array.Copy(System.Array sourceArray,Int32 sourceIndex,System.Array destinationArray,Int32 destinationIndex,Int32 length)(at / Users / builduser / buildslave / mono / build / mcs / class / corlib / System / Array的.cs:971) TurnController.pushArray()(在Assets / Scripts / Battle Scripts / TurnController.cs:54) TurnController.Update()(在Assets / Scripts / Battle Scripts / TurnController.cs:37)
答案 0 :(得分:1)
您的异常发生是因为您尝试多次复制相同的长度,但每次都有新的起始偏移。要移动数组的内容,只需调用Array.Copy()
即可。
这样的事情:
void pushArray(){
EidolonClass store = AllUnitArray [0];
Array.Copy (AllUnitArray, 1, AllUnitArray, 0, AllUnitArray.Length - 1);
AllUnitArray[AllUnitArray.Length - 1] = store;
for(int i=0;i<=AllUnitArray.Length;i++) {
Debug.Log (AllUnitArray[i].name.ToString ());
}
}
也就是说,如果你希望能够转移&#34;那么数组似乎不是最好的数据结构。内容。如果您使用的是Queue<EidolonClass>
对象,那么您可以Dequeue()
第一个元素,然后Enqueue()
使用相同的元素将其放在列表的后面。
就个人而言,我也不会为此烦恼。不要试图改变你的数据,只需保持一个索引,即哪个元素是最新的。增加索引以移动到下一个元素。如果到达数组的末尾(即索引值等于AllUnitArray.Length
),则将索引设置回0。
实际上,Queue<T>
类无论如何都在内部执行。因此,如果您喜欢Queue<T>
类的语义,那么它的实现方式是相同的。