//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;
}
}
|