Unity3D - 抽象类,Monobehaviour功能

时间:2016-01-12 17:06:39

标签: c# inheritance unity3d

PREAMBLE

所以我过去几周一直在Unity Answers论坛上发布这个问题而没有一个回复。在我看来,这将是一个相对直接的问题,所以我想知道这里是否有人可以帮助我代替那里的答案。

所以我有点困境。

目标

我想在游戏中使用枪支的继承结构。我想创建一个抽象类(Gun),然后使用Gun(Laser,Rifle,RocketLauncher)的子类继承它,然后创建这些武器的特定实例。目前我将其作为一个抽象类,因为Gun的不同子类实现Shoot()函数的方式之间存在很大的差异。 (即火箭发射器将实例化X Rocket游戏对象,而激光可能会使用光线投射来确定即时命中)。

此外,我希望能够在玩家库存中拥有一个枪支列表,并且不希望必须根据其主动武器添加和删除我的播放器中的脚本。如果我能以下列方式构建它们,那对我来说真是太好了:

Rifle ActiveWeapon = new Rifle(parameters);

我也不想让玩家可以使用有限数量的武器,但希望能够在运行时生成它们(例如滴水或精心制作)所以我也不想写一个固定数量的武器脚本。

问题

我遇到的问题是我希望能够利用一些MonoBehaviours派生的方法,例如:

public override void Shoot ()
 {
     if (CanShoot) 
     {
         StartCoroutine(Cooldown());
         Rigidbody bullet = Rigidbody.Instantiate(BulletPrefab, transform.position, transform.rotation);
         ... // Addforce etc.
         ...
     }
 }
public IEnumerator Cooldown()
 {
     CanShoot = false;
     yield return new WaitForSeconds (FireRate);
     CanShoot = true;
 }

显然,由于这不是MonoBehaviour类,我不能使用Instantiate等函数来创建项目符号,或者使用WaitForSeconds来交错它们。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

你可以有一个继承自MonoBehaviour的抽象类,以下工作正常:

public abstract class AbstractClass : MonoBehaviour
{
    protected abstract void pouet();
}

public class InheritClass : AbstractClass 
{

    // Use this for initialization
    void Start ()
    {
        StartCoroutine(pouetCoroutine());
    }

    protected override void pouet()
    {
        Debug.Log("pouet");
    }

    private IEnumerator pouetCoroutine()
    {
        yield return null;
        pouet();
    }
}

如果您不希望您的抽象类位于GameObject中,您可以使用外部游戏对象通过object pooling system来管理实例化。

关于协同程序,您可以使用启动和停止协同程序的协程引擎。你只需要一个字典和一个公共函数来启动协同程序,并保留一个id作为访问它的密钥,如果你需要稍后停止它。

private startcoroutine(int id, IEnumerator ienum)
{
    Coroutine c = StartCoroutine(ienum);
    dictionary.Add(id, c);
}