18.坦克基类

18.游戏场景-坦克基类


18.1 知识点

明确坦克基类要实现的东西

  1. 攻击力、防御力、最大当前血量等属性
  2. 坦克炮台的位置信息
  3. 移动速度、旋转速度等参数
  4. 死亡特效相关信息

创建坦克基类脚本,继承坦克基类的最终坦克脚本是要挂载到对应坦克预制体上的,所以让坦克基类继承Monobehaviour,声明坦克基类抽象出来的共有成员变量,创建坦克基类抽象出来的共有方法,有些方法可以完全抽象,有些方法可以部分实现

//坦克基类 抽象类
public abstract class TankBaseObj : MonoBehaviour
{
    //攻击力 防御力 最大当前血量相关
    public int atk;
    public int def;
    public int maxHp;
    public int hp;

    //所有坦克都有炮台相关
    public Transform tankHead;

    //移动旋转速度相关
    public float moveSpeed = 10;
    public float roundSpeed = 100;
    public float headRoundSpeed = 100;

    //死亡特效 关联对应预设体 死亡的时候 动态创建出来 设置位置即可
    public GameObject deadEff;

    //开火抽象方法 子类重写开火行为即可
    public abstract void Fire();

    /// <summary>
    /// 我被别人攻击 造成我自己受伤
    /// </summary>
    public virtual void Wound(TankBaseObj other)
    {
        int dmg = other.atk - this.def;
        if (dmg <= 0)
            return;
        //如果伤害大于0 就应该减血
        this.hp -= dmg;
        //判断 如果血量 <= 0了 就应该死亡
        if (this.hp <= 0)
        {
            this.hp = 0;
            this.Dead();
        }
    }

    /// <summary>
    /// 死亡行为 当自己血量小于等于0时 就应该死亡
    /// </summary>
    public virtual void Dead()
    {
        //对象死亡 无非就是在场景上移除该对象
        Destroy(this.gameObject);
        //死亡的时候 可能所有坦克对象都应该播放一个死亡特效
        if (deadEff != null)
        {
            //实例化特效对象时 顺便设置位置和角度
            GameObject effObj = Instantiate(deadEff, this.transform.position, this.transform.rotation);
            //设置音效相关信息
            AudioSource audioSource = effObj.GetComponent<AudioSource>();
            //根据音效数据设置音效大小和是否播放
            audioSource.volume = GameDataMgr.Instance.musicData.soundValue;
            audioSource.mute = !GameDataMgr.Instance.musicData.isOpenSound;
            //播放音效
            audioSource.Play();
        }
    }
}

18.2 知识点代码

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

//坦克基类 抽象类
public abstract class TankBaseObj : MonoBehaviour
{
    //攻击力 防御力 最大当前血量相关
    public int atk;
    public int def;
    public int maxHp;
    public int hp;

    //所有坦克 都有炮台相关
    public Transform tankHead;

    //移动旋转速度相关
    public float moveSpeed = 10;
    public float roundSpeed = 100;
    public float headRoundSpeed = 100;

    //死亡特效 关联对应预设体 死亡的时候 动态创建出来 设置位置即可
    public GameObject deadEff;

    /// <summary>
    /// 开火抽象方法 子类重写开火行为即可
    /// </summary>
    public abstract void Fire();
    
    /// <summary>
    /// 我被别人攻击 造成我自己受伤 可以直接写了
    /// </summary>
    /// <param name="other"></param>
    public virtual void Wound(TankBaseObj other)
    {
        int dmg = other.atk - this.def;
        if (dmg <= 0)
            return;
        //如果上海大于0 就应该减血
        this.hp -= dmg;
        //判断 如果血量 <=0了 就应该死亡
        if(this.hp <= 0)
        {
            this.hp = 0;
            this.Dead();
        }
    }

    /// <summary>
    /// 死亡行为 当自己血量小于等于0时 就应该死亡
    /// </summary>
    public virtual void Dead()
    {
        //对象死亡 无非就是在场景上移除该对象
        Destroy(this.gameObject);
        //死亡的时候 可能所有坦克 对象 都应该播放一个对象的特效
        if(deadEff != null)
        {
            //就是实例化对象时  顺便 把位置和角度 都一起设置了
            GameObject effObj = Instantiate(deadEff, this.transform.position, this.transform.rotation);
            //由于该特效对象身上 直接关联了音效 所以我们可以在此处 把音效播放相关也控制了
            AudioSource audioSource = effObj.GetComponent<AudioSource>();
            //根据音乐数据 设置 音效 大小 和是否 播放
            //设置音效大小
            audioSource.volume = GameDataMgr.Instance.musicData.soundValue;
            //音效是否播放
            audioSource.mute = !GameDataMgr.Instance.musicData.isOpenSound;
            //避免没有勾选 Play on Awake 执行一次音效
            audioSource.Play();
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