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的方法。