为每个对象行为创建脚本,而不是在对象脚本体中编写所有内容

问题描述 投票:0回答:2

我的示例场景中有两个游戏对象。两者都需要在本地空间以特定速度不断旋转。它们只是简单的硬币,目的是由玩家收集。我没有在每个Update()方法中编写旋转脚本,而是创建了一个名为Rotator的脚本,使其附加的对象实际旋转。

我已将组件Rotator附加到每个对象,它工作得很好。现在我有两个游戏对象,它们有一个名为Rotator的组件,可以让它们旋转。

这是Rotator类:

using UnityEngine;

public class Rotator : MonoBehaviour
{
    [SerializeField][Range(5, 10)]
    private int _rotationSpeed = 5;

    [SerializeField]
    private float _xAxes = 0;
    [SerializeField]
    private float _yAxes = 0;
    [SerializeField]
    private float _zAxes = 0;

    void Update()
    {
        transform.Rotate(new Vector3(_xAxes, _yAxes, _zAxes) * _rotationSpeed * Time.deltaTime);
    }
}

我认为通过这种方式,我的游戏对象的创建流程比在应该旋转的每个元素内部编写相同的代码更容易和模块化。

我的问题是:这会对性能产生影响吗?将行为分成小块或组件然后将它们添加到需要它们的每个游戏对象中是一个坏主意吗?或者更好的是,在一个简单的旋转的情况下,直接在一个游戏对象脚本中编写该行代码?

例如,我现在有另一个名为Player的游戏对象,它也需要自己旋转。这个游戏对象附加了另一个名为PlayerController的脚本,它通过键盘输入处理玩家的动作。我可以写这部分......

        transform.Rotate(new Vector3(_xAxes, _yAxes, _zAxes) * _rotationSpeed * Time.deltaTime);

...在PlayerController的update()方法内部,或者,就像我认为更好,将Rotator脚本附加到它。在最后一种情况下,我将有一个包含两个组件的游戏对象:

  • 的PlayerController

当然,这只是一个例子,我不希望我的玩家继续在自己身上旋转,只是为了解释我的观点。

所以,最后,我需要了解这是否是一个好习惯,即使是一小段代码,如旋转值得创建一个组件?我指的是多个对象所需的行为,当然,我知道如果它只是一个案例,那么将它直接写入已附加到游戏对象的脚本中会更有意义。题。

很长的帖子,希望我足够清楚。谢谢你们!

c# unity3d rotation components game-engine
2个回答
0
投票

你这样做的方式是它应该做的方式。统一的想法是使用可以重复使用的小型模块化组件。但是,具有大量更新功能会对性能产生影响,尤其是在使用Mono而非IL2CPP时。

但是有很多解决方案。

  • 使用IL2CPP删除C#(您的代码)和c ++端(引擎代码)之间的“虚拟”调用层。
  • 编写一个行为管理器,从c#端更新所有脚本。
  • 查看实体组件系统,并在一个“更新功能”中迭代需要旋转的所有内容。

我们实际发布了一款旋转晶体对CPU性能产生影响的游戏。最后,我们每帧只计算一次LocalRotation值,并将其分配给所有晶体。


0
投票

这实际上取决于游戏的大小和附加的脚本数量。如果它是一个包含数十个长脚本的大型游戏,则必须在游戏组织和性能之间取得平衡,因为两者都很重要。例如,最好在一个Update方法中调用一个方法1000次,而使用一个Update方法调用1000个单独的脚本 在您的情况下,因为它很简单并且两个对象的旋转相同,所以最好创建一个通用的单独脚本。如果您需要对其轮换进行任何更改,您只需更改一次即可,而且性能成本不会很高。

© www.soinside.com 2019 - 2024. All rights reserved.