CameraManager.cs 5.9 KB

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