首页 > 其他分享 >Unity引擎2D游戏开发,血量更新逻辑的实现

Unity引擎2D游戏开发,血量更新逻辑的实现

时间:2023-12-29 17:25:40浏览次数:26  
标签:ScriptableObject 创建 Character 血量 Event 2D Unity public

思路

image
能够发现Fill Amount就是控制血量条长度的控件,它是一个百分比值,则可以通过当前血量除以最大血量得到当前血量的百分比。那么,也就能控制血量条的长度了。

编写基本的更新逻辑

创建C#文件
image

将C#文件挂载到Player State Bar
image

在C#文件中调用UI组件前,需要调用UI组件库

using UnityEngine.UI;

在PlayerStateBar C#文件中,创建三个全局变量,分别代表绿色血条、红色血条和精力条

// 绿色血条
public Image healthImage;
// 红色血条
public Image healthDelayImage;
// 精力条
public Image powerImage;

Hierarchy中拖动Image到各自的位置
image

在PlayerStateBar中创建OnHealthChange()方法,用于处理血量变更时执行的代码

/// <summary>
/// 接受Health的变更百分比
/// </summary>
/// <param name="percentage">百分比:current / Max</param>
public void OnHealthChange(float percentage)
{
    healthImage.fillAmount = percentage;
}

创建关于血量的ScriptableObject事件

这时候就需要从Player的Character中传递血量数据到此处,那么怎么样才能安全的完整的跨物体甚至跨场景来传递数值呢?
image

这时候需要利用ScriptableObject进行传递,它是一个持久化存储在项目中的资产文件类型,例如
image

后缀名为.Asset

在Scripts下创建ScriptableObject文件夹,并创建CharacterEventSO。因为是利用ScriptableObject来创建事件,因此以EventSO结尾
image

打开CharacterEventSO C#文件,继承ScriptableObject

public class CharacterEventSO : ScriptableObject
{
}

在上面写上描述用以生成ScriptableObject资产文件

[CreateAssetMenu(fileName = "Event/CharacterEventSO")]
public class CharacterEventSO : ScriptableObject
{
}

这样就能在Project窗口中添加此资产文件
image

创建一个UnityAction的全局变量,用于传递Character数据

// 只传递Character数据
public UnityAction<Character> OnEventRised;

创建RaiseEvent()事件启动方法

/// <summary>
/// 启动事件
/// </summary>
/// <param name="character">谁想启动这个事件,就把自己的Character传递进去</param>
public void RaiseEvent(Character character)
{
    OnEventRised?.Invoke(character);
}

在Assets中创建Events文件夹,在内部创建SriptableObject事件
image

接下来,在Character代码脚本当中,只要血量发生变化就调用EventSO,把当前血量传递过去

用Unity Event进行广播,则在Character C#脚本中,添加如下全局变量

public UnityEvent<Character> OnHealthChange;

然后在Player的Character中,将上述的ScriptableObject Event拖入,并选择RaiseEvent()方法。从而,当人物血量有了变化,即可广播出去。
image

接下来,Player State Bar来监听,因为要使血条栏变少

监听ScriptableObject事件

在Hierarchy中,创建一个GameObject,用于监听所有关于UI的事件
image

在Scripts下,创建一个UIManager的C#脚本
image

绑定到UI Manager
image

C#代码中,创建一个CharacterEventSO的全局变量

public class UIManager : MonoBehaviour
{
    [Header("事件监听")]
    public CharacterEventSO healthEvent;

}

在UI Manager中,绑定Character Event SO的Event文件
image

此时,就能够成功监听Character Event SO的Event文件,利用了Character Event SO的Event文件进行中间件传递了一些数据

继续编写血条更新逻辑

在UIManager C#脚本中,创建OnEnable()方法和OnDisable()方法。并在内部添加OnHealthEvent事件进行监听

private void OnEnable()
{
    healthEvent.OnEventRised += OnHealthEvent;
}

private void OnDisable()
{
    healthEvent.OnEventRised -= OnHealthEvent;
}

OnEnable()即启动事件方法,OnDisable()为关闭事件方法,两者均为固定方法

由于需要对血条栏进行控制,所以添加状态栏的全局变量

public PlayerStateBar playerStateBar;

然后创建OnHealthEvent()方法,在内部对血条进行计算,并赋予给playerStateBar的OnHealthChange()方法

private void OnHealthEvent(Character character)
{
    var percentage = character.currentHealth / character.maxHealth;
    playerStateBar.OnHealthChange(percentage);
}

打开Hierarchy,选中UI Manager,将对应的组件拖入
image

打开Character,虽然创建了OnHealthChange变量,但是并没有对其进行调用。那么就需要在受伤时和初始化时进行调用

