using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; public class UIDamage : MonoBehaviour { public Text numText; private Camera uiCamera; RectTransform rectTrans; List<Tween> numList = new List<Tween>(); void Awake() { uiCamera = CameraController.Instance.transform.GetComponentInChildren<Camera>(); rectTrans = transform.GetComponent<RectTransform>(); EventCenter.AddListener<Vector3, int, int>(EGameEvent.ShowEffectNumber, ShowEffectNumber); } //public void ConnectButonOnClick() { // UIManager.Instance.PushPanel(UIType.CONNECT_PANEL); //} private void OnDestroy() { EventCenter.AddListener<Vector3, int, int>(EGameEvent.ShowEffectNumber, ShowEffectNumber); } /// <summary> /// 根據EffectType不同顯示不同顏色,或者不同內容 /// </summary> /// <param name="worldPos"></param> /// <param name="effectNum"></param> /// <param name="effectType"></param> void ShowEffectNumber(Vector3 worldPos, int effectNum, int effectType) { Vector2 v2 = WorldToUgui(worldPos); Text num = Object.Instantiate(numText); num.transform.SetParent(this.transform); num.transform.localPosition = new Vector3(v2.x, v2.y, 0); num.transform.localScale = Vector3.one; num.transform.localEulerAngles = Vector3.zero; num.gameObject.SetActive(true); num.text = "-" + effectNum; Tweener tween = num.transform.DOLocalMoveY(num.transform.localPosition.y + 100, 2f); tween.SetAutoKill(false); numList.Add(tween); tween.OnComplete(MyComplete); } void MyComplete() { for(int i= numList.Count - 1; i > -1; i--) { if (numList[i].IsComplete()) { numList[i].Kill(); Destroy((numList[i].target as Transform).gameObject); numList.RemoveAt(i); } } } /// <summary> /// 將世界坐標轉換為Ugui坐標 /// 這種算法,cavas不能用填充,只能用居中 /// </summary> /// <param name="position"></param> /// <returns></returns> public Vector2 WorldToUgui(Vector3 position) { Vector2 screenPoint = Camera.main.WorldToScreenPoint(position);//世界坐標轉換為屏幕坐標 Vector2 screenSize = new Vector2(Screen.width, Screen.height); screenPoint -= screenSize / 2;//將屏幕坐標變換為以屏幕中心為原點 Vector2 anchorPos = screenPoint / screenSize * rectTrans.sizeDelta;//縮放得到UGUI坐標 return anchorPos; } }
這里的numList[i].target,是Tween.target。是調用DOLocalMoveY的對象。所以這里是個Transform。
這里還有一個世界轉UGUI的方法。