CameraManager.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using System;
  2. using UnityEngine;
  3. namespace COM3D2.MeidoPhotoStudio.Plugin
  4. {
  5. using Input = InputManager;
  6. using UInput = Input;
  7. public class CameraManager : IManager
  8. {
  9. public const string header = "CAMERA";
  10. private static readonly CameraMain mainCamera = CameraUtility.MainCamera;
  11. private static readonly UltimateOrbitCamera ultimateOrbitCamera = CameraUtility.UOCamera;
  12. private float defaultCameraMoveSpeed;
  13. private float defaultCameraZoomSpeed;
  14. private const float cameraFastMoveSpeed = 0.1f;
  15. private const float cameraFastZoomSpeed = 3f;
  16. private CameraInfo tempCameraInfo = new CameraInfo();
  17. private const KeyCode AlphaOne = KeyCode.Alpha1;
  18. public int CameraCount => cameraInfos.Length;
  19. public EventHandler CameraChange;
  20. private int currentCameraIndex;
  21. public int CurrentCameraIndex
  22. {
  23. get => currentCameraIndex;
  24. set
  25. {
  26. cameraInfos[currentCameraIndex].UpdateInfo(mainCamera);
  27. currentCameraIndex = value;
  28. LoadCameraInfo(cameraInfos[currentCameraIndex]);
  29. }
  30. }
  31. private CameraInfo[] cameraInfos;
  32. static CameraManager()
  33. {
  34. Input.Register(MpsKey.CameraLayer, KeyCode.Q, "Camera control layer");
  35. Input.Register(MpsKey.CameraSave, KeyCode.S, "Save camera transform");
  36. Input.Register(MpsKey.CameraLoad, KeyCode.A, "Load camera transform");
  37. Input.Register(MpsKey.CameraReset, KeyCode.R, "Reset camera transform");
  38. }
  39. public CameraManager()
  40. {
  41. cameraInfos = new CameraInfo[5];
  42. for (var i = 0; i < cameraInfos.Length; i++) cameraInfos[i] = new CameraInfo();
  43. Activate();
  44. }
  45. public void Activate()
  46. {
  47. ultimateOrbitCamera.enabled = true;
  48. defaultCameraMoveSpeed = ultimateOrbitCamera.moveSpeed;
  49. defaultCameraZoomSpeed = ultimateOrbitCamera.zoomSpeed;
  50. if (!MeidoPhotoStudio.EditMode) ResetCamera();
  51. currentCameraIndex = 0;
  52. tempCameraInfo.Reset();
  53. for (var i = 0; i < CameraCount; i++) cameraInfos[i].Reset();
  54. }
  55. public void Deactivate()
  56. {
  57. mainCamera.camera.backgroundColor = Color.black;
  58. ultimateOrbitCamera.moveSpeed = defaultCameraMoveSpeed;
  59. ultimateOrbitCamera.zoomSpeed = defaultCameraZoomSpeed;
  60. if (MeidoPhotoStudio.EditMode) return;
  61. mainCamera.Reset(CameraMain.CameraType.Target, true);
  62. mainCamera.SetTargetPos(new Vector3(0.5609447f, 1.380762f, -1.382336f));
  63. mainCamera.SetDistance(1.6f);
  64. mainCamera.SetAroundAngle(new Vector2(245.5691f, 6.273283f));
  65. }
  66. public void Update()
  67. {
  68. if (Input.GetKey(MpsKey.CameraLayer))
  69. {
  70. if (Input.GetKeyDown(MpsKey.CameraSave)) SaveTempCamera();
  71. else if (Input.GetKeyDown(MpsKey.CameraLoad)) LoadCameraInfo(tempCameraInfo);
  72. else if (Input.GetKeyDown(MpsKey.CameraReset)) ResetCamera();
  73. for (var i = 0; i < CameraCount; i++)
  74. {
  75. if (i != CurrentCameraIndex && UInput.GetKeyDown(AlphaOne + i)) CurrentCameraIndex = i;
  76. }
  77. }
  78. var shift = Input.Shift;
  79. ultimateOrbitCamera.moveSpeed = shift ? cameraFastMoveSpeed : defaultCameraMoveSpeed;
  80. ultimateOrbitCamera.zoomSpeed = shift ? cameraFastZoomSpeed : defaultCameraZoomSpeed;
  81. }
  82. private void SaveTempCamera()
  83. {
  84. tempCameraInfo.UpdateInfo(mainCamera);
  85. CameraUtility.StopAll();
  86. }
  87. public void LoadCameraInfo(CameraInfo info)
  88. {
  89. info.Apply(mainCamera);
  90. CameraUtility.StopAll();
  91. CameraChange?.Invoke(this, EventArgs.Empty);
  92. }
  93. private void ResetCamera()
  94. {
  95. mainCamera.Reset(CameraMain.CameraType.Target, true);
  96. mainCamera.SetTargetPos(new Vector3(0f, 0.9f, 0f));
  97. mainCamera.SetDistance(3f);
  98. CameraChange?.Invoke(this, EventArgs.Empty);
  99. }
  100. }
  101. public class CameraInfo
  102. {
  103. public Vector3 TargetPos { get; set; }
  104. public Quaternion Angle { get; set; }
  105. public float Distance { get; set; }
  106. public float FOV { get; set; }
  107. public CameraInfo() => Reset();
  108. public static CameraInfo FromCamera(CameraMain mainCamera)
  109. {
  110. var info = new CameraInfo();
  111. info.UpdateInfo(mainCamera);
  112. return info;
  113. }
  114. public void Reset()
  115. {
  116. TargetPos = new Vector3(0f, 0.9f, 0f);
  117. Angle = Quaternion.Euler(10f, 180f, 0f);
  118. Distance = 3f;
  119. FOV = 35f;
  120. }
  121. public void UpdateInfo(CameraMain camera)
  122. {
  123. TargetPos = camera.GetTargetPos();
  124. Angle = camera.transform.rotation;
  125. Distance = camera.GetDistance();
  126. FOV = camera.camera.fieldOfView;
  127. }
  128. public void Apply(CameraMain camera)
  129. {
  130. camera.SetTargetPos(TargetPos);
  131. camera.SetDistance(Distance);
  132. camera.transform.rotation = Angle;
  133. camera.camera.fieldOfView = FOV;
  134. }
  135. }
  136. }