【问题标题】:Unity: How to move functionality into smaller, more focused classesUnity:如何将功能转移到更小、更集中的类中
【发布时间】: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 检查我的答案,请给我反馈!

标签: c# oop unity3d


【解决方案1】:

在我的示例中,一种可能的解决方案是将CameraController(继承自MonoBehaviour)添加到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();
    }
}

但我真的很担心性能影响和意大利面条。这意味着我必须将CameraControllerTerrainController 添加到我的MainCamera(或类似的东西),然后用GetComponent&lt;&gt;() 神奇地将其从空中拉出来。

必须有一种方法来做到这一点,从而获得温暖的模糊!

【讨论】:

  • 这几乎就是它的完成方式,还请注意您可以创建属性并将游戏对象和相关脚本链接在一起
  • @TheGeneral 你能给我链接一些好的阅读材料吗?我是 Unity 的新手,它是一个与我过去使用过的任何框架都非常不同的框架
  • docs.unity3d.com/Manual/ControllingGameObjectsComponents.html 在页面下方查看链接游戏对象部分。也看看ECS和相关技术,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2020-09-27
  • 1970-01-01
相关资源
最近更新 更多