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来交错它们。
我该如何解决这个问题?
答案 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);
}