Unity C#如何为单个变量设置Shotgun/AR15两种类型 现有代码无法运行
多枪械类型变量实现方案
你当前代码的核心问题有两个:
- 未声明
gunT变量,也没有对应赋值操作,运行时会触发空引用异常 - 直接用
MonoBehaviour作为gunS的类型,后续调用枪械专属方法需要强制转换,维护成本高
推荐使用公共基类的方案实现,操作步骤如下:
- 第一步:创建枪械公共基类,存放所有枪械共有的属性和方法
// 新建GunBase.cs脚本 public class GunBase : MonoBehaviour { public int damage; public float fireInterval; // 公共虚方法,子类可以重写实现不同逻辑 public virtual void Fire() { // 基础开火逻辑 } }
- 第二步:修改
Shotgun和AR15的继承关系,改为继承自GunBase
// 霰弹枪脚本修改 public class Shotgun : GunBase { // 霰弹枪专属属性 public int pelletCount; // 重写开火方法实现散射逻辑 public override void Fire() { base.Fire(); // 霰弹枪专属开火逻辑 } } // 步枪脚本修改 public class AR15 : GunBase { // 步枪专属属性 public int bulletSpeed; // 重写开火方法实现全自动逻辑 public override void Fire() { base.Fire(); // 步枪专属开火逻辑 } }
- 第三步:修改业务代码,把
gunS类型改为GunBase,补充gunT的声明赋值
// 枪械对象,需要在Inspector拖拽赋值或者代码提前赋值 public GameObject gunT; // 用基类声明,支持存储所有继承自GunBase的枪械类型 public GunBase gunS; private void Start() { SetGun(); } public void SetGun() { if(gunT.name == "Shotgun") { gunS = gunT.GetComponent<Shotgun>(); } else { gunS = gunT.GetComponent<AR15>(); } // 后续直接调用公共方法即可自动适配对应枪械的逻辑 // gunS.Fire(); }
如果不需要调用枪械的专属方法,不想修改现有继承结构,也可以直接补全gunT的声明即可正常运行,后续需要调用对应类型方法时用模式匹配判断转换即可:
public GameObject gunT; public MonoBehaviour gunS; private void Start() { SetGun(); } public void SetGun() { if(gunT.name == "Shotgun") { gunS = gunT.GetComponent<Shotgun>(); } else { gunS = gunT.GetComponent<AR15>(); } // 需要调用专属方法时的写法 if(gunS is Shotgun shotgun) { // 调用霰弹枪专属方法 } else if(gunS is AR15 ar15) { // 调用步枪专属方法 } }
内容的提问来源于stack exchange,提问作者ben
相关产品推荐
相关产品推荐

