我正在学习Unity3D,现在创建了一个琐碎的(没用的)游戏,如下所示。
球从倾斜的地板上滚下来,摄像机必须按照以下关系跟随球
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;
}
}
即使这两种方法都能按预期工作,但我想知道每种方法是否有优点和缺点。我应该使用哪一个?
答案 0 :(得分:4)
正如您已经提到的,两个示例均按预期工作。
我想做的是将功能分配给负责执行“操作”的对象。在这种情况下,相机正在“跟随”某物。此刻,它正在追随球,但是如果以后您想使其跟随其他事物,是否必须导航到您的球游戏对象以更改该行为是否有意义?我认为不是。
通过基于“职责”为对象分配功能,您通常会发现,从长远来看,您的代码最终将变得更加模块化。
当然,这种做法对于游戏开发或软件开发来说并不是什么新鲜事物。它是Single Responsibility Principle的补充,并具有许多特质。
但是,归根结底,如果您只是在编写代码,那么您将完全了解代码库。所以这完全取决于您!
我还建议尽可能根据这些职责创建Components
。因此,我将没有一个通用的Camera
组件,而是创建一个FollowTarget
组件并将其附加到相机。这样,您就可以使用相同的Component
来使游戏中的其他任意对象跟随其他任意对象。
学习愉快!