一 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#吧🌀👃🌀