【发布时间】:2023-03-19 14:24:01
【问题描述】:
我有一个对象,它一次被成千上万个小立方体替换,然后在初始化后开始一个接一个地移动。
我有可以工作的代码,但是当我尝试重构它以清理它时,它停止工作。立方体不动。当我尝试将变量初始化和运动初始化分开时会发生这种情况。
所以这是我的原始代码段,它可以工作:
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 ();
到另一个功能,游戏继续工作,但这次墙没有移动。 Indizes 似乎不再被初始化。但是,这不会导致控制台出错。
这是我脚本中的一些附加代码:
这就是 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
}
}
}
【问题讨论】:
-
Indizes 是为了让墙段知道他在哪里,这样他就可以沿着它定位自己。所以它包含 x、y 和 z 位置。是的,我没有使用它,因为在第二个代码中应该已经为指定的墙段声明了它。如果没有再次设置 indize,第一个有效,第二个无效。
-
运行这个时控制台没有错误吗?它可能会帮助您缩小搜索范围。
-
您的新脚本中是否缺少代码,因为我看不到 Start 方法?
-
不,它不是,但显然它不再是问题了,对不起。不知何故迷路了。
-
你从来没有真正调用过
newWallScript(),所以协程永远不会开始。
标签: unity3d initialization coroutine gameobject