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