CameraController.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. private void Start()
  32. {
  33. //ratio = maxView / (splitDistance - minDistance);
  34. }
  35. private void Update()
  36. {
  37. //µ÷²ÎÓÃ
  38. ratio = maxView / (splitDistance - minDistance);
  39. //
  40. if (PlayersInput.instance[0] == null)
  41. {
  42. targetPos = Vector3.zero + new Vector3(0, offsetY, offsetZ);
  43. }
  44. else if (PlayersInput.instance[1] == PlayersInput.instance[0])
  45. {
  46. targetPos = CameraTargetMove(PlayersInput.instance[0]);
  47. }
  48. else
  49. {
  50. Vector3 player0Pos = PlayersInput.instance[0].transform.position;
  51. Vector3 player1Pos = PlayersInput.instance[1].transform.position;
  52. distance = Vector3.Distance(player0Pos, player1Pos);
  53. if (player0Pos.x < player1Pos.x)
  54. {
  55. leftTargetPos = CameraTargetMove(PlayersInput.instance[0]);
  56. rightTargetPos = CameraTargetMove(PlayersInput.instance[1]);
  57. }
  58. else
  59. {
  60. leftTargetPos = CameraTargetMove(PlayersInput.instance[1]);
  61. rightTargetPos = CameraTargetMove(PlayersInput.instance[0]);
  62. }
  63. view = Mathf.Clamp((distance - minDistance) * ratio, 0, maxView);
  64. if (distance < mergeDistance)
  65. {
  66. mainCamera.enabled = true;
  67. leftCamera.enabled = false;
  68. rightCamera.enabled = false;
  69. lineInCamera.SetActive(false);
  70. }
  71. else
  72. {
  73. lineInCamera.transform.localScale = new Vector3(Mathf.Clamp(
  74. (distance - mergeDistance) * 0.01f, 0, lineMaxScale), 10, 1);
  75. targetPos =
  76. Vector3.Lerp(leftCamera.transform.position, rightCamera.transform.position, 0.5f);
  77. }
  78. if (distance > splitDistance)
  79. {
  80. mainCamera.enabled = false;
  81. leftCamera.enabled = true;
  82. rightCamera.enabled = true;
  83. lineInCamera.SetActive(true);
  84. }
  85. else
  86. {
  87. targetPos =
  88. Vector3.Lerp(player0Pos, player1Pos, 0.5f) + new Vector3(0, offsetY, offsetZ);
  89. }
  90. }
  91. }
  92. private void FixedUpdate()
  93. {
  94. if (PlayersInput.instance[1] == null)
  95. {
  96. mainCamera.transform.position =
  97. Vector3.Lerp(mainCamera.transform.position, targetPos, lerpValue * Time.deltaTime);
  98. }
  99. else
  100. {
  101. if (lineInCamera.activeSelf)
  102. {
  103. cameraPos = targetPos;
  104. }
  105. else
  106. {
  107. cameraPos = Vector3.Lerp(mainCamera.transform.position,
  108. targetPos, lerpValue * Time.deltaTime);
  109. }
  110. mainCamera.transform.position = new Vector3(cameraPos.x, cameraPos.y,offsetZ - view);
  111. leftCamera.transform.position = Vector3.Lerp(leftCamera.transform.position,
  112. leftTargetPos, lerpValue * Time.deltaTime);
  113. rightCamera.transform.position = Vector3.Lerp(rightCamera.transform.position,
  114. rightTargetPos, lerpValue * Time.deltaTime);
  115. }
  116. }
  117. Vector3 CameraTargetMove(PlayerController player)
  118. {
  119. Vector3 skewPos;
  120. if (player.bodyTrans.localScale.x > 0)
  121. {
  122. skewPos = player.transform.position + new Vector3(-offsetX, offsetY, offsetZ);
  123. }
  124. else
  125. {
  126. skewPos = player.transform.position + new Vector3(offsetX, offsetY, offsetZ);
  127. }
  128. return skewPos;
  129. }
  130. }