перешел в чат
я есть Объект, который заменяется тысячами маленьких кубиков одновременно, которые затем начинают двигаться один за другим после инициализации.
У меня есть код, который работает, но когда я пытаюсь изменить его, он перестает работать. Кубики не двигаются. Это происходит, когда я пытаюсь разделить инициализацию переменной и инициализацию движения.
Итак, это мой оригинальный фрагмент кода, и он работает:
public class WallCreation : MonoBehaviour {
public Transform wallSegmentPrefab;
GameObject oldWall;
Vector3 oldWallSize;
int oldWallsizeX;
int oldWallsizeY;
int oldWallsizeZ;
Vector3 oldWallPosition;
Vector3 oldWallCornerPosition;
Transform newWall;
Transform parentWallSegment;
Transform[ , , ] wallSegments;
int[] indizes;
void Start () {
indizes= new int[3];
}
public void newWallScript(){
initializeNewWall ("zWall++");
StartCoroutine (waitForMovement ());
}
void initializeNewWall(string replaceWall)
{
oldWall = GameObject.Find(replaceWall);
oldWallSize = oldWall.transform.localScale;
oldWallPosition = oldWall.transform.localPosition;
oldWallsizeX=(int) oldWallSize.x;
oldWallsizeY=(int) oldWallSize.y;
oldWallsizeZ=(int) oldWallSize.z;
oldWallCornerPosition = oldWallPosition - oldWallSize / 2 + wallSegmentPrefab.localScale / 2;
wallSegments = new Transform[oldWallsizeX , oldWallsizeY , oldWallsizeZ];
for (int x = 0; x < oldWallsizeX; x++)
{
for (int y = 0; y < oldWallsizeY; y++)
{
for (int z = 0; z < oldWallsizeZ; z++)
{
newWall = Instantiate(wallSegmentPrefab);
GameObject _wallSegment = newWall.gameObject;
_wallSegment.AddComponent<WallMovement> ();
wallSegments[x,y,z] = newWall;
}
}
}
oldWall.SetActive(false);
}
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;
_WallMovement.initializeMovement ();
}
}
}
}
IEnumerator waitForMovement()
{
yield return new WaitForSeconds(1f);
newWallMovement();
}
}
Это мой улучшенный код, который не работает и (...) остается прежним:
public class WallCreation : MonoBehaviour {
//(...)
public void newWallScript(){
//(...)
StartCoroutine (waitForMoving());
}
void initializeNewWall(string replaceWall)
{
(...)
}
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 cut out and put into the wallMoving() void
//_WallMovement.initializeMovement ();
}
}
}
}
void wallMoving(){
for (int x = 1; x < oldWallsizeX-1; x++)
{
//indizes [0] = x; //only with this enabled it works for some reason, otherwise it doesn't
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> ();
//same code but without giving the list indizes[] to the script/gameObject
_WallMovement.initializeMovement ();
}
}
}
}
IEnumerator waitForMovement()
{
(...)
}
IEnumerator waitForMoving()
{
yield return new WaitForSeconds(1f);
wallMoving();
}
}
Когда я разделяю эту строку_WallMovement.initializeMovement ();
с другой функцией, игра продолжает работать, но на этот раз стена не двигается. Кажется, что индизы больше не инициализируются. Это, однако, не приводит к ошибке в консоли.
Вот что происходит в скрипте WallMovement, который прикрепляется к каждому кубу стены:
public class WallMovement : MonoBehaviour {
public int[] indizes ;
int indize;
int modulo;
public void initializeMovement()
{
modulo = indizes [0] % 2;
if (modulo>0)
{
//do something
}
else
{
// do something else
}
}
}