106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using System.Collections; | |||
|  | using UnityEngine; | |||
|  | using UnityEngine.UI; | |||
|  | 
 | |||
|  | public class HUDBase : MonoBehaviour | |||
|  | { | |||
|  |     public Action<HUDBase> DelDestroy; | |||
|  | 
 | |||
|  |     public bool HasTarget => mTargetTrans != null; | |||
|  |     public Transform TargetTrans => mTargetTrans; | |||
|  | 
 | |||
|  |     protected RectTransform mRectTrans = null; | |||
|  | 
 | |||
|  |     protected Transform mTargetTrans = null; | |||
|  |     protected Canvas mRootCanvas = null; | |||
|  |     protected Camera mCamera = null; | |||
|  |     protected float mHOffset; | |||
|  |     protected bool mIsActive = false; | |||
|  | 
 | |||
|  |     private void Awake() | |||
|  |     { | |||
|  |         mRectTrans = GetComponent<RectTransform>(); | |||
|  |         if (mRectTrans == null) | |||
|  |         { | |||
|  |             Debug.LogError("RectTransform is invalid."); | |||
|  |             return; | |||
|  |         } | |||
|  | 
 | |||
|  |         OnAwake(); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void Init(Transform pTargetTrans, Canvas pRootCanvas, Camera pCamera, float pHOffset) | |||
|  |     { | |||
|  |         if (pTargetTrans == null) | |||
|  |         { | |||
|  |             Debug.LogError("Target is invalid."); | |||
|  |             return; | |||
|  |         } | |||
|  | 
 | |||
|  |         mTargetTrans = pTargetTrans; | |||
|  |         mRootCanvas = pRootCanvas; | |||
|  |         mCamera = pCamera; | |||
|  |         mHOffset = pHOffset; | |||
|  |         mIsActive = true; | |||
|  | 
 | |||
|  |         Refresh(); | |||
|  | 
 | |||
|  |         OnInit(); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void Refresh() | |||
|  |     { | |||
|  |         if (!HasTarget || mCamera == null) | |||
|  |             return; | |||
|  | 
 | |||
|  |         Vector3 worldPosition = mTargetTrans.position + Vector3.up * mHOffset; | |||
|  |         Vector3 screenPosition = mCamera.WorldToScreenPoint(worldPosition); | |||
|  | 
 | |||
|  |         Vector2 position; | |||
|  |         if (RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)mRootCanvas.transform, screenPosition, mRootCanvas.worldCamera, out position)) | |||
|  |         { | |||
|  |             mRectTrans.localPosition = position; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public void RefreshHeight(float pHeight) | |||
|  |     { | |||
|  |         mHOffset = pHeight; | |||
|  |         Refresh(); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void Destroy() | |||
|  |     { | |||
|  |         if (!mIsActive) | |||
|  |             return; | |||
|  | 
 | |||
|  |         mIsActive = false; | |||
|  | 
 | |||
|  |         ResetTarget(null); | |||
|  |         OnDestroy(); | |||
|  | 
 | |||
|  |         DelDestroy?.Invoke(this); | |||
|  |         DelDestroy = null; | |||
|  |     } | |||
|  | 
 | |||
|  |     public virtual void ResetTarget(Transform pTargetTrans) | |||
|  |     { | |||
|  |         mTargetTrans = pTargetTrans; | |||
|  |     } | |||
|  | 
 | |||
|  |     protected virtual void OnAwake() | |||
|  |     { | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  |     protected virtual void OnInit() | |||
|  |     { | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  |     protected virtual void OnDestroy() | |||
|  |     { | |||
|  | 
 | |||
|  |     } | |||
|  | } |