UI设置

血条、暴击提示、伤害血量提示都在一个UIPrefab里面,场景中的每个Entity都动态地在UI中分配一个血条。

如下图,每一个Entity都动态添加一个Item Entity HP。

血条Prefab

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;
}
}
}
/* // 测试平滑
private float prg = 1;
private void OnGUI()
{
if (GUILayout.Button("+"))
{
prg += 0.2f;
SetHPBar(prg);
SetDodge();
}
else if (GUILayout.Button("-"))
{
prg -= 0.2f;
SetHPBar(prg);
SetCritical(696);
SetHurt(336);
}
}*/
}
}

修改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)//trans指的是血条UI的显示位置
{
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();//此时DynamicWnd已经初始化了

Init();//此时各个System才初始化
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();
//...
}