Unity - 重构的摇摇欲坠的墙脚本停止工作?

2024-01-17

我有一个对象,它立即被数千个小立方体取代,然后在初始化后开始一个接一个地移动。

我有有效的代码,但是当我尝试重构它以清理它时,它停止工作。立方体不动。当我尝试将变量初始化和运动初始化分开时,就会发生这种情况。

这是我原来的代码段,它可以工作:

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
    }
}

}

我的错误是,我通过引用而不是通过值将 indize 传递给墙脚本。

因此,当我更改主脚本中的索引时,它们在每个墙壁脚本中都会更改。 因此,当我稍后调用墙的公共功能时,它们都使用相同的索引,即我最后初始化的索引,因此首先不会受到我的“初始化”的影响。

否则,如果我在调用 wall 函数之前更改 indizes 值,它会再次工作,因为脚本现在使用正确的对应值,因此为了纠正我需要逐一传递 indizes 值,以便它们全部初始化为真实值及其对应的值。

谢谢出去https://catlikecoding.com/unity/tutorials/ 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
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity - 重构的摇摇欲坠的墙脚本停止工作? 的相关文章

  • 使用 VSCode 作为编辑器时 Unity 打开多个工作区

    我按照 VSCode 中给出的教程将 VSCode 与 Unity 2017 3 0f3 集成Docs https code visualstudio com docs other unity 我面临一个问题 每当我从 Unity 项目资源
  • Unity InputField OnValueChanged事件显示InputField.text少一个字符

    我有一个InputField我用它作为搜索栏 我无法自动搜索OnValueChanged因为最初 文本字段将是 现在如果我输入任何字符a the inputField text还是 代替a因此 在添加下一个字符之前不会进行搜索 有没有办法在
  • 如何将焦点设置到 Windows 窗体应用程序中的控件?

    在 Windows 窗体应用程序中 when我是否编写代码以在应用程序启动时以及随后调用函数后将焦点设置到控件 例如 如果我有一个 DropDownList 一个 TextBox 和四个按钮 并且我希望将 Focus 设置为 DropDow
  • unity 3d 根据加速度计旋转游戏对象

    我想做一款类似 神庙逃亡 的游戏 我需要根据设备倾斜的程度来旋转播放器的平台 我正在尝试加速计 但无法使游戏对象倾斜 请指导我 谢谢 这是我的代码 我之前在注释中使用了代码 现在我尝试使用注释中的代码 public class tilt M
  • 在 Unity 中使用 MRTK 和 Vuforia - 选择什么相机?

    我是 AR 新手 最近几天在 Unity 上设置了 MRTK 和 Vuforia 两者独立运行良好 现在我想在一个项目中使用两者 但问题是两者都有相机 MRTK 有自己的 MixedRealityCamera 和 Vuforia ARCam
  • UV 展开运行时优化

    我正在尝试在运行时创建 UV 我使用 BOX 类型 UV 类似于 3ds max 中的 BOX UVW 并基于面方向进行计算 我知道将其创建为运行时不是一个好的选择 但我别无选择 它是在计算后保存的 所以我做了一次 但我花了 40 秒处理
  • C 或 C++ 中未初始化的指针有用途吗?

    在其中一篇评论中这个问题 https stackoverflow com questions 1910832 c why arent pointers initialized with null by default 有人指出默认初始化 C
  • C 中的复合语句表达式

    下面的代码不起作用 int i void 999 100 添加括号就可以了 为什么 int i void 999 100 还有另一种方法可以完成此类分配 int i void 999 100 是什么让他们与众不同 在这份声明中 int i
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 如何将依赖 ThreadLocal 的代码与 Kotlin 协程一起使用

    一些 JVM 框架使用ThreadLocal存储应用程序的调用上下文 例如SLF4j MDC https logback qos ch manual mdc html 事务管理器 安全管理器等 然而 Kotlin 协程是在不同的线程上调度的
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • 为什么使用[ClassName alloc]而不是[[self class] alloc]?

    我正在读马克 达尔林普尔 Mark Dalrymple 的著作在 Mac 上学习 Objective C 仅在协议章节 所以仍然相对较新 并试图弄清楚一些事情 为什么要通过类自己的名称来引用它 如果我有一个叫做Foo 为什么我会想写 比如说
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • C#中初始化和赋值有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 变量初始化与赋值 https stackoverflow com questions 3779707 c variable initializations vs assignment 就像标题一样
  • unity3d 游戏上的 Facebook AppRequest 句柄

    我正在尝试使用新的 facebook unity sdk 在 Unity3D 中制作游戏 我可以向列表中的朋友发送 AppRequest 但我的疑问是 当我的朋友下载了同一个游戏后 我如何使用AppRequest与朋友进行交流 例如 如果我
  • 如何找到子游戏对象?

    我想说一些诸如 Gameobject find child gameobject of specific parent Gameobject 谁能帮我 谢谢 GameObject Find将在场景中搜索游戏对象 要从父级搜索游戏对象 请使用
  • 寻找一种简单的方法来重新初始化结构

    我有一个名为 CoolStruct 的结构 struct CoolStruct int id uint32 type uint32 subtype String name 我也有这些结构的向量 std vector
  • 导航时 Internet Explorer 9 中的图像闪烁白色

    我正在使用 XHTML 1 1 CSS 3 0 开发一个网站 但 Internet Explorer 9 出现问题 每次我将页面从 主页 更改为 功能 时 各种图像在填充之前都会闪烁 白色 出现这种 白色闪烁 每次页面更改时 我见过很多堆栈

