UI设置
血条、暴击提示、伤害血量提示都在一个UIPrefab里面,场景中的每个Entity都动态地在UI中分配一个血条。
如下图,每一个Entity都动态添加一个Item Entity HP。

ItemEntityHP
脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro;
namespace DarknessWarGodLearning { public class ItemEntityHP : MonoBehaviour { #region UIDefine [SerializeField] Image imgHPGray; [SerializeField] Image imgHPRed;
[SerializeField] Animation criticalAni; [SerializeField] TextMeshProUGUI txtCritical;
[SerializeField] Animation dodgeAni;
[SerializeField] Animation hpAni; [SerializeField] TextMeshProUGUI txtHp; #endregion
public void SetCritical(int critical) { criticalAni.Stop(); txtCritical.text = critical.ToString(); criticalAni.Play(); } public void SetDodge() { dodgeAni.Stop(); dodgeAni.Play(); } public void SetHurt(int hpDamage) { hpAni.Stop(); txtCritical.text = "-" + hpDamage.ToString(); hpAni.Play(); } private bool HpChanged = false; private float duration = 1f; private float startTIme; private float targetPrg; public void SetHPBar(float hpPrg) { imgHPRed.fillAmount = hpPrg; targetPrg = hpPrg; startTIme = Time.time; HpChanged = true; } private void Update() { if (HpChanged) { float t = (Time.time - startTIme) / duration; imgHPGray.fillAmount = Mathf.SmoothStep(imgHPGray.fillAmount, targetPrg,t); if(t > 1) { HpChanged=false; } } }
} }
|
修改DynamicWnd
脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public Transform hpItemRoot; private Dictionary<string,ItemEntityHP> itemDic = new Dictionary<string,ItemEntityHP>(); public void AddHpItemInfo(string key,Transform trans, int hp) { ItemEntityHP item = null; if(itemDic.TryGetValue(key, out item)) { return; } else { var itemHp = resSvc.LoadPrefab(PathDefine.EntityHpItemPrefab, true); itemHp.transform.SetParent(hpItemRoot); itemHp.transform.SetPositionAndRotation(new Vector3(-1000, 0, 0),Quaternion.identity); ItemEntityHP ieh = itemHp.GetComponent<ItemEntityHP>(); ieh.InitItemInfo(trans,hp); itemDic.Add(key, ieh); } }
|
修改Controller
,让它能够获取Prefab中预先放进去的血条显示位置
1
| public Transform hpRoot;
|
在BattleMgr
加载Monster时加载血条:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public void LoadMonsterByWaveID(int waveID) { for (int i = 0; i < mapCfg.monsterList.Count; i++) { MonsterData md = mapCfg.monsterList[i]; if(md.mWave == waveID) { m.SetActive(false); entityMonsterDic.Add(m.name, em); GameRoot.Instance.dynamicWnd.AddHpItemInfo(m.name,mc.hpRoot, em.HP); } } }
|
修改GameRoot内的Bug
我们的DynamicWnd
在游戏一开始初始化时就是开着的,但是DynamicWnd
初始化时各个System还没初始化好:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void Start() { Instance = this; ClearUIRoot();
Init(); DontDestroyOnLoad(this); } private void ClearUIRoot() { Transform canvas = transform.Find("Canvas"); for (int i = 0; i < canvas.childCount; i++) { canvas.GetChild(i).gameObject.SetActive(false); } dynamicWnd.SetWndState(); }
|
我们将上面的dynamicWnd.SetWndState();
放在GameRoot.Init
方法体内
1 2 3 4 5 6 7
| private void Init() { dynamicWnd.SetWndState(); }
|