Моя ошибка в том, что я передаю индиз по ссылке, а не по значению стенограммам.
Поэтому, когда я изменяю значения в основном сценарии, они меняются в каждом сценарии стены.
Поэтому, когда я позже вызываю публичные функции стены, все они используют одни и те же индексы, последние, которые я инициализировал, и, следовательно, в первую очередь не подвержены моей «инициализации».
В противном случае, если я изменяю значения indizes до вызова функции wall, он снова работает, потому что скрипт теперь использует правильные соответствующие значения, поэтому для исправления мне нужно передать indize по одному для значения, чтобы они все инициализируется для реального с соответствующим значением.
Спасибо, выйдите на https://catlikecoding.com/unity/tutorials/
за то, что посмотрел на эту действительно глупую ошибку и сказал мне, что никто здесь не мог. По крайней мере, он не пытался исправить мой код за медлительность.
Итак, это мой новый сегмент кода, который работает, но неэффективно, и все же он делает именно то, что я хотел:
Для лучшей читабельности я не пишу весь код, который работал снова. Он помечен (...) и остается неизменным
public class WallCreation : MonoBehaviour {
(...) //stays the same as in the working code
void Start () {
indizes= new int[3];
}
public void newWallScript(){
initializeNewWall ("zWall++");
StartCoroutine (waitForMovement ());
StartCoroutine (waitForMoving()); //the new coroutine with a later start is added
}
void initializeNewWall(string replaceWall)
{
(...) //stays the same
}
void newWallMovement()
{
for (int x = 1; x < oldWallsizeX-1; x++)
{
indizes [0] = x;
for (int y = 0; y < oldWallsizeY; y++)
{
indizes [1] = y;
for (int z = 0; z < oldWallsizeZ; z++) {
indizes[2] = z;
newWall = wallSegments[x,y,z];
GameObject _wallSegment = newWall.gameObject;
WallMovement _WallMovement = _wallSegment.GetComponent<WallMovement> ();
//_WallMovement.indizes = indizes; //this is a 'passing by reference', because it is an array
_WallMovement.indizes[0] = indizes[0]; //these pass the parameter by value, you could also just say _WallMovement.indizes[0] = x; etc.
_WallMovement.indizes[1] = indizes[1];
_WallMovement.indizes[2] = indizes[2];
//this is cut out and put into the wallMoving() void
//_WallMovement.initializeMovement ();
}
}
}
}
void wallMoving(){
for (int x = 1; x < oldWallsizeX-1; x++)
{
for (int y = 0; y < oldWallsizeY; y++)
{
for (int z = 0; z < oldWallsizeZ; z++) {
newWall = wallSegments[x,y,z];
GameObject _wallSegment = newWall.gameObject;
WallMovement _WallMovement = _wallSegment.GetComponent<WallMovement> ();
_WallMovement.initializeMovement ();
}
}
}
}
IEnumerator waitForMovement()
{
(...) //stays the same
}
IEnumerator waitForMoving()
{
//the time to wait has no consequence on performance whatsoever
yield return new WaitForSeconds(1f);
wallMoving();
}
}
Вот дополнительный код из моего скрипта:
Вот что сейчас происходит в скрипте WallMovement, который прикреплен к каждому кубу стены:
public class WallMovement : MonoBehaviour {
public int[] indizes ;
int indize;
int modulo;
void Awake (){
indizes = new int[3]; // this is added, because we dont pass the list, but the single values, so it needs to be declared as a 3-dimensional array inbefore
}
public void initializeMovement()
{
modulo = indizes [0] % 2;
if (modulo>0)
{
//do something
}
else
{
// do something else
}
}
}