16.游戏场景-保护区域逻辑
16.1 知识点
找到游戏场景中的雕塑,拖入特效,让这个特性作为保护区域。之后怪物会往保护区域寻路,对保护区域进行攻击扣血。
创建保护区域主塔脚本MainTowerObject,继承Monobehaviour。挂载到保护区域特效上,给保护区域特效添加球形碰撞触发器,用于之后的触发检测。搞成单例模式。
using UnityEngine;
public class MainTowerObject : MonoBehaviour
{
private static MainTowerObject instance; // 能够被别人快速获取到位置
public static MainTowerObject Instance => instance;
private void Awake()
{
instance = this; // 将当前对象实例赋值给静态变量instance,方便其他地方快速获取该实例
}
// 在 OnDestroy() 方法中,将实例变量 instance 置为 null,表示主塔对象已被销毁,防止其他地方继续引用已被销毁的实例。
private void OnDestroy()
{
instance = null; // 当对象被销毁时,将静态变量instance置为空,防止其他地方继续引用已被销毁的实例
}
}
声明当前血量变量,最大血量,是否死亡标识变量
private int hp; // 当前血量
private int maxHp; // 最大血量
private bool isDead; // 是否死亡
定义更新血量方法UpdateHp(int hp, int maxHP)。外部传入血量和最大血量来赋值更新血量和最大血量的值。调用 UIManager 的 GetPanel() 方法获取游戏界面的面板实例,并调用GamePanel中的UpdateTowerHp() 方法更新界面上的血量显示。
// 更新血量
public void UpdateHp(int hp, int maxHP)
{
this.hp = hp; // 更新当前血量
this.maxHp = maxHP; // 更新最大血量
// 更新界面上血量的显示
UIManager.Instance.GetPanel<GamePanel>().UpdateTowerHp(hp, maxHP);
}
定义受伤方法Wound(int dmg),外部传入伤害值 。首先通过时候死亡标识判断保护区域是否已经被打死,如果是,则直接返回,不再减少血量。减少当前血量 hp,根据受到的伤害 dmg 进行减法运算。判断是否死亡,如果当前血量小于等于0,则设定时候死亡标识 isDead 为 true,表示主塔已死亡。可以在这里添加游戏结束的逻辑,例如触发游戏失败的事件或显示游戏结束UI等,之后再补充。最后调用更新血量方法UpdateHp()更新血量显示。
// 受到伤害
public void Wound(int dmg)
{
// 如果保护区域已经被打死,就没有必要再减血了
if (isDead)
return;
hp -= dmg; // 根据受到的伤害值减少血量
// 死亡逻辑
if (hp <= 0)
{
hp = 0; // 血量归零
isDead = true; // 设定死亡状态为真
// 游戏结束的逻辑
// 这里需要根据实际需求添加游戏结束的逻辑,例如触发游戏失败的事件或显示游戏结束UI等
}
// 更新血量
UpdateHp(hp, maxHp); // 更新血量显示
}
在 OnDestroy() 方法中,将实例变量 instance 置为 null,表示主塔对象已被销毁,防止其他地方继续引用已被销毁的实例。
private void OnDestroy()
{
instance = null; // 当对象被销毁时,将静态变量instance置为空,防止其他地方继续引用已被销毁的实例
}
16.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MainTowerObject : MonoBehaviour
{
private static MainTowerObject instance; // 能够被别人快速获取到位置
public static MainTowerObject Instance => instance;
private void Awake()
{
instance = this; // 将当前对象实例赋值给静态变量instance,方便其他地方快速获取该实例
}
private int hp; // 当前血量
private int maxHp; // 最大血量
private bool isDead; // 是否死亡
// 更新血量
public void UpdateHp(int hp, int maxHP)
{
this.hp = hp; // 更新当前血量
this.maxHp = maxHP; // 更新最大血量
// 更新界面上血量的显示
UIManager.Instance.GetPanel<GamePanel>().UpdateTowerHp(hp, maxHP);
}
// 受到伤害
public void Wound(int dmg)
{
// 如果保护区域已经被打死,就没有必要再减血了
if (isDead)
return;
hp -= dmg; // 根据受到的伤害值减少血量
// 死亡逻辑
if (hp <= 0)
{
hp = 0; // 血量归零
isDead = true; // 设定死亡状态为真
// 游戏结束的逻辑
// 这里需要根据实际需求添加游戏结束的逻辑,例如触发游戏失败的事件或显示游戏结束UI等
}
// 更新血量
UpdateHp(hp, maxHp); // 更新血量显示
}
private void OnDestroy()
{
instance = null; // 当对象被销毁时,将静态变量instance置为空,防止其他地方继续引用已被销毁的实例
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com