using Games.LogicObj; using UnityEngine; /// /// 世界UI面板物体的基类 /// // 统一由WorldUiRoot监听主摄像机移动事件,然后更新位置和尺寸 public abstract class WorldUIItem : MonoBehaviour { // 标志物品类型 public abstract WorldUIRoot.WorldUiItemType itemType { get; } // 代替typeof(T)的枚举数值 public abstract UIPathData uiPathData { get; } // 是否根据世界位置进行缩放 public virtual bool scaleByWorldPos { get { return true; } } // 在世界坐标系的位置 public abstract Vector3 worldPosition { get; } // 在Ui坐标系下尺寸;认为Ui坐标系尺寸单位为标准像素尺寸 public abstract float pixelWidth { get; } public RectTransform rectTransform { get; private set; } protected virtual void Awake() { rectTransform = (RectTransform)transform; } public virtual bool CheckDuration() { return true; } public virtual void BackToPool() { if (WorldUIRoot.Instance != null) WorldUIRoot.Instance.Recovery(uiPathData, this); } /// /// 检查是否能够取得世界位置坐标 /// // 注:之前代码有防御 名称面板 丢失绑定目标等错误情况,因此可以重载该函数来做错误判断; public virtual bool CheckPositionValid() { return true; } public virtual void SetPositionAndScale(Vector3 position, float scale) { // 正确的遮挡关系 if (rectTransform == null) { rectTransform = gameObject.GetComponent(); } rectTransform.anchoredPosition3D = position; rectTransform.localScale = Vector3.one * scale; } }