【发布时间】:2020-07-17 23:43:57
【问题描述】:
我是 Unity 的新手,但我在 C# 和企业应用程序方面经验丰富。
但是,我很难找到合适的词来描述我正在寻找的东西。
基本上,假设我有一个 UserInput 类,我想将它分解为一个专注于处理相机移动的类,另一个专注于与世界交互。
这是在 RTS/基地建设/城市建设游戏的背景下。
比如说,我的UserInput 类看起来像这样:
public class UserInput : MonoBehaviour
{
private Vector3 newPosition;
private Quaternion newRotation;
// ... more stuff regarding the map
void Start()
{
newPosition = transform.position;
newRotation = transform.rotation;
// ... more stuff regarding the map
}
void Update()
{
handleCameraChanges();
handleTerrainClicks();
// ... a lot more stuff later on regarding other possible interactions
}
public void handleCameraChanges()
{
// handle WASD inputs and move the camera
}
public void handleTerrainClicks()
{
// handle a user clicking on a building or something
}
// ... other unrelated functions regarding other possible interactions
}
问题在于,所有这些handle...() 函数的唯一共同点是它们都与用户输入相关联。但是,我想创建子类来处理相关任务,例如CameraController:
public class UserInput : MonoBehaviour
{
CameraController cameraController;
TerrainController terrainController;
void Start()
{
cameraController = new CameraController(someReference);
terrainController = new TerrainController(someReference);
}
void Update()
{
cameraController.handleCameraChanges(someOtherReference);
terrainController.handleTerrainClicks(someOtherReference);
}
希望我的例子足够清楚。如果我需要扩展它,请告诉我。
我将如何将这些任务分解为更集中的课程?
【问题讨论】:
-
就我个人而言,我认为整个 MonoBehaviour 的统一概念是通向意大利面小镇的一条路。不管它的价值是什么,如果您创建多个 MonoBehaviours 并且它们处于活动状态,这些脚本都将运行。所以你可以制作各种独立的脚本来做不同的事情。然而,没有什么能阻止你继续你必须拥有更多粒度的东西,你是否尝试过构建其他类?此外,Unity 拥有更现代的游戏设计方法,有助于将关注点分离到实体作业和系统中,并使用点进行高效的游戏设计。
-
@TheGeneral 是的
MonoBehaviour真的让我害怕......我并不总是希望所有东西都实例化并在每个怪异的帧中接收更新。但是,我不能继续使用我列出的示例。例如,我如何获取对Input的引用来检测键,或者如何获取transform来移动MainCamera而无需从MonoBehaviour继承?我尝试将 args 传递给...Controller类的构造函数,但得到的错误导致我认为 Unity 真的不希望我这样做。有思想的工程师应该做什么? -
@TheGeneral 检查我的答案,请给我反馈!