CameraController.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class CameraController : MonoBehaviour
  5. {
  6. public float offsetX = 5, offsetY = 3, offsetZ = -16;
  7. public float lerpValue = 3.5f;
  8. [HideInInspector]
  9. public Vector3 targetPos;
  10. [HideInInspector]
  11. public Vector3 leftTargetPos;
  12. [HideInInspector]
  13. public Vector3 rightTargetPos;
  14. [HideInInspector]
  15. public Vector3 cameraPos;
  16. public Camera mainCamera;
  17. public Camera leftCamera;
  18. public Camera rightCamera;
  19. public float maxView = 20;
  20. [HideInInspector]
  21. public float view;
  22. public float minDistance = 20;
  23. public float splitDistance = 30;
  24. public float mergeDistance = 16;
  25. [HideInInspector]
  26. public float distance;
  27. [HideInInspector]
  28. public float ratio;
  29. public float lineMaxScale = 0.5f;
  30. public GameObject lineInCamera;
  31. public int leftID;
  32. public int rightID;
  33. public bool isSplit;
  34. public float rapidMpReplySpeed;
  35. private void Start()
  36. {
  37. //ratio = maxView / (splitDistance - minDistance);
  38. }
  39. private void Update()
  40. {
  41. //µ÷²ÎÓÃ
  42. ratio = maxView / (splitDistance - minDistance);
  43. //
  44. PlayerController player0 = PlayersInput.instance[0];
  45. PlayerController player1 = PlayersInput.instance[1];
  46. if (player0 == null)
  47. {
  48. targetPos = Vector3.zero + new Vector3(0, offsetY, offsetZ);
  49. }
  50. else if (player1 == player0)
  51. {
  52. if (player0.isRevive)
  53. {
  54. targetPos = new Vector3(140, offsetY, offsetZ);
  55. }
  56. else
  57. {
  58. targetPos = CameraTargetMove(player0);
  59. }
  60. }
  61. else
  62. {
  63. if(player0.isRevive && player1.isRevive)
  64. {
  65. targetPos = new Vector3(140, offsetY, offsetZ);
  66. if (isSplit)
  67. {
  68. CameraSplit(true);
  69. }
  70. return;
  71. }
  72. else if (player0.isRevive)
  73. {
  74. targetPos = CameraTargetMove(player1);
  75. if (isSplit)
  76. {
  77. CameraSplit(true);
  78. }
  79. return;
  80. }
  81. if (player1.isRevive)
  82. {
  83. targetPos = CameraTargetMove(player0);
  84. if (isSplit)
  85. {
  86. CameraSplit(true);
  87. }
  88. return;
  89. }
  90. Vector3 player0Pos = player0.transform.position;
  91. Vector3 player1Pos = player1.transform.position;
  92. distance = Vector3.Distance(player0Pos, player1Pos);
  93. if (player0Pos.x < player1Pos.x)
  94. {
  95. leftTargetPos = CameraTargetMove(player0);
  96. leftID = 0;
  97. rightTargetPos = CameraTargetMove(player1);
  98. rightID = 1;
  99. }
  100. else
  101. {
  102. leftTargetPos = CameraTargetMove(player1);
  103. leftID = 1;
  104. rightTargetPos = CameraTargetMove(player0);
  105. rightID = 0;
  106. }
  107. view = Mathf.Clamp((distance - minDistance) * ratio, 0, maxView);
  108. if (distance < mergeDistance)
  109. {
  110. if (isSplit)
  111. {
  112. CameraSplit(true);
  113. }
  114. }
  115. else
  116. {
  117. lineInCamera.transform.localScale = new Vector3(Mathf.Clamp(
  118. (distance - mergeDistance) * 0.01f, 0, lineMaxScale), 10, 1);
  119. targetPos =
  120. Vector3.Lerp(leftCamera.transform.position, rightCamera.transform.position, 0.5f);
  121. }
  122. if (distance > splitDistance)
  123. {
  124. if (!isSplit)
  125. {
  126. CameraSplit(false);
  127. }
  128. }
  129. else
  130. {
  131. targetPos =
  132. Vector3.Lerp(player0Pos, player1Pos, 0.5f) + new Vector3(0, offsetY, offsetZ);
  133. }
  134. }
  135. }
  136. private void FixedUpdate()
  137. {
  138. if (PlayersInput.instance[1] == null)
  139. {
  140. mainCamera.transform.position =
  141. Vector3.Lerp(mainCamera.transform.position, targetPos, lerpValue * Time.deltaTime);
  142. }
  143. else
  144. {
  145. if (lineInCamera.activeSelf)
  146. {
  147. cameraPos = targetPos;
  148. }
  149. else
  150. {
  151. cameraPos = Vector3.Lerp(mainCamera.transform.position,
  152. targetPos, lerpValue * Time.deltaTime);
  153. }
  154. mainCamera.transform.position = new Vector3(cameraPos.x, cameraPos.y,offsetZ - view);
  155. leftCamera.transform.position = Vector3.Lerp(leftCamera.transform.position,
  156. leftTargetPos, lerpValue * Time.deltaTime);
  157. rightCamera.transform.position = Vector3.Lerp(rightCamera.transform.position,
  158. rightTargetPos, lerpValue * Time.deltaTime);
  159. }
  160. }
  161. public void CameraSplit(bool flag)
  162. {
  163. if (flag)
  164. {
  165. mainCamera.enabled = true;
  166. leftCamera.enabled = false;
  167. rightCamera.enabled = false;
  168. lineInCamera.SetActive(false);
  169. isSplit = false;
  170. PlayersInput.instance[0].RapidReplyMp(rapidMpReplySpeed);
  171. PlayersInput.instance[1].RapidReplyMp(rapidMpReplySpeed);
  172. }
  173. else
  174. {
  175. mainCamera.enabled = false;
  176. leftCamera.enabled = true;
  177. rightCamera.enabled = true;
  178. lineInCamera.SetActive(true);
  179. isSplit = true;
  180. PlayersInput.instance[0].NormalReplyMp();
  181. PlayersInput.instance[1].NormalReplyMp();
  182. }
  183. }
  184. Vector3 CameraTargetMove(PlayerController player)
  185. {
  186. Vector3 skewPos;
  187. if (player.bodyTrans.localScale.x > 0)
  188. {
  189. skewPos = player.transform.position + new Vector3(-offsetX, offsetY, offsetZ);
  190. }
  191. else
  192. {
  193. skewPos = player.transform.position + new Vector3(offsetX, offsetY, offsetZ);
  194. }
  195. return skewPos;
  196. }
  197. }