16.保护区域逻辑

  1. 16.游戏场景-保护区域逻辑
    1. 16.1 知识点
      1. 找到游戏场景中的雕塑,拖入特效,让这个特性作为保护区域。之后怪物会往保护区域寻路,对保护区域进行攻击扣血。
      2. 创建保护区域主塔脚本MainTowerObject,继承Monobehaviour。挂载到保护区域特效上,给保护区域特效添加球形碰撞触发器,用于之后的触发检测。搞成单例模式。
      3. 声明当前血量变量,最大血量,是否死亡标识变量
      4. 定义更新血量方法UpdateHp(int hp, int maxHP)。外部传入血量和最大血量来赋值更新血量和最大血量的值。调用 UIManager 的 GetPanel() 方法获取游戏界面的面板实例,并调用GamePanel中的UpdateTowerHp() 方法更新界面上的血量显示。
      5. 定义受伤方法Wound(int dmg),外部传入伤害值 。首先通过时候死亡标识判断保护区域是否已经被打死,如果是,则直接返回,不再减少血量。减少当前血量 hp,根据受到的伤害 dmg 进行减法运算。判断是否死亡,如果当前血量小于等于0,则设定时候死亡标识 isDead 为 true,表示主塔已死亡。可以在这里添加游戏结束的逻辑,例如触发游戏失败的事件或显示游戏结束UI等,之后再补充。最后调用更新血量方法UpdateHp()更新血量显示。
      6. 在 OnDestroy() 方法中,将实例变量 instance 置为 null,表示主塔对象已被销毁,防止其他地方继续引用已被销毁的实例。
    2. 16.2 知识点代码

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

×

喜欢就点赞,疼爱就打赏