返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 2327|回复: 0

[原创] 【原创】英雄无敌项目枪类模块

[复制链接]
发表于 2022-4-30 23:28:40 | 显示全部楼层 |阅读模式

少侠不来段修仙之旅吗~

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
//Gun.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


//自动将AudioSource声音源插件随此脚本挂载而挂载
[RequireComponent(typeof(AudioSource))]

/// <summary>
/// 枪的父类,提供开火、更换弹匣的功能。
/// </summary>
public class Gun : MonoBehaviour
{
    //需要发射子弹的游戏对象变量,公开方便拖拽
    public GameObject Bullets;

    //定义生成子弹后的实例
    private GameObject BulletGo;

    //枪口开火位置点
    public Transform GunFirePoint;

    //定义声音源插件,AudioSource的意义就是能让枪有播放声音的声音源(可以理解为音频播放控制器组件)
    private AudioSource audioSource;

    //发射子弹时的音频片段--拖拽音频文件
    public AudioClip audioClip;

    //定义开火动画,本作业不做动画,暂注释
    public string FireDH = "FireDH";

    //定义动画播放类,这是专门播放动画的工具类
    //本作业不做动画,暂注释
    //public DHPlay DhplayVar;

    //定义枪的动画,在start周期获取
    //本作业不做动画,暂注释
    //private GunDH GunDHVar;

    private bool ISFire;

    //定义当前弹匣最大的容量
    private int AmmoMax=20;

    //定义当前弹匣内子弹数,枪内弹匣的子弹数,不能超过弹匣容量,每次开枪减子弹从这个变量开始减
    public int NowAmmoBullet=20;

    //定义剩余子弹数,身上还带有多少子弹
    public int RemainBullet=120;

    //定义子弹攻击力
    private int ATK = 5;

    //父类如直接写private void Start()则会被子类的Start方法覆盖从而无法执行父类的Start方法。
    //private void Start()
    //{
    //    print("Gun--Start");
    //}

    //为子类提供重写Start方法的机会--重点语句,之后第三阶段详细讲解
    //updata方法也是一样可以使用protected virtual void Updata()  --重点
    protected virtual void Start()
    {
        //print("Gun--Start");

        audioSource = GetComponent<AudioSource>();

        //audioSource = new AudioSource();

        //获取枪的动画
        //本作业不做动画,暂注释
        //GunDHVar = GetComponent<GunDH>();
    }

    /// <summary>
    /// 开火方法
    /// </summary>
    /// <param name="FX">子弹朝向位置</param>
    public void Fireing(Vector3 FX)
    {   //玩家枪发射时:枪口发射位置朝向枪口前方位置
        //敌人枪发射时:从枪口位置朝向玩家头部位置

        //准备子弹-发射子弹前的判断条件
        //判断弹匣内是否包含子弹
        //播放动画时不能发射子弹
        ISFire = GunIfFire();

        //如果判定无动画且不能开火状态,则直接返回,不发射子弹
        /*
        if (GunDHVar != null && ISFire ==false)
            return;
        */

        //如果判定不能开火,则直接返回,不发射子弹
        if (ISFire == false)
            return;

        //播放开火音频
        audioSource.PlayOneShot(audioClip);

        //判定动画存在才能播放开火动画,否则不播放动画,本次作业无开火动画
        //if (GunDHVar) GunDHVar.PlayDHVar.DHPlayFF(GunDHVar.fireDHName);


        //发射子弹

        //创建子弹,根据Bullets游戏对象变量和枪口开火点位置和子弹朝向位置生成子弹!
        //Bullets  发射子弹对象
        //GunFirePoint.position  枪口开火点位置
        //Quaternion.LookRotation(FX)  子弹朝向位置(根据方法传递的实参控制)
        //创建子弹后的游戏物体单独给一个GameObject变量BulletGo
        BulletGo = Instantiate(Bullets,GunFirePoint.position,Quaternion.LookRotation(FX));

        //将Gun类的子弹攻击力传递给获取生成子弹的子弹类里面的攻击力,这句代码需要慢慢理解!!
        BulletGo.GetComponent<Bullet>().BulletAtk = ATK;


    }

    /// <summary>
    /// 更换弹匣方法
    /// </summary>
    public void UpdateAmmo()
    {
        //如果当前弹匣的子弹数与弹匣最大子弹容量数一致,或者剩余子弹数为0,则直接返回,不更换弹匣
        if (NowAmmoBullet == AmmoMax || RemainBullet == 0)
            return;

        //如果剩余子弹数大于弹匣最大子弹容量数,则给弹匣最大子弹容量数,否则给剩余子弹数
        if (RemainBullet >= AmmoMax)
        {
            NowAmmoBullet = AmmoMax;
            RemainBullet = RemainBullet - AmmoMax;
        }
        else
        {
            NowAmmoBullet = RemainBullet;
            RemainBullet = RemainBullet - NowAmmoBullet;
        }

        //播放更换弹匣动画,本作业暂不做动画
        //GunDHVar.PlayDHVar.DHPlayFF(GunDHVar.UpdataDHName);

    }

