Unity3d 即使游戏对象处于非活动状态,仍保持运行更新功能

Unity3d 即使游戏对象处于非活动状态,仍保持运行更新功能,unity3d,Unity3d,Hi2 有人知道如何让脚本在unity游戏对象中运行吗 我在更新中有一个特定的函数,即使游戏对象本身处于非活动状态,我也要保留它 这不可能直接实现,但是您仍然可以从外部调用Update和其他方法(使用另一个活动的MonoBehavior)简短回答否。但是,如果我对您的问题理解得足够透彻,您可能希望尝试停用单个组件。我建议您重新考虑您的设计 禁用整个对象是专门为从世界中删除对象而设计的,而不删除它。它不应该再以任何形式参与到场景中(作为旁注,你会注意到GameObject.Find也不会再找到你停

Hi2

有人知道如何让脚本在unity游戏对象中运行吗


我在更新中有一个特定的函数,即使游戏对象本身处于非活动状态,我也要保留它

这不可能直接实现,但是您仍然可以从外部调用Update和其他方法(使用另一个活动的MonoBehavior)

简短回答否。但是,如果我对您的问题理解得足够透彻,您可能希望尝试停用单个组件。

我建议您重新考虑您的设计

禁用整个对象是专门为从世界中删除对象而设计的,而不删除它。它不应该再以任何形式参与到场景中(作为旁注,你会注意到
GameObject.Find
也不会再找到你停用的对象)

不过,您有一些选择,首先要分解出在停用对象时保持运行所需的代码位:

解决方案1:如mowie2所述,停用特定组件。将您的代码放在不同的脚本中,并停用除此脚本之外的所有其他将继续运行的组件。这有点困难,因为您必须迭代所有组件来激活/停用它们。注意:某些组件无法停用,例如刚体

解决方案2:创建层次结构:

MyObject (with component A, that must keep running)
 |-> Child (with component X, Y, Z)
在这种情况下,您将停用对象
子对象
(子对象将具有所有常规组件,如渲染器、碰撞器等)。MyObject将包含应该继续运行的代码

解决方案3:从另一个活动脚本手动调用更新(如Zambari所述):

在将停用的脚本上,在更新前添加
public

public class MyScript : Monobehaviour {
    public void Update() {
       // Your code here
    }
}
在附加到活动对象的另一个脚本中:

public class AnotherScript : Monobehaviour {
   public MyScript OtherScript;

   void Update() {
      // Manually call update from this script, which is active
      OtherScript.Update();  
   }
}

您可以获取组件网格渲染器&设置enable=false。
更新功能中处理逻辑,然后设置网格渲染器启用=真

一种方法是使用两个游戏对象。一个包含要运行的脚本,另一个被停用或激活

不可激活对象可以是脚本对象的子对象,在这种情况下,我们可以将其视为父对象的“组件”。

父对象现在显示您想要的两个功能。在游戏对象处于非活动状态时访问脚本

如何在两个对象和相关类之间划分实现将反映您的特定应用程序

享受


PS刚才注意到我正在总结@kevernicus的第二种方法。

这太可悲了…,我希望Unity会实施这个选项。不管怎样,非常感谢您的回复@Zambari^_^如果我能抽出你的时间,你愿意接受这个答案吗?它违背了禁用一个游戏对象的目的,只是为了调用它脚本上的方法。您可以禁用游戏对象,也可以禁用单个组件。如果你想让游戏对象以任何形式存在于场景中,你应该禁用你不想要的组件。不是游戏对象。Unity将永远不会实现此选项,因为它是一种反模式。@蝙蝠侠拥有live Game Object是有代价的,特别是如果它有很多子转换-如果不停用Game Object,您无法停用转换组件。我个人经常使用这种方法来节省周期,并确保运行到这些对象的回调更少。说到这里,我手边没有url,但我想通过调用YourUpdate()而不是每次点击更新,可以获得更高的性能-如果你有很多对象,取决于你要实现的目标,你可以阻止网格显示对象,但是继续更新它,就像它在那里一样……你必须有一个游戏对象来处理这个行为。另一方面@BugFinder已经告诉我们了。听起来像是XY问题。仅当行为已启用时才显式调用
否则从其他位置调用它,而不是在
更新中调用它。很好,我喜欢这个想法!!!非常感谢你的洞察力^_^