Unity3D-抽象类,单一行为功能

本文关键字:功能 单一行 抽象类 Unity3D- | 更新日期: 2023-09-27 18:29:56

序言

所以在过去的几周里,我一直在Unity Answers论坛上提出这个问题,但没有得到任何回复。在我看来,这将是一个相对直接的问题,所以我想知道这里是否有人能帮助我,而不是那里的答案。

所以我有点左右为难。


目标

我想在我的游戏中使用枪支的继承结构。我想创建一个抽象类(Gun),然后有Gun的子类(激光、步枪、火箭发射器),从中继承,然后创建这些武器的特定实例。目前,我是作为一个抽象类来做这件事的,因为Gun的不同子类实现Shoot()函数的方式有很大的差异。(即,火箭发射器将实例化X rocket GameObjects,而激光可能会使用光线投射来确定即时命中)。

此外,我希望能够在玩家库存中有一个枪支列表,不想根据他们的活动武器从我的玩家中添加和删除脚本。如果我能以以下方式构建它们,那对我来说太好了:

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

显然,由于这不是一个MonoBehavior类,我不能使用Instantiate之类的函数来创建项目符号或使用WaitForSeconds来交错它们。

我应该如何解决这个问题?

Unity3D-抽象类,单一行为功能

您可以有一个从MonoBehavior继承的抽象类,以下操作很好:

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中,你可以使用一个外部游戏对象来管理对象池系统的实例化。

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

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