【问题标题】:Calling Unity method convention: yield and SendMessage调用 Unity 方法约定:yield 和 SendMessage
【发布时间】:2014-06-04 01:53:30
【问题描述】:

Unity中调用方法的两种主要方式是:

我已经询问了使用它们的不同情况,看起来是这样的:

  • gameObject.SedMessage():无中间动作。适合模块化。
  • yield script.Function(): inmtediatly 动作。对象必须更多地了解不同的调用,否则,调试可能是一项艰巨的任务。

但是,我仍然没有完全清楚。比如我有一个游戏有自己的规则,默认情况应该是什么?

我还发现了其他问题:如果我在没有 yield 的情况下调用 script.function(),Unity 只会执行第一帧中的部分代码,所以函数的其余部分不起作用。这是可以理解的,但有问题。

【问题讨论】:

    标签: unity3d coroutine


    【解决方案1】:

    还有另一种调用函数的方法,比SendMessage()Coroutines快很多

    获取一个对象的引用,然后简单地调用该函数。

    reference.YourFunction();

    要获得参考,您可以在游戏开始时找到您的对象。然后使用GetComponent()函数找到附加到GameObject的类。

    private MyObject reference;
    
    void Awake()
    {
        reference GameObject.Find("MyObject").GetComponent<MyObject>();
    }
    

    如果您的游戏有自己的规则,那么不要太担心如何调用函数。请记住,这是一种让您可以随心所欲的编程

    【讨论】:

    • 即使您的解决方案“有效”,它也存在与 SendMessage 类似的问题...您正在传递一个字符串,因此您必须手动跟踪所有引用(如果您重构,字符串不会受到影响你的课程/方法/无论什么)。然而,这种解决方案又增加了一个问题——紧耦合。最后一点 - 是的,这是程序员如何处理问题的决定,但人们至少应该尝试编写最好/最干净/最有效的代码。如果不是为了其他可能在他们之后获得该项目的人,至少对于他们自己,如果他们以后需要添加更多功能。
    • @walther OP 正在寻求一种在名为“默认情况”的情况下调用函数的方法。我只是简单地将reference.YourFunction(); 作为首选方式,而不是SendMessage。您称为“手动跟踪所有引用”的代码部分只是获取引用的示例方法。有更好的方法来实现这一点,例如创建一个实例化对象的对象池。但是,这超出了这个问题的范围。也就是说,它属于维护引用而不是如何调用它们。无论哪种方式,请发布您的答案,我很乐意投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2014-04-04
    相关资源
    最近更新 更多