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