Unity学习 2Dadventure 4
2026/5/10 16:23:10 网站建设 项目流程

一 UI - 创建人物状态栏

创建canvas

切换自己创建的控制器

切换比例

通过Alt控制位置

裁切ui设置

自动裁切并手动处理,然后再为需要的命名

设置为固定比例,修改大小和位置

复制一份并且注意层级,调整大小,修改填充设置

这里就是一些个性化的东西,裁切头像就是找到一个人物照片之后使用Mask把底下的face切割后移动

二 UI - 血量更新逻辑的实现

创建脚本PlayStatBar,利用UI里面的Fill Amount把血量百分比值给他来体现血量的变化

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class PlayStatBar : MonoBehaviour { public Image healthImage; public Image healthDelayImage; }

把组件给他

Event事件

创建一个脚本

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; [CreateAssetMenu(fileName ="Event/CharacterEventSO")] public class CharacterEventSO : ScriptableObject { public UnityAction<Character> OnEventRaised; public void RaiseEvent(Character character) { OnEventRaised?.Invoke(character); } }

在character里面加上

public UnityEvent<Character> OnHealthChange;

创建并调用characterEventSO

在UI脚本里创建UIManager统一管理

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class UIManager : MonoBehaviour { public PlayStatBar playStatBar; [Header("事件监听")] public CharacterEventSO healthEvent; void OnEnable() { healthEvent.OnEventRaised += OnHealthEvent; } void OnDisable() { healthEvent.OnEventRaised -= OnHealthEvent; } private void OnHealthEvent(Character character) { var persentage = character.currentHealth / character.maxHealth; playStatBar.OnHealthChange(persentage); } }

character里面添加逻辑

private void Start() { currentHealth = maxHealth; OnHealthChange?.Invoke(this); } public void TakeDamage(Attack attacker) { if(invulnerable) return; if(currentHealth - attacker.damage >0) { currentHealth -= attacker.damage; TriggrInvulnerable(); OnTakeDamage?.Invoke(attacker.transform); } else { currentHealth = 0; OnDie?.Invoke(); } OnHealthChange?.Invoke(this); }

红色血条跟随变化

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class PlayStatBar : MonoBehaviour { public Image healthImage; public Image healthDelayImage; void Update() { if(healthDelayImage.fillAmount > healthImage.fillAmount) { healthDelayImage.fillAmount -= Time.deltaTime; } } /// <summary> /// 接受Health的变化百分比 /// </summary> /// <param name="persentage">百分比:Current/Max</param> public void OnHealthChange(float persentage) { healthImage.fillAmount = persentage; } }

这部分学的很不好,之后老老实实学c#吧🌀👃🌀

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询