Unity3d 统一-重构崩溃的墙脚本停止工作?
我有一个对象,它一次被数千个小立方体替换,然后在初始化之后开始一个接一个地移动 我有可以工作的代码,但当我试图重构它来清理它时,它就停止工作了。立方体不动。当我尝试分离变量初始化和运动初始化时,就会发生这种情况 这是我的原始代码段,它可以工作:Unity3d 统一-重构崩溃的墙脚本停止工作?,unity3d,initialization,coroutine,gameobject,Unity3d,Initialization,Coroutine,Gameobject,我有一个对象,它一次被数千个小立方体替换,然后在初始化之后开始一个接一个地移动 我有可以工作的代码,但当我试图重构它来清理它时,它就停止工作了。立方体不动。当我尝试分离变量初始化和运动初始化时,就会发生这种情况 这是我的原始代码段,它可以工作: 首先,在重构代码真正运行之前,不要弄乱任何不需要的东西。否则,您将尝试修复多个问题 void newWallMovement() { for (int x = 1; x < oldWallsizeX-1; x++)
首先,在重构代码真正运行之前,不要弄乱任何不需要的东西。否则,您将尝试修复多个问题
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;
}
}
}
}
当你调用这两个函数时,你可以这样做
IEnumerator waitForMovement()
{
newWallMovement();
yield return new WaitForSeconds(1f);
InializeAllWallMovement();
}
private void InializeAllWallMovement()
{
foreach(WallMovement wm in WallCollection)
{
wm.initializeMovement();
}
}
正如您所看到的,这实际上并不是一种改进,而是使代码更加复杂,耗时更长。以前的方式可能会像现在这样简化。如果由于某些原因必须将代码移到外部,请尝试类似我建议的方法。我的错误是,我通过引用而不是通过值将indize传递给wallscripts 因此,当我更改主脚本中的标识时,它们在每个墙脚本中都会更改。 因此,当我稍后调用墙的公共函数时,它们都使用相同的索引,即我初始化的最后一个索引,因此首先不受我的“初始化”的影响 否则,如果在调用wall函数之前更改indizes值,它将再次工作,因为脚本现在使用正确的对应值,因此要进行更正,我需要逐个传递indizes值,以便它们都使用相应的值初始化为实数 谢谢大家 感谢你检查了这个愚蠢的错误,告诉我这里没有人能告诉我的。至少他没有试图纠正我的代码太慢 这是我的新代码段,虽然有效,但效率很低,但它仍然完全符合我的要求: 为了更好的可读性,我不再编写所有再次运行的代码。它用(…)标记并保持不变
公共类墙创建:单行为{
(…)//与工作代码中的保持相同
void Start(){
indizes=新整数[3];
}
public void newWallScript(){
初始化为“zWall++”;
开始例行程序(waitForMovement());
startcroutine(waitForMoving());//添加了新的协同程序,该程序的启动时间较晚
}
void initializeNewWall(字符串替换墙)
{
(…)//保持不变
}
void newwall移动()
{
对于(int x=1;x
下面是我脚本中的一些附加代码:
这就是现在在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
}
}
}
public-class-wallmotation:monobhavior{
公共int[]独立化;
int indize;
整数模;
无效唤醒(){
indizes=new int[3];//这是添加的,因为我们不传递列表,而是传递单个值,因此需要在前面声明为三维数组
}
public void initializeMovement()
{
模=表示[0]%2;
if(模>0)
{
//做点什么
}
其他的
{
//做点别的
}
}
}
Indizes是让墙段知道他在哪里,这样他就可以根据它来定位自己。所以它包含x,y和z的位置。是的,我没有使用它,因为在第二个代码中,应该已经为指定的墙段声明了它。如果不重新设置indize,第一个可以工作,第二个不能。运行此操作时控制台中是否没有错误?这可能会帮助您缩小搜索范围。您的新脚本中是否有代码丢失,因为我看不到开始方法?不,没有,但显然不再是问题所在,sry。不知怎的迷路了。你从来没有真正调用过newWallScript()
,所以co例程永远不会启动。注释不用于扩展讨论;这段对话已经结束。那么正确的代码是什么呢?目前你的答案不完整。
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;
}
}
}
}
Private List<WallMovement> WallCollection = new List<WallMovement>();
private WallMovement 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;
WallCollection.Add(_WallMovement);
}
}
}
}
IEnumerator waitForMovement()
{
newWallMovement();
yield return new WaitForSeconds(1f);
InializeAllWallMovement();
}
private void InializeAllWallMovement()
{
foreach(WallMovement wm in WallCollection)
{
wm.initializeMovement();
}
}