public void TakeDamage(Attack attacker)
{
    if (invulnerable)
    {
        return;
    }
    if (currentHealth - attacker.damage > 0) 
    {
        currentHealth -= attacker.damage;
        TriggerInvulnerable();
        // 执行受伤
        OnTakeDamage?.Invoke(attacker.transform);
    } else
    {
        currentHealth = 0;
        // 触发死亡
        onDie?.Invoke();
    }
    // 进行血条的扣除
    OnHealthChange?.Invoke(this);
}
private void Start()
{
    currentHealth = maxHealth;
    OnHealthChange?.Invoke(this);
}

红色血条的扣除

打开PlayerStateBar脚本,由于healthDelayImage要跟随healthImage变化,所以在Update()中进行

判断红色血条是否大于绿色血条的值,如果大于,则扣除时间的修正进行变化

private void Update()
{
    if (healthDelayImage.fillAmount > healthImage.fillAmount)
    {
        healthDelayImage.fillAmount -= Time.deltaTime;
    }
}

标签:ScriptableObject,创建,Character,血量,Event,2D,Unity,public
From: https://www.cnblogs.com/xinlindeyu/p/17935304.html

相关文章

  • Unity引擎2D游戏开发,UI绘制创建人物状态栏
    下载并导入UI资源前往UnityAssetsStore中下载添加此资源打开Unity中的PackageManager,选择MyAssets,点击Import导入项目中取消选择Scene,其他的全都勾选上,然后点击Import然后在Assets文件夹下方会出现MStudio文件夹,此处就是插件的目录打开ColorPalette,能够看到不同前......
  • mac m1 编译cocos2d-x 在模拟器上运行 一些问题汇总
     如果涉及到侵权请联系本人删除 1  》〉/Users/yzfhkms-m/Library/Developer/Xcode/DerivedData/formi-dlcfwgxcmidqefdkxnvnfwfprpfs/Build/Products/Debug-iphonesimulator/formi-mobile.appisnotavalidpathtoanexecutablefile.Pleaserebuildtheprojectto......
  • 【Unity百宝箱】游戏中的观察者模式
    【Unity百宝箱】游戏中的观察者模式原创 打工人小棋 打工人小棋 2023-04-2713:35 发表于广东Hi,大家好,我是游戏区“bug主”打工人小棋! 今天我想和大家聊一聊游戏中的观察者模式~近两期视频,都是在为下一期视频做准备,在下期视频中,大家将会看到用户数据存储、以......
  • 【Unity百宝箱】游戏中的用户数据存档
    【Unity百宝箱】游戏中的用户数据存档原创 打工人小棋 打工人小棋 2023-04-1700:04 发表于广东Hi大家好,我是游戏区Bug打工人小棋。在游戏开发过程中,我们经常有存储用户数据的这一需求,比方说:游戏音量、关卡进度、任务进度等等。在联网游戏中,往往会把一些用户核心......
  • 【泰裤辣 の Unity百宝箱】Canvas组件四件套讲解
    【泰裤辣のUnity百宝箱】Canvas组件四件套讲解原创 打工人小棋 打工人小棋 2023-05-1613:24 发表于广东1.介绍在上一期内容中,我分享了一套简单易用的UI框架。没想到大家的学习热情这么高,讨论度是目前所有内容最高的。由此可见,天下苦UI(秦)久已!!!接下去,我们继续......
  • Unity解析key不确定的Json
    遇到Json的key不固定时,只需要解析value,如下Jsondata下的key(1和2)是变化的:{"status":1,"msg":"success","data":["1:":{"atitle":"test",......
  • Unity_U_OP1 ScriptableObject 替代单例
    核心思想:解耦GameManager单例模式,不再由一个单例管理所有事件触发,拆分成无数个小单例,各自管理优点:更加灵活的事件管理模式复用性高,对于相关类型的事件,只需要写一遍代码,剩下的拖拖拖就可以实现相同的功能。缺点:管理起来相对麻烦不利于维护,除非对这个系统非常了解,要不然排......
  • Maya与Unity模型尺度统一
    Maya与Unity模型尺度统一Maya建模默认使用的单位是cm,Unity使用的是m,有时候可能需要把Maya中建好的模型导入到Unity中,因此这篇文章介绍如何修改Maya的默认建模单位,从而使得二者的尺度统一。进入窗口,设置,首选项。修改为m......
  • Unity引擎2D游戏开发,敌人追击状态的转换
    思路:从敌人的位置发射一道射线或者一片区域来对玩家实体进行检测,如果检测倒玩家,则进行追击进攻利用BoxCast()即可实现BoxCast()官方文档:https://docs.unity3d.com/cn/2022.3/ScriptReference/Physics2D.BoxCast.html创建检测区域由于BoxCast需要众多参数,所以在Enemy中创建......
  • Unity3D 如何提升游戏运行效率详解
    前言Unity3D是一款非常强大的游戏引擎,但是在处理复杂场景和大量资源时,游戏运行效率可能会遇到一些问题。本文将详细介绍如何提升Unity3D游戏的运行效率,包括技术详解和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀使用合适的资源压缩......