C# 如何在没有继承的情况下创建两个游戏对象之间的关系?

C# 如何在没有继承的情况下创建两个游戏对象之间的关系?,c#,class,unity3d,C#,Class,Unity3d,免责声明:所以标题可能不太准确,但它是我能得到的最接近的 所以我在Unity中做了一个战略游戏,这个游戏的想法是有几种类型的“单位”,他们可以从武器库中进行选择。这些不同的“单位”都继承自其单位类型,然后单位类型继承自基本的“单位”抽象类,另一方面,这是一个类似的故事,武器继承自武器类型,然后继承自基本的“武器”抽象类。这不是问题所在,问题在于确定特定单位与其指定武器之间的关系,以便单位类了解其拥有何种武器,并根据指定武器进行攻击,访问其中包含的变量,例如;射程、损坏等 因为我在视觉上表现得最好

免责声明:所以标题可能不太准确,但它是我能得到的最接近的

所以我在Unity中做了一个战略游戏,这个游戏的想法是有几种类型的“单位”,他们可以从武器库中进行选择。这些不同的“单位”都继承自其单位类型,然后单位类型继承自基本的“单位”抽象类,另一方面,这是一个类似的故事,武器继承自武器类型,然后继承自基本的“武器”抽象类。这不是问题所在,问题在于确定特定单位与其指定武器之间的关系,以便单位类了解其拥有何种武器,并根据指定武器进行攻击,访问其中包含的变量,例如;射程、损坏等

因为我在视觉上表现得最好,所以我画了一张图表,展示了我的意图,以帮助那些仍然对我的问题感到困惑的人


因此,顶部的单位是我前面提到的单位抽象类,然后人是单位类型,然后士兵是稍后将实例化的特定单位,这(同样如上所述)反映为武器。

你可以做的事情是拥有一个公共属性(使用getter和private setter)对于当前的武器

public class Soldier : Human
{
    public Weapon CurrentWeapon {get; private set;}
    [...]
}
然后,您可以使用以下方式从士兵处获取武器:

public Soldier mySoldier = new Soldier();
mySoldier.CurrentWeapon;

希望有帮助

我建议你在士兵初始化时将武器注射到他们身上,然后让士兵决定他们想要使用什么武器

例如:

public class Solider : Human {

     IEnumerable<IWeapons> _allAvailableWeapons;
     IWeapon _selectedWeapon;

     public Soldier(IEnumerable<IWeapon> weapons)
     {
        _allAvailableWeapons = weapons;

        // some conditions
        // Select the correct weapon for this soldier
        _selectedWeapon = _allAvailableWeapons.Single(x => x.Id == "Something");
    }    
}

public class Civilian : Human
{
     public Civilian()
     {
     }
}
公共级士兵:人类{
所有可用武器;
我选择了武器;
公共士兵(可数武器)
{
_所有可用武器=武器;
//一些条件
//为这个士兵选择正确的武器
_selectedwearms=_allavailablewearms.Single(x=>x.Id==“某物”);
}    
}
公共阶层:平民
{
公职人员()
{
}
}

Unity是基于组件的引擎,因此它意味着您应该使用可以或不能继承的组件(取决于需要)。但基本上没有继承,您可以这样做:

// Unit.cs
public class Unit : Component {
    // logic for your Unit Component
}

// Human.cs
[RequireComponent(typeof (Unit))]
public class Human : Component {
    Unit _parent;

    public void Initialize(){
        _parent = (Unit)GetComponentInParent(typeof(Unit));
    }
}

// Soldier.cs
[RequireComponent(typeof (Human))]
public class Soldier: Component {
    Human _parent;

    Weapon _meWeapon;

    public void Initialize(){
        _parent = (Human)GetComponentInParent(typeof(Human));
    }

    public void AttachWeapon(Weapon wpn){
        _meWeapon = wpn;
    }

    public void DetachWeapon(){
        if(_meWeapon != null) {
            Destroy(_meWeapon);
            _meWeapon = null;
        }
    }
}
然后你可以对你的
武器
远程武器
AK47
执行同样的操作。但是这种方法基本上是无效的,因为您与其他
组件相关,并且当您想要改进某些内容时,必须更改每个
组件中的代码。更好的方法是继承以下各项:

public class Unit : Component {
    // logic for your Unit Component
}

public class Human : Unit {

}

public class Soldier : Human {
    Weapon _weapon;

    public void AttachWeapon(Weapon wpn){
        _meWeapon = wpn;
    }

    public void DetachWeapon(){
        if(_meWeapon != null) {
            Destroy(_meWeapon);
            _meWeapon = null;
        }
    }
}
现在您只需处理一个
组件
,您可以确保
武器
的类型适合此特定
组件

//Soldier component
if(wpn is AK47) {
    _meWeapon = wpn;
}
当然,如果您需要
Unity
的内置方法,如
Awake()
Update()
,那么您可以从
monobhavior
继承,而不是从基
组件
类继承

要切换武器,您只需执行以下简单呼叫:

Soldier solider = GetComponent<Soldier>();
soldier.AttachWeapon(AddComponent<AK47>());

这比在可以分配武器的单位上设置武器槽更复杂吗?
Soldier soldier = GetComponent<Soldier>();
soldier.DetachWeapon();