随机推荐

  • 如何隐藏虚拟键盘

    我不想显示虚拟键盘 我尝试了下面的方法 但没有任何区别 InputMethodManager imm InputMethodManager getSystemService Context INPUT METHOD SERVICE imm
  • 无需使用 Google 帐户登录即可使用 Google Picker(使用 OAuth)

    是否可以介绍一下谷歌选择器 https developers google com picker 对于未使用其 Google 帐户登录的用户 我想让用户从我网站的 Google 帐户的共享 Google 云端硬盘中选择文件 我可以使用服务器
  • 在 html 输入日期时间本地选择器中禁用前一天的前一个时间

    我正在尝试找出解决方案来解决不允许用户选择上次的问题 我的意思是例如 今天的日期 17 02 2019当前时间 02 30 PM 因此 当用户选择今天的日期并选择时间 02 30 AM 而不是 PM 时 这里时间已经过去 因此不应允许用户选
  • 通过挂钩直接将击键发送到另一个进程

    我想知道 在摆弄了 SendInput SendKeys PostMessage SendMessage SendNotifyMessage keybd event 等各种问题之后 为了找到这一点 尝试将键盘输入发送到另一个非前台进程是非常
  • Django:对象和 model_set

    我正在学习 django 1 10 官方教程第 2 部分 class Question models Model class Choice models Model question models ForeignKey Question o
  • 将 swift 中的嵌套数组转换为一维数组

    我有一个像 我想转换成 E g Hi into Hi 我怎样才能在斯威夫特做到这一点 joined https developer apple com reference swift collection 2432330 joined返回串
  • 阿瓦杰·伊比恩. ManyToMany 延迟 BeanSet

    我正在编写小型应用程序 使用 Play Framework 2 0 它使用 Ebean 作为 ORM 所以我需要 User 类和 UserGroup 类之间的多对多关系 这是一些代码 Entity public class User ext
  • 如何在免安装应用中包含即时动态功能模块?

    我有一个包含这些模块的项目 app bookingfeature 即时启用 map 不是即时的 app包含一些通用代码和资源以及一个启动活动 其中包含一些逻辑 根据应用程序是否即时运行将应用程序路由到正确的目的地 bookingfeatur
  • 插入错误,“2”附近的语法不正确[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我试图将信息添加到表中 但它出现了错误的语法 这是我的插入语句 INSERT INTO Exercise 2 Exercise C
  • Windows Chrome + 黑十字

    我想知道在 Windows 上用 Chrome 运行一个非常简单的网站时是否有人对这个奇怪的问题有任何见解 我基本上将 5 个 div 堆叠在一起 如果窗口调整大小 我也会调整它们的大小 div div div div div div di
  • 在 Mongodb 上使用文本索引时出错

    我正在尝试在 Mongodb 上使用文本索引 我已经在一个集合上使用了文本索引 db ensureIndex field1 text 它有效 但我重试了另一个集合 并收到以下消息 db movies ensureIndex genres t
  • 为什么javac要创建一个额外的类? [复制]

    这个问题在这里已经有答案了 我编译了以下代码 为简洁起见 省略了方法和变量 Outer java public class Outer private class Inner void someMethod Inner inObj this
  • Node.js中的Ajax文件上传

    想要使用 ajax 上传文件 使用此上传器http valums com ajax upload http valums com ajax upload 并在 node js 中编写此代码 该代码可以在没有 ajax 的情况下处理正常文件上
  • 将日期代码添加到 matplotlib/python 图表

    我有一个听起来很简单的问题 但它让我发疯了好几天 我有一个历史时间序列 分为两个列表 第一个列表包含价格 假设 P 1 1 5 1 3 而第二个列表包含相关日期 假设 D 01 01 2010 02 01 2010 我想做的是绘制其中一些日
  • 如何通过索引获取字符串中的字符?

    我知道我可以使用以下命令返回字符串的特定字符的索引indexof 函数 但如何返回特定索引处的字符 string s hello char c s 1 now c e 也可以看看Substring 返回多个字符
  • Chrome:用于测试目的的假麦克风输入

    为了使用量角器进行测试 我需要在没有麦克风的计算机上模拟麦克风的音频输入 通过 use fake device for media stream 标志 Chrome 可以模拟假麦克风 然而 假麦克风没有输入 所以我的测试失败了 是否可以模拟
  • 从 MediaWiki 操作 URL 中删除 index.php

    好的 所以它相当有据可查 https stackoverflow com questions 6667847 mediawiki removing index php from url如何隐藏 url 中的 index php title
  • mysql 如果表存在则插入

    在我的项目中 我有两个在首次设置期间与 MySQL 交互的代码路径 第一步是数据库结构创建 在这里 用户可以选择他们想要的功能 并且根据用户的选择 某些表可能最终不会在数据库中创建 在第二部分中 我需要预加载以下表格did使用一些基本数据创
  • 即使用户重新安装后也限制 iOS 应用程序

    我创建了一个应用程序 在第一次启动时为用户提供 3 个硬币 一旦用户用完 3 个硬币 他应该通过应用内购买购买无限的硬币 问题是 如果用户不想购买无限的硬币 他可以删除该应用程序 重新安装该应用程序 然后他将再次拥有 3 个硬币 他可以永远
  • Unity - 重构的摇摇欲坠的墙脚本停止工作?

    我有一个对象 它立即被数千个小立方体取代 然后在初始化后开始一个接一个地移动 我有有效的代码 但是当我尝试重构它以清理它时 它停止工作 立方体不动 当我尝试将变量初始化和运动初始化分开时 就会发生这种情况 这是我原来的代码段 它可以工作 p