18.游戏场景-坦克基类
18.1 知识点
明确坦克基类要实现的东西
- 攻击力、防御力、最大当前血量等属性
- 坦克炮台的位置信息
- 移动速度、旋转速度等参数
- 死亡特效相关信息
创建坦克基类脚本,继承坦克基类的最终坦克脚本是要挂载到对应坦克预制体上的,所以让坦克基类继承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