Files
MuHua-Core/Assets/ModuleCore/ModuleCamera/ModuleCamera.cs
T
MuHua-123 8f387837db 1
2025-01-08 18:02:44 +08:00

88 lines
3.8 KiB
C#

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