使摄像机跟随球时,应该控制摄像机位置的是哪一个?球还是相机本身?

时间:2019-06-17 15:27:18

标签: c# unity3d

我正在学习Unity3D,现在创建了一个琐碎的(没用的)游戏,如下所示。

enter image description here

球从倾斜的地板上滚下来,摄像机必须按照以下关系跟随球

  • x相机= x
  • y摄像头= y球+ 3
  • z相机= z-10

有两种方法可以控制相机位置。

球控制着摄像机

在这种情况下,我将以下脚本附加到球上。

public class Ball : MonoBehaviour
{
    [SerializeField]
    private Transform cameraTransform;

    void Start() { }

    void Update()
    {
        Vector3 newCameraPos = new Vector3
        {
            x = transform.position.x,
            y = transform.position.y + 3f,
            z = transform.position.z - 10f
        };
        cameraTransform.position = newCameraPos;
    }
}

摄像机控制自己

在这种情况下,我将以下脚本附加到相机上。

public class Camera : MonoBehaviour
{

    [SerializeField]
    private Transform ballTransform;

    void Start() { }


    void Update()
    {
        Vector3 newCameraPos = new Vector3
        {
            x = ballTransform.position.x,
            y = ballTransform.position.y + 3f,
            z = ballTransform.position.z - 10f
        };
        this.transform.position = newCameraPos;
    }
}

问题

即使这两种方法都能按预期工作,但我想知道每种方法是否有优点和缺点。我应该使用哪一个?

1 个答案:

答案 0 :(得分:4)

正如您已经提到的,两个示例均按预期工作。

我想做的是将功能分配给负责执行“操作”的对象。在这种情况下,相机正在“跟随”某物。此刻,它正在追随球,但是如果以后您想使其跟随其他事物,是否必须导航到您的球游戏对象以更改该行为是否有意义?我认为不是。

通过基于“职责”为对象分配功能,您通常会发现,从长远来看,您的代码最终将变得更加模块化。

当然,这种做法对于游戏开发或软件开发来说并不是什么新鲜事物。它是Single Responsibility Principle的补充,并具有许多特质。

但是,归根结底,如果您只是在编写代码,那么您将完全了解代码库。所以这完全取决于您!

我还建议尽可能根据这些职责创建Components。因此,我将没有一个通用的Camera组件,而是创建一个FollowTarget组件并将其附加到相机。这样,您就可以使用相同的Component来使游戏中的其他任意对象跟随其他任意对象。

学习愉快!