免责声明:因此标题可能不会过于准确,但它是我能得到的最接近的标题。
所以我在Unity制作一款策略游戏,其想法是会有几种类型的单位'他们可以从一堆武器中选择。这些不同的单位'所有继承自他们的单位类型,然后单位类型继承自基本单位'抽象类,另一方面它是一个类似的故事,武器继承自武器类型,然后继承自基本武器'抽象类。这不是问题,问题在于使特定单位与其分配的武器之间的关系,以便单位类看到它具有什么武器并将其攻击基于所分配的武器,访问其中包含的变量,例如;范围,伤害等。
因为我在视觉上工作得最好,所以我已经绘制出一张图表,显示我的意思是帮助那些仍然对我的问题感到困惑的人
所以顶部的单位是我之前提到的单位抽象类,然后人类是单位类型,然后士兵是稍后将被实施的特定单位,这(如前所述)再次被镜像为武器。 / p>
答案 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;
}
}
}
然后,您可以对Weapon
,RangedWeapon
和AK47
执行相同的操作。但是这种方法基本上没有效率,因为您与其他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()
{
}
}