我正在统一使用c#。我有一个名为CarPart的类,该类派生自MonoBehaviour(M.B。是每个统一脚本的基类)。在此类中,我声明了不能从任何基类派生的特定汽车零件类,因为统一检查器不会显示其属性,但是它们需要单声道行为,因此我在确实源自MonoBehaviour的类(CarPart)中声明了它们。
public class CarPart : MonoBehaviour {
[System.Serializable] //required to show full objects in inspector
public class Chassis {
//common properties for all car parts
public GameObject prefab;
public int price;
//specific properties for every car part
public bool AWD;
public int suspensionDepth;
//specific implementation of equip for chassis
public void equip() {
//instantiate chassis as root object
}
}
[System.Serializable] //required to show full objects in inspector
public class Engine {
//common properties for all car parts
public GameObject prefab;
public int price;
//specific properties for every car part
public bool supportsAddOnExhaust;
public int power;
//specific implementation of Equip for engine
public void Equip() {
//instantiate engine as child object of chassis in hierarchy
}
}
//this code is heavily simplified
}
然后我有一个类VehicleConfig,它是经理游戏对象的组成部分(此目标在整个游戏中都处于活动状态)。 VehicleConfig正在与GUI通信,并基于GUI输入配置车辆。它还宣布了所有汽车部件,这些部件随后将由检查员(功率,suspendDepth)和3D模型(预制)分配特定的值。
public class VehicleConfig : CarPart{
public Chassis[] chassis; //assigned from inspector
public Engine[] engines; //assigned from inspector
//and more car components like these two...
//arrays because there will be multiple to chose from each type
public void Setup (unknownDataType component) {
component.Equip;
DoSomethingWithCommonVariables(component.price, component.prefab);
}
//method called from GUI example:
public void MountFirstEngine() {
Setup(engines[0]);
}
}
我的问题是,除了引擎和底盘之外,我还有更多特定的汽车组件,并且与Equip()相比,所有它们都有许多具有特定实现的通用方法。另外,Setup()比上面的示例要复杂一些。所以我想让Setup()重载某种数据类型,该数据类型可以表示所有汽车零件(引擎,底盘...)的所有通用方法和属性,因此我可以重载Setup(),例如将Engines [0]转换为那个特殊的数据类型。我知道,使用抽象类来实现此功能的方法有所不同,所有常见的抽象方法都将从此类类中派生,例如Engine或Chassis之类,并将为这些方法提供某些实现,但是正如我前面提到的,统一检查器无法显示派生类的成员变量。如果有人有建议,想法或完全不同的方法。我真的很感激提前提到:)。
答案 0 :(得分:0)
您可以将公用数据存储在单独的对象中。我建议CarBase
public class CarBase
{
public GameObject prefab;
public int price;
}
然后,创建一个必须为您的方法实现的接口。我建议ICarEquip
public interface ICarEquip
{
public void Equip();
}
现在,对于您要创建的任何汽车零件,请从Unity的MonoBehaviour
和您自己的ICarEquip
public class Engine : MonoBehaviour, ICarEquip
{
// Attach your CarBase information
[System.Serializable]
CarBase carBase;
// Specific properties
public bool doesSupportAddonExhaust;
public int power;
// Implement your interface methods
public void Equip()
{
}
}
您不会绕开汽车零件类别彼此不同的事实,但是您将从DRY(请勿重复自己)原理中受益匪浅。
您的VehicleConfig
类将不得不更改其访问和应用这些组件的方式。我不会使其实现CarBase
,因为它不是CarBase的一种。您的VehicleConfig
将承担Mediator Pattern的更多角色。它将以自己的方式与不同的汽车零件进行交互。
答案 1 :(得分:0)