using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 相机模块 /// public abstract class ModuleCamera : MonoBehaviour { /// 默认图层遮罩 public static readonly LayerMask DefaultLayerMask = ~(1 << 0) | 1 << 0; /// 必须要初始化 protected abstract void Awake(); /// 相机位置 public abstract Vector3 Position { get; set; } /// 相机旋转 public abstract Vector3 EulerAngles { get; set; } /// 相机视野 public abstract float VisualField { get; set; } /// 当前相机 public abstract Camera ViewCamera { get; } /// 渲染纹理 public virtual RenderTexture RenderTexture { get; } /// 更新渲染纹理 public virtual void UpdateRenderTexture(int x, int y) { } #region 坐标转换 /// 屏幕坐标转换视图坐标(0-1) public virtual Vector3 ScreenToViewPosition(Vector3 screenPosition) { return ViewCamera.ScreenToViewportPoint(screenPosition); } /// 屏幕坐标转换世界坐标 public virtual Vector3 ScreenToWorldPosition(Vector3 screenPosition) { return ViewCamera.ScreenToWorldPoint(screenPosition); } /// 视图坐标(0-1)转换屏幕坐标 public virtual Vector3 ViewToScreenPosition(Vector3 screenPosition) { return ViewCamera.ViewportToScreenPoint(screenPosition); } /// 视图坐标(0-1)转换世界坐标 public virtual Vector3 ViewToWorldPosition(Vector3 screenPosition) { return ViewCamera.ViewportToWorldPoint(screenPosition); } /// 世界坐标转换屏幕坐标 public virtual Vector3 WorldToScreenPosition(Vector3 screenPosition) { return ViewCamera.WorldToScreenPoint(screenPosition); } /// 世界坐标转换视图坐标(0-1) public virtual Vector3 WorldToViewPosition(Vector3 screenPosition) { return ViewCamera.WorldToViewportPoint(screenPosition); } #endregion #region 射线检测 private Ray ray; private RaycastHit hitInfo; /// 屏幕坐标获取世界对象 public virtual bool ScreenToWorldObject(Vector3 screenPosition, out T value) where T : Object { return ScreenToWorldObject(screenPosition, out value, DefaultLayerMask); } /// 屏幕坐标获取世界对象 public virtual bool ScreenToWorldObject(Vector3 screenPosition, out T value, LayerMask planeLayerMask) where T : Object { ray = ViewCamera.ScreenPointToRay(screenPosition); Physics.Raycast(ray, out hitInfo, 200, planeLayerMask); value = hitInfo.transform?.GetComponent(); return value != null; } /// 屏幕坐标获取世界对象的父对象 public virtual bool ScreenToWorldObjectParent(Vector3 screenPosition, out T value) where T : Object { return ScreenToWorldObjectParent(screenPosition, out value, DefaultLayerMask); } /// 屏幕坐标获取世界对象的父对象 public virtual bool ScreenToWorldObjectParent(Vector3 screenPosition, out T value, LayerMask planeLayerMask) where T : Object { ray = ViewCamera.ScreenPointToRay(screenPosition); Physics.Raycast(ray, out hitInfo, 200, planeLayerMask); value = hitInfo.transform?.GetComponentInParent(); return value != null; } #endregion protected virtual void Update() { Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow); } }