gpt4 book ai didi

javascript - 如何降低弹丸速度变量的计算成本?

转载 作者:行者123 更新时间:2023-12-03 07:15:09 25 4
gpt4 key购买 nike

我目前正在与我的一位 friend 合作开发一个视频游戏项目,该项目目前正在 Unity 3D 中开发。游戏涉及到一个特定的生成点,该生成点实际上以确定的速率生成射弹形式的物体。它们的速度由与该生成点相关的脚本 (javascript) 中编码的公共(public)变量控制。生成的物体在被扔到世界中之前会搜索速度,然后它们以确定的速度行进,该速度可能会在游戏过程中发生变化(因为这是与人类玩家在游戏中的工作相关的主要特征之一)游戏)。

我们目前正在使用此方法来确定射弹必须行进的速度:

var script: spawn = findObjectOfType(spawn);
myspeed = script.speed;

现在,在每次更新时执行此操作在计算成本方面可能会非常痛苦,因为更新每秒会发生数千次。是否有机会实现更好的方法来执行此操作?

我不知道我是否说得足够清楚,如果您还需要任何其他信息,请告诉我,感谢您的耐心等待!

最佳答案

快速说明:我使用 C# 进行统一工作,因此代码可能略有不同,但概念仍然适用。

FindObjectOfType、GetComponent 等由于性能缓慢,应在 Update 中不惜一切代价避免使用。您可以尝试多种替代方法,具体取决于对象的实例化方式。既然你在问题中没有说,我就说一些。

如果“生成的”游戏对象已存在于编辑器的场景中
在这种情况下,您可以简单地将属性添加到生成点脚本类型的生成对象的脚本中。然后,在编辑器中,将生成点拖到该对象上

如果您使用 Instantiate 在运行时实例化预制件
如果您要实例化大量对象,这实际上不是一个好主意。对象实例化是一个非常昂贵的操作。如果可能的话,您应该存储实例化的对象并重用它们。无论哪种方式,如果这是您的方法,您可以在实例化的预制件上使用 GetComponent 来获取对生成对象的脚本的引用,然后从那里设置您需要的值。这仍然涉及在 Update 中使用 GetComponent,但这仍然比使用 FindObjectOfType 好一些

完全不同的方法:粒子系统
所有这些脚本废话的替代方法是仅使用附加到生成点的粒子系统。粒子系统旨在快速高效地创建大量对象。创建粒子系统后,您只需在编辑器中设置起始速度

其他一些可能有用的注释:
您在问题中说更新“每秒发生数千次”。更新每帧运行(正如非常有用的默认注释所说)。这意味着更新之间的时间可能因计算机而异,甚至每时每刻都有很大差异。这也意味着在 Update 中编写的代码默认情况下与帧速率相关。如果您出于游戏原因生成这些对象,则需要确保它们的生成速率不依赖于帧速率。您可以使用 Time.DeltaTime 获取自上次更新以来的秒数。例如(对于 C# 很抱歉,但您应该能够轻松翻译):

public float TimeBetweenActions = 1f;
private float elapsed = 0f;

void Update() {
elapsed += Time.DeltaTime;
if(elapsed >= TimeBetweenActions){
DoTheThing();
elapsed-=TimeBetweenActions;
}

关于javascript - 如何降低弹丸速度变量的计算成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36459555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com