EnvironmentManager.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. using System;
  2. using UnityEngine;
  3. namespace COM3D2.MeidoPhotoStudio.Plugin
  4. {
  5. internal class EnvironmentManager : IManager, ISerializable
  6. {
  7. public const string header = "ENVIRONMENT";
  8. private static bool cubeActive;
  9. public static bool CubeActive
  10. {
  11. get => cubeActive;
  12. set
  13. {
  14. if (value != cubeActive)
  15. {
  16. cubeActive = value;
  17. CubeActiveChange?.Invoke(null, EventArgs.Empty);
  18. }
  19. }
  20. }
  21. private static bool cubeSmall;
  22. public static bool CubeSmall
  23. {
  24. get => cubeSmall;
  25. set
  26. {
  27. if (value != cubeSmall)
  28. {
  29. cubeSmall = value;
  30. CubeSmallChange?.Invoke(null, EventArgs.Empty);
  31. }
  32. }
  33. }
  34. private static event EventHandler CubeActiveChange;
  35. private static event EventHandler CubeSmallChange;
  36. private GameObject cameraObject;
  37. private Camera subCamera;
  38. private GameObject bgObject;
  39. private Transform bg;
  40. private CameraInfo cameraInfo;
  41. private DragPointBG bgDragPoint;
  42. private string currentBGAsset = "Theater";
  43. private bool bgVisible = true;
  44. public bool BGVisible
  45. {
  46. get => bgVisible;
  47. set
  48. {
  49. this.bgVisible = value;
  50. bgObject.SetActive(this.bgVisible);
  51. }
  52. }
  53. public EnvironmentManager(MeidoManager meidoManager)
  54. {
  55. DragPointLight.environmentManager = this;
  56. }
  57. public void Serialize(System.IO.BinaryWriter binaryWriter) => Serialize(binaryWriter, false);
  58. public void Serialize(System.IO.BinaryWriter binaryWriter, bool kankyo)
  59. {
  60. binaryWriter.Write(header);
  61. binaryWriter.Write(currentBGAsset);
  62. binaryWriter.WriteVector3(this.bg.position);
  63. binaryWriter.WriteQuaternion(this.bg.rotation);
  64. binaryWriter.WriteVector3(this.bg.localScale);
  65. binaryWriter.Write(kankyo);
  66. CameraMain camera = GameMain.Instance.MainCamera;
  67. binaryWriter.WriteVector3(camera.GetTargetPos());
  68. binaryWriter.Write(camera.GetDistance());
  69. binaryWriter.WriteQuaternion(camera.transform.rotation);
  70. StopCameraSpin();
  71. }
  72. public void Deserialize(System.IO.BinaryReader binaryReader)
  73. {
  74. string bgAsset = binaryReader.ReadString();
  75. int assetIndex = Constants.BGList.FindIndex(bg => bg == bgAsset);
  76. ChangeBackground(bgAsset, assetIndex > Constants.MyRoomCustomBGIndex);
  77. this.bg.position = binaryReader.ReadVector3();
  78. this.bg.rotation = binaryReader.ReadQuaternion();
  79. this.bg.localScale = binaryReader.ReadVector3();
  80. bool kankyo = binaryReader.ReadBoolean();
  81. Vector3 cameraPosition = binaryReader.ReadVector3();
  82. float cameraDistance = binaryReader.ReadSingle();
  83. Quaternion cameraRotation = binaryReader.ReadQuaternion();
  84. if (!kankyo)
  85. {
  86. CameraMain camera = GameMain.Instance.MainCamera;
  87. camera.SetTargetPos(cameraPosition);
  88. camera.SetDistance(cameraDistance);
  89. camera.transform.rotation = cameraRotation;
  90. StopCameraSpin();
  91. }
  92. }
  93. public void Activate()
  94. {
  95. bgObject = GameObject.Find("__GameMain__/BG");
  96. bg = bgObject.transform;
  97. bgDragPoint = DragPoint.Make<DragPointBG>(
  98. PrimitiveType.Cube, Vector3.one * 0.12f, DragPoint.LightBlue
  99. );
  100. bgDragPoint.Initialize(() => bg.position, () => Vector3.zero);
  101. bgDragPoint.Set(bg);
  102. bgDragPoint.AddGizmo();
  103. bgDragPoint.ConstantScale = true;
  104. bgDragPoint.gameObject.SetActive(CubeActive);
  105. cameraObject = new GameObject("subCamera");
  106. subCamera = cameraObject.AddComponent<Camera>();
  107. subCamera.CopyFrom(Camera.main);
  108. subCamera.clearFlags = CameraClearFlags.Depth;
  109. subCamera.cullingMask = 256;
  110. subCamera.depth = 1f;
  111. subCamera.transform.parent = GameMain.Instance.MainCamera.transform;
  112. cameraObject.SetActive(true);
  113. bgObject.SetActive(true);
  114. GameMain.Instance.BgMgr.ChangeBg("Theater");
  115. UltimateOrbitCamera uoCamera =
  116. Utility.GetFieldValue<CameraMain, UltimateOrbitCamera>(GameMain.Instance.MainCamera, "m_UOCamera");
  117. uoCamera.enabled = true;
  118. ResetCamera();
  119. SaveCameraInfo();
  120. CubeSmallChange += OnCubeSmall;
  121. CubeActiveChange += OnCubeActive;
  122. }
  123. public void Deactivate()
  124. {
  125. if (bgDragPoint != null) GameObject.Destroy(bgDragPoint.gameObject);
  126. GameObject.Destroy(cameraObject);
  127. GameObject.Destroy(subCamera);
  128. BGVisible = true;
  129. Camera mainCamera = GameMain.Instance.MainCamera.camera;
  130. mainCamera.backgroundColor = Color.black;
  131. bool isNight = GameMain.Instance.CharacterMgr.status.GetFlag("時間帯") == 3;
  132. if (isNight)
  133. {
  134. GameMain.Instance.BgMgr.ChangeBg("ShinShitsumu_ChairRot_Night");
  135. }
  136. else
  137. {
  138. GameMain.Instance.BgMgr.ChangeBg("ShinShitsumu_ChairRot");
  139. }
  140. GameMain.Instance.MainCamera.Reset(CameraMain.CameraType.Target, true);
  141. GameMain.Instance.MainCamera.SetTargetPos(new Vector3(0.5609447f, 1.380762f, -1.382336f), true);
  142. GameMain.Instance.MainCamera.SetDistance(1.6f, true);
  143. GameMain.Instance.MainCamera.SetAroundAngle(new Vector2(245.5691f, 6.273283f), true);
  144. bg.localScale = Vector3.one;
  145. CubeSmallChange -= OnCubeSmall;
  146. CubeActiveChange -= OnCubeActive;
  147. }
  148. public void Update()
  149. {
  150. if (Input.GetKey(KeyCode.Q))
  151. {
  152. if (Input.GetKeyDown(KeyCode.S))
  153. {
  154. SaveCameraInfo();
  155. }
  156. if (Input.GetKeyDown(KeyCode.A))
  157. {
  158. LoadCameraInfo(cameraInfo);
  159. }
  160. if (Input.GetKeyDown(KeyCode.R))
  161. {
  162. ResetCamera();
  163. }
  164. }
  165. }
  166. public void ChangeBackground(string assetName, bool creative = false)
  167. {
  168. currentBGAsset = assetName;
  169. if (creative)
  170. {
  171. GameMain.Instance.BgMgr.ChangeBgMyRoom(assetName);
  172. }
  173. else
  174. {
  175. GameMain.Instance.BgMgr.ChangeBg(assetName);
  176. if (assetName == "KaraokeRoom")
  177. {
  178. bg.transform.position = bgObject.transform.position;
  179. bg.transform.localPosition = new Vector3(1f, 0f, 4f);
  180. bg.transform.localRotation = Quaternion.Euler(new Vector3(0f, 90f, 0f));
  181. }
  182. }
  183. }
  184. private void SaveCameraInfo()
  185. {
  186. this.cameraInfo = new CameraInfo(GameMain.Instance.MainCamera);
  187. StopCameraSpin();
  188. }
  189. public void LoadCameraInfo(CameraInfo cameraInfo)
  190. {
  191. CameraMain camera = GameMain.Instance.MainCamera;
  192. camera.SetTargetPos(cameraInfo.TargetPos);
  193. camera.SetPos(cameraInfo.Pos);
  194. camera.SetDistance(cameraInfo.Distance);
  195. camera.transform.eulerAngles = cameraInfo.Angle;
  196. StopCameraSpin();
  197. }
  198. private void StopCameraSpin()
  199. {
  200. UltimateOrbitCamera uoCamera = Utility.GetFieldValue<CameraMain, UltimateOrbitCamera>(
  201. GameMain.Instance.MainCamera, "m_UOCamera"
  202. );
  203. Utility.SetFieldValue<UltimateOrbitCamera, float>(uoCamera, "xVelocity", 0f);
  204. Utility.SetFieldValue<UltimateOrbitCamera, float>(uoCamera, "yVelocity", 0f);
  205. }
  206. private void ResetCamera()
  207. {
  208. CameraMain cameraMain = GameMain.Instance.MainCamera;
  209. cameraMain.Reset(CameraMain.CameraType.Target, true);
  210. cameraMain.SetTargetPos(new Vector3(0f, 0.9f, 0f), true);
  211. cameraMain.SetDistance(3f, true);
  212. }
  213. private void OnCubeSmall(object sender, EventArgs args)
  214. {
  215. this.bgDragPoint.DragPointScale = CubeSmall ? DragPointGeneral.smallCube : 1f;
  216. }
  217. private void OnCubeActive(object sender, EventArgs args)
  218. {
  219. this.bgDragPoint.gameObject.SetActive(CubeActive);
  220. }
  221. }
  222. public struct CameraInfo
  223. {
  224. public Vector3 TargetPos { get; }
  225. public Vector3 Pos { get; }
  226. public Vector3 Angle { get; }
  227. public float Distance { get; }
  228. public CameraInfo(CameraMain camera)
  229. {
  230. this.TargetPos = camera.GetTargetPos();
  231. this.Pos = camera.GetPos();
  232. this.Angle = camera.transform.eulerAngles;
  233. this.Distance = camera.GetDistance();
  234. }
  235. }
  236. }