开火射击的初步实现(1)——Unity随手记(2021.1.25)

今天实现的内容:

武器的初步实现:

  • 武器接口

定义了武器的基本功能,也就是执行攻击。不同的武器有不同的具体攻击方式

namespace Scripts.Weapon
{
    // 武器接口
    public interface IWeapon
    {
        // 用于执行攻击
        void DoAttack();
    }
}
  • 枪基类

枪这种武器的类,枪是一种发射子弹进行攻击,有弹匣概念,需要装填子弹的武器。枪基类定义了枪的携带弹药量,弹匣弹药量,射击速率,攻击方式,引用了攻击时的各种特效,声明了发射子弹和重新装填的方法供具体的派生类(也就是不同的枪,突击步枪,手枪,霰弹枪)来实现,来达到不同枪械射击时的差异。

using UnityEngine;

namespace Scripts.Weapon
{
    // 枪械类
    public abstract class Firearms : MonoBehaviour,IWeapon
    {
        // 枪口位置 用于生成枪焰粒子效果
        public Transform muzzlePoint;
        // 抛出蛋壳的位置
        public Transform casingPoint;

        // 枪焰粒子效果
        public ParticleSystem muzzleParticle;
        // 抛壳粒子效果
        public ParticleSystem casingParticle;

        // 弹匣弹药量
        public int ammoInMag = 30;
        // 能携带的最大弹药数
        public int maxAmmoCarried = 120;

        // 射速速率 一秒钟能打几发
        public float fireRate;
        // 上一次开火的时间
        private float lastFireTime;

        // 当前弹匣弹药量
        protected int currentAmmoInMag = 30;
        // 当前携带的弹药数
        protected int currentAmmoCarried = 120;

        // 枪械动画
        protected Animator GunAnimator;

        // virtual修饰符方便子类修改
        protected virtual void Start()
        {
            currentAmmoInMag = ammoInMag;
            currentAmmoCarried = maxAmmoCarried;
        }

        // 执行攻击
        public void DoAttack()
        {
            // 如果弹匣里有弹药
            if (currentAmmoInMag <= 0) return;
            // 弹药减一
            currentAmmoInMag -= 1;
            // 发射子弹
            Shooting();
            // 重置上一次发射时间
            lastFireTime = Time.time;
        }

        // 发射子弹 需要派生类来具体实现
        protected abstract void Shooting();
        // 装填 
        protected abstract void Reload();

        // 是否能够射击 用于武器的射速限制
        private bool isAllowShooting()
        {
            return (Time.time - lastFireTime > 1 / fireRate);
        }
    }
}
  • 突击步枪类

一个具体的枪械种类,按住扳机可以持续开火,换弹一次换一个弹匣。当然这个脚本还没写完。

using UnityEngine;

namespace Scripts.Weapon
{
    public class AssaultRifle : Firearms
    {
        // 开火 需要派生类来具体实现
        protected override void Shooting()
        {
            Debug.Log("Shooting");
        }

        // 装填 
        protected override void Reload()
        {

        }

        private void Update()
        {
            if(Input.GetMouseButton(0))
            {
                DoAttack();
            }
        }
    }
}

BUG以及缺陷:

由于我也不太想在特效上花费太多时间。粒子效果暂时丑了点。


值得注意的:

这是目前关于粒子效果及灯光效果的实现方法,首先在枪械基类里写上virtual的Update。将特效时刻处于关闭状态。

        protected virtual void Update()
        {
            muzzleLight.enabled = false;
            muzzleParticle.Stop();
        }

在突击步枪类中override掉枪械基类中的Update,当然依然要运行基类的Update。

        protected override void Update()
        {
            base.Update();
            if (Input.GetMouseButton(0))
            {
                DoAttack();
            }

        }

很蠢办法,是吧?😂


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页