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来交错它们。
我应该如何解决这个问题?
您可以有一个从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);
}