You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
4.0 KiB

using UnityEngine;
namespace ET
{
public class CameraComponentAwakeSystem : AwakeSystem<CameraComponent>
{
public override void Awake(CameraComponent self)
{
self.Awake();
}
}
[FriendClass(typeof(CameraComponent))]
[FriendClass(typeof(GlobalComponent))]
[FriendClass(typeof(MapComponent))]
public static class CameraComponentSystem
{
public static void Awake(this CameraComponent self)
{
self.MainCamera = GlobalComponent.Instance.MainCamera.GetComponent<Camera>();
self.MapComp = self.ZoneScene().CurrentScene().GetComponent<MapComponent>();
var size = self.MapComp.MapSize;
float MapHalfHeight = size.y / 2;
float MapWidthToHeight = size.x / 2 / self.MainCamera.aspect;
self.MaxCameraOrthoSize = Mathf.Min(MapHalfHeight, MapWidthToHeight);
self.MinCameraOrthoSize = 7;
self.CameraHalfHeight = self.MainCamera.orthographicSize;
self.CameraHalfWidth = self.MainCamera.aspect * self.CameraHalfHeight;
}
public static void ZoomCamera(this CameraComponent self, float delta) {
float size = self.MainCamera.orthographicSize;
size += delta;
size = Mathf.Clamp(size, self.MinCameraOrthoSize, self.MaxCameraOrthoSize);
self.SetOrthoSize(size);
self.SetCameraPos(self.ClampCameraTargetPos(self.MainCamera.transform.position));
}
public static void SetCameraPosClamped(this CameraComponent self, Vector3 pos)
{
self.SetCameraPos(self.ClampCameraTargetPos(pos));
}
public static void SetCameraPos(this CameraComponent self, Vector3 pos)
{
self.MainCamera.transform.position = pos;
Game.EventSystem.Publish(new EventType.CameraPosChange(){ZoneScene = self.ZoneScene()});
}
public static Vector3 ScreenToWorldPoint(this CameraComponent self, Vector3 pos)
{
return self.MainCamera.ScreenToWorldPoint(pos);
}
public static Vector2 WorldToScreenPoint(this CameraComponent self, Vector2 pos)
{
return self.MainCamera.WorldToScreenPoint(pos);
}
public static Vector3 GetCameraPos(this CameraComponent self)
{
return self.MainCamera.transform.position;
}
public static void SetOrthoSize(this CameraComponent self, float size)
{
self.MainCamera.orthographicSize = size;
self.CameraHalfHeight = size;
self.CameraHalfWidth = self.MainCamera.aspect * size;
}
public static float GetOrthoSize(this CameraComponent self)
{
return self.MainCamera.orthographicSize;
}
public static Vector3 ClampCameraTargetPos(this CameraComponent self, Vector3 targetPos)
{
float minPosX = self.MapComp.MapMinPos.x + self.CameraHalfWidth;
float maxPosX = self.MapComp.MapMaxPos.x - self.CameraHalfWidth;
float minPosY = self.MapComp.MapMinPos.y + self.CameraHalfHeight;
float maxPosY = self.MapComp.MapMaxPos.y - self.CameraHalfHeight;
targetPos.x = Mathf.Clamp(targetPos.x, minPosX, maxPosX);
targetPos.y = Mathf.Clamp(targetPos.y, minPosY, maxPosY);
return targetPos;
}
/// <summary>
/// 存储相机参数
/// </summary>
/// <param name="self"></param>
public static void StoreCameraInfo(this CameraComponent self)
{
self.BackupPos = self.MainCamera.transform.position;
self.BackupOrthoSize = self.GetOrthoSize();
}
/// <summary>
/// 还原相机参数
/// </summary>
/// <param name="self"></param>
public static void RestoreCameraInfo(this CameraComponent self)
{
self.SetOrthoSize(self.BackupOrthoSize);
self.SetCameraPos(self.BackupPos);
}
}
}