You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#如何为单个变量设置Shotgun/AR15两种类型 现有代码无法运行

多枪械类型变量实现方案

你当前代码的核心问题有两个:

  1. 未声明gunT变量,也没有对应赋值操作,运行时会触发空引用异常
  2. 直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:54:01