CameraManager.cs 4.9 KB

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