Unity3D - Abstract Class, Monobehaviour functionality
序言
所以过去几周我一直在统一答案论坛上讨论这个问题,没有一个回复。在我看来,这将是一个相对直截了当的问题,所以我想知道这里是否有人可以帮助我,而不是在那里的答案。
所以我有点进退两难。
目标
我想在我的游戏中使用枪的继承结构。我想做一个抽象的类(枪),然后有枪的子类(激光,步枪,火箭发射器),继承它,然后创建这些武器的具体实例。现在我把它作为一个抽象类来做,因为gun的不同子类实现shoot()函数的方式有很大的差异。(即,火箭发射器将实例化X火箭游戏对象,而激光可能使用光线投射来确定瞬间命中)。
此外,我希望能够在玩家库存中有一个枪支列表,并且不想根据他们的活动武器在我的玩家中添加和删除脚本。如果我能用以下方式来建造它们,那对我来说就太好了:
1 |
我也不想让玩家拥有有限数量的武器,但我希望能够在运行时生成它们(例如水滴或精心制作的武器),所以我也不想编写固定数量的武器脚本。
问题
我遇到的问题是,我希望能够使用一些单性行为衍生的方法,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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继承的抽象类,以下工作正常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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中,可以使用外部gameobject通过对象池系统管理声明。
关于协程,你可以使用一个协程引擎来启动和停止它们。如果以后需要停止协同程序,您只需要有一个字典和一个公共函数来启动协同程序并保留一个ID作为访问它的键。
1 2 3 4 5 | private startcoroutine(int id, IEnumerator ienum) { Coroutine c = StartCoroutine(ienum); dictionary.Add(id, c); } |