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

时间:2017-02-02 14:03:51

标签: c# class unity3d

免责声明:因此标题可能不会过于准确,但它是我能得到的最接近的标题。

所以我在Unity制作一款策略游戏,其想法是会有几种类型的单位'他们可以从一堆武器中选择。这些不同的单位'所有继承自他们的单位类型,然后单位类型继承自基本单位'抽象类,另一方面它是一个类似的故事,武器继承自武器类型,然后继承自基本武器'抽象类。这不是问题,问题在于使特定单位与其分配的武器之间的关系,以便单位类看到它具有什么武器并将其攻击基于所分配的武器,访问其中包含的变量,例如;范围,伤害等。

因为我在视觉上工作得最好,所以我已经绘制出一张图表,显示我的意思是帮助那些仍然对我的问题感到困惑的人

enter image description here

所以顶部的单位是我之前提到的单位抽象类,然后人类是单位类型,然后士兵是稍后将被实施的特定单位,这(如前所述)再次被镜像为武器。 / p>

3 个答案:

答案 0 :(得分:1)

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

// 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;
        }
    }
}

然后,您可以对WeaponRangedWeaponAK47执行相同的操作。但是这种方法基本上没有效率,因为您与其他Component相关,并且当您想要改进某些内容时,必须更改每个Component中的代码。更好的方法是继承以下每一个:

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;
        }
    }
}

现在您只需要处理一个Component,并且可以确保Weapon的类型适合此特定Component

//Soldier component
if(wpn is AK47) {
    _meWeapon = wpn;
}

当然,如果您需要Unity的内置方法,例如Awake()Update(),那么您可以继承MonoBehaviour而非Component 1}} class。

然后能够切换武器你可以做简单的调用,如:

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

然后在Soldier组件中,您可以使用对该特定Weapon的引用。 要分离您的AK47,您可以致电:

Soldier soldier = GetComponent<Soldier>();
soldier.DetachWeapon();

答案 1 :(得分:0)

你能做的就是为当前的武器拥有一个公共财产(有吸气剂和私人安装者)。

public class Soldier : Human
{
    public Weapon CurrentWeapon {get; private set;}
    [...]
}

然后您可以使用以下方式从士兵那里获取武器:

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

希望它有所帮助!

答案 2 :(得分:0)

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

例如:

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()
     {
     }
}