C# Unity:如何将功能转移到更小、更集中的类中

C# Unity:如何将功能转移到更小、更集中的类中,c#,oop,unity3d,C#,Oop,Unity3d,我是Unity的新手,但我对C#和企业应用程序相当有经验 然而,我正在努力寻找合适的词语来描述我所寻找的 本质上,假设我有一个UserInput类,我想把它分成一个专注于处理相机运动的类,另一个专注于与世界互动的类 这是在RTS/基地建设/城市建设游戏的背景下进行的 例如,假设我的UserInput类如下所示: public class UserInput : MonoBehaviour { private Vector3 newPosition; private Quatern

我是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
}
问题是所有这些
处理…()
函数的唯一共同点是它们都与用户输入相关。但是,我希望创建子类来处理相关任务,例如
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);
    }
希望我的例子足够清楚。如果我需要扩展,请告诉我


我如何将这些任务分解成更集中的类?

一个可能的解决方案是将
CameraController
(继承自
MonoBehavior
)添加到示例中的
MainCamera
对象中。然后,在
UserInput
类中,我可以执行以下操作:

public class UserInput : MonoBehaviour
{
    private CameraController cameraController;
    private TerrainController terrainController;

    void Start()
    {
        cameraController = transform.root.GetComponent<CameraController>();
        terrainController = transform.root.GetComponent<TerrainController>();
    }

    void Update()
    {
        cameraController.handleCameraChanges();
        terrainController.handleTerrainClicks();
    }
}
public类用户输入:monobhavior
{
专用摄像机控制器摄像机控制器;
私人Terracontroller Terracontroller;
void Start()
{
cameraController=transform.root.GetComponent();
terracontroller=transform.root.GetComponent();
}
无效更新()
{
cameraController.handleCameraChanges();
terracontroller.handleTerrainClicks();
}
}
但我真的很担心对性能的影响,还有斯佩盖蒂。这意味着我必须将
CameraController
terracontroller
添加到我的
main摄像头
(或类似设备)中,然后使用
GetComponent()
神奇地将其从空中拉出


一定有办法做到这一点,使得到温暖的n-模糊

就我个人而言,我认为整个统一的单一行为概念是通往意大利面城的一条单行道。无论如何,如果您创建了多个单行为并且它们处于活动状态,那么脚本都将运行。所以你可以制作各种独立的脚本来做不同的事情。但是,没有什么可以阻止您继续进行您必须具有更高粒度的工作,您是否尝试过构建其他类?此外,unity还有一种更现代的游戏设计方法,有助于将关注点分离到实体、作业和系统中,并使用圆点进行高效的游戏设计。@TheGeneral Yeah
MonoBehavior
真让我害怕。。。我并不总是希望每一件事都在每一帧中实例化和接收更新。然而,我真的不能坚持我列举的例子。例如,如何获取对
Input
的引用以检测关键点,或
transform
以移动
main摄像头
,而不继承
monobhavior
?我尝试将参数传递给
…Controller
类的构造函数,但出现了错误,这让我产生了这样的想法:Unity真的不希望我这样做。“一个深思熟虑的工程师应该做什么?”将军检查我的答案,请给我反馈!这几乎就是它的工作方式,还请注意,您可以创建属性并链接游戏对象和相关脚本together@TheGeneral你能给我链接一些关于这个的好的阅读材料吗?我是Unity的新手,这是一个与我过去使用过的任何框架都截然不同的框架。请往下看链接游戏对象部分。再看看ECS及相关技术,@将军谢谢