Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 统一-重构崩溃的墙脚本停止工作?_Unity3d_Initialization_Coroutine_Gameobject - Fatal编程技术网

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(); 
   }
}