    /// <summary>
    /// 准备子弹
    /// 判定枪是否可以开火
    /// </summary>
    private bool GunIfFire()
    {
        //判断当前弹匣内是否有子弹和是否正在更换弹匣(判断更换弹匣动画是否播放需要先引用GunDH然后在GunDH类在引用DHPlay类的DHIsPlayering方法)
        //如果都满足条件,则直接返回false,不能开火!
        //本作业不做动画,暂注释
        //if (NowAmmoBullet <= 0 || GunDHVar.PlayDHVar.DHIsPlayering("UpdataDH"))

        //判断当前弹匣内是否有子弹 , 满足条件,则直接返回false,不能开火!
        if (NowAmmoBullet <= 0)
            return false;

        //以下是可以开火的逻辑
        //当前弹匣子弹数减1
        NowAmmoBullet = NowAmmoBullet - 1;

        //如果当前弹匣内没有子弹,则播放缺少子弹动画,本作业暂不做动画
        /*
        if (NowAmmoBullet ==0 )
            GunDHVar.PlayDHVar.DHPlayFF(GunDHVar.LackBulletDHName);
        */

        return true;
    }
}


 楼主| 发表于 2022-4-30 23:30:42 | 显示全部楼层
本帖最后由 da11 于 2022-4-30 23:32 编辑

//DJGun.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 单击枪类,是Gun类的子类,此脚本挂在枪的物体中
/// </summary>
public class DJGun : Gun
{
    //继承自Gun类,根据玩家输入调用相应(开火、更换弹匣)方法。

    //继承父类时,子类执行Start方法后,覆盖父类的Start方法
    //private void Start()
    //{
    //    print("DJGun--Start");
    //}

    //避免继承父类时,子类执行Start方法后,覆盖父类的Start方法,键入override+空格 选择父类的Start方法即可生成让父类也同时可以使用Start的方法
    //父类的Start()方法需使用 protected virtual void Start() 写法 --重点语句,之后第三阶段详细讲解
    protected override void Start()
    {
        base.Start();   //调用父类的Start方法
        //print("DJGun--Start");
    }

    //子类负责挂在物体上,有Update方法
    private void Update()
    {
        //实时检测鼠标左键是否按下,按下则开一枪
        if (Input.GetMouseButtonDown(0))
        {
            //调用父类的Fireing-开火方法
            //父类的GunFirePoint枪口方向信息做实参传递给父类的开火方法
            base.Fireing(base.GunFirePoint.forward);
        }
        //实时检测键盘R键是否按下,按下则更换弹匣
        if (Input.GetKey(KeyCode.R))
        {
            //调用父类的UpdateAmmo-更换弹匣方法
            base.UpdateAmmo();
        }

    }
}


回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-30 23:31:53 | 显示全部楼层
//LJGun.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 连击枪类,是Gun类的子类,此脚本挂在枪的物体中
/// </summary>
public class LJGun : Gun
{
    //继承自Gun类,根据玩家输入调用相应(开火、更换弹匣)方法。

    //定义当前时间变量,用于控制连发枪每一枪的时间间隔
    private float NowTime = 0;

    //继承父类时,子类执行Start方法后,覆盖父类的Start方法
    //private void Start()
    //{
    //    print("LJGun--Start");
    //}

    //避免继承父类时,子类执行Start方法后,覆盖父类的Start方法,键入override+空格 选择父类的Start方法即可生成让父类也同时可以使用Start的方法
    //父类的Start()方法需使用 protected virtual void Start() 写法 --重点语句,之后第三阶段详细讲解
    protected override void Start()
    {
        base.Start();   //调用父类的Start方法
        //print("LJGun--Start");
    }

    private void Update()
    {
        //Update方法每次执行,当前时间加上0.02s
        NowTime = NowTime + 0.02f;

        //实时检测鼠标左键是否按下,按下则连续开枪,并且当前时间大于0.1s才能开枪
        if (Input.GetMouseButton(0) && NowTime >= 0.1f)
        {
            //调用父类的Fireing-开火方法
            //父类的GunFirePoint枪口方向信息做实参传递给父类的开火方法
            base.Fireing(base.GunFirePoint.forward);

            //开一枪后马上重置当前时间,实现间隔开枪
            NowTime = 0;
        }

        //实时检测键盘R键是否按下,按下则更换弹匣
        if (Input.GetKey(KeyCode.R))
        {
            //调用父类的UpdateAmmo-更换弹匣方法
            base.UpdateAmmo();
        }

    }
}




回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-30 23:35:32 | 显示全部楼层
本帖最后由 da11 于 2022-4-30 23:49 编辑

枪类需要在Unity面板上配置相应的属性



敌人枪的调用在敌人AI中调用,访问帖子:https://www.swztdza.cn/dalt/foru ... age=1&extra=#pid660
子弹拖拽需要参考子弹模块,访问帖子:https://www.swztdza.cn/dalt/foru ... 1&extra=#pid663

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表