Unity 回合制战斗系统(中级篇)-血条和伤害数值
項目文件找出來了,老版本的腳本有報錯,我在新版2019.4.21f1c1下解決了報錯,戰斗場景可以正常跑的。
需要的同學點下面地址下載(關注就行啦不用積分),祝大家都早日學成
項目包下載
————————————————————————??????????????
本人游戲策劃一枚,愛好游戲設計開發
今天沒有做太多內容,只是在昨天的基礎上增加了戰斗傷害數值的顯示及動畫,因為又涉及到了之前UI控制相關的腳本,就順便把這一塊做了優化,效果請看Gif
接下來就是本文主要內容:集中介紹血條及傷害數值的實現及腳本
?
1. 血條
首先是制作一個血條的預制體,由底圖、血條圖和文本組成,其中文本用來顯示單位名字,如下圖,其中血條圖片的Image Type設置成Filled
之前是用一個BattleUIManager完成了血條的所有操作,內容比較亂,這邊做了優化,只用它來負責實例化腳本,并給腳本設置好“主人”,之后的血條狀態由它自身的BloodUpdate函數根據主人的狀態來更新。
?
新的BattleUIManager如下:
?
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement;public class BattleUIManager : MonoBehaviour {//把做好的預制體賦給這個變量public GameObject bloodBar;//玩家和怪物的數組private GameObject[] playerUnits;private GameObject[] enemyUnits;//統一調整血條的偏移量public float bloodXOffeset;public float bloodYOffeset;public float bloodZOffeset;void Start (){//搜索所有參戰的玩家對象,逐個創建血條playerUnits = GameObject.FindGameObjectsWithTag("PlayerUnit");foreach (GameObject playerUnit in playerUnits){GameObject playerBloodBar = Instantiate(bloodBar) as GameObject;//實例化后設置到正確的畫布分組里,便于管理也保證能正常顯示playerBloodBar.transform.SetParent(GameObject.Find("BloodBarGroup").transform, false);//設置血條的主人,BloodUpdate將根據這個主人的狀態來更新血條playerBloodBar.GetComponent<BloodUpdate>().owner = playerUnit;}//搜索所有參戰的怪物對象,逐個創建血條enemyUnits = GameObject.FindGameObjectsWithTag("EnemyUnit");foreach (GameObject enemyUnit in enemyUnits){GameObject enemyBloodBar = Instantiate(bloodBar) as GameObject;enemyBloodBar.transform.SetParent(GameObject.Find("BloodBarGroup").transform, false);//設置血條的主人,BloodUpdate將根據這個主人的狀態來更新血條enemyBloodBar.GetComponent<BloodUpdate>().owner = enemyUnit;}}//供按鈕調用的函數,此處可忽略public void GoToScene(string name){SceneManager.LoadScene(name);}}
血條預制體上掛的BloodUpdate腳本如下:
?
?
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class BloodUpdate : MonoBehaviour {//血條的主人,在創建時會通過BattleUIManager賦值public GameObject owner;//血條的長度數值,1為滿格private Image ownerBloodFill;//獲取UI控制腳本的引用,要從它那里獲取統一的偏移量private BattleUIManager uiManager;//主人的3D空間位置private Vector3 playerBlood3DPosition;//將主人的3D位置映射到屏幕之后的2D位置private Vector2 playerBlood2DPosition;void Start(){//顯示血條主人的名字Text ownerText = gameObject.transform.Find("OwnerName").GetComponent<Text>();ownerText.text = owner.name;//獲取UI控制腳本的引用uiManager = GameObject.Find("BattleUIManager").GetComponent<BattleUIManager>();}void Update(){if (owner.tag=="PlayerUnit" || owner.tag == "EnemyUnit"){//更新血條長度ownerBloodFill = gameObject.transform.Find("BloodFill").GetComponent<Image>();ownerBloodFill.fillAmount = owner.GetComponent<UnitStats>().bloodPercent; //bloodPercent在每個單位的UnitStats腳本中存儲//更新血條位置//獲取當前主人的空間位置,然后轉換為2D屏幕位置playerBlood3DPosition = owner.transform.position + new Vector3(uiManager.bloodXOffeset, uiManager.bloodYOffeset, uiManager.bloodZOffeset);playerBlood2DPosition = Camera.main.WorldToScreenPoint(playerBlood3DPosition);gameObject.GetComponent<RectTransform>().position = playerBlood2DPosition;}//如果主人死了,則設置為未激活狀態if (owner.GetComponent<UnitStats>().IsDead()){gameObject.SetActive(false);}}}這樣血條的生成、跟隨和更新就全部實現了。
?
?
2. 傷害數值
傷害值的實現跟血條類似,也是先完成預制體,然后我給傷害文本制作了一個放大出現,并漸變消失的過程動畫,字體的移動是通過腳本來實現的。
傷害值的生成直接放到了回合控制腳本中,在執行ReceiveDamage之后立即生成;
//被攻擊者承受傷害currentActUnitTarget.GetComponent<UnitStats>().ReceiveDamage(attackData);//實例化傷害字體并設置到畫布上(字體位置和內容的控制放在它自身的腳本中)GameObject thisText = Instantiate(bloodText) as GameObject;thisText.transform.SetParent(GameObject.Find("BloodTextGroup").transform, false);還是跟血條一樣的管理,生成后立即設置到正確的畫布分組中;
?
以下是掛在傷害值預制體上的DamageFloatUp腳本:
?
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class DamageFloatUp : MonoBehaviour {private BattleTurnSystem turnScript; //回合控腳本的引用//受到傷害單位的位置private Vector3 takeDamageUnit3DPosition;private Vector2 takeDamageUnit2DPosition;void Start (){turnScript = GameObject.Find("BattleManager").GetComponent<BattleTurnSystem>(); //查找引用//計算傷害者的3D位置并轉化為屏幕2D位置takeDamageUnit3DPosition = turnScript.currentActUnitTarget.transform.position + new Vector3(0,1,0); //適當上移修正位置takeDamageUnit2DPosition = Camera.main.WorldToScreenPoint(takeDamageUnit3DPosition);gameObject.GetComponent<RectTransform>().position = takeDamageUnit2DPosition;//設置數字內容gameObject.GetComponent<Text>().text = "-"+ turnScript.attackData;//延遲銷毀自身StartCoroutine("WaitAndDestory");}void Update () {//向上漂浮控制gameObject.GetComponent<RectTransform>().anchoredPosition = gameObject.GetComponent<RectTransform>().anchoredPosition + new Vector2(0, 1);}//延遲銷毀IEnumerator WaitAndDestory(){yield return new WaitForSeconds(1.5f);Destroy(gameObject);} }以上
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Unity 回合制战斗系统(中级篇)-血条和伤害数值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教女朋友用Python快速绘制图表
- 下一篇: 两台windows电脑通过以太网互pin