CameraOrbit.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. // Magica Cloth.
  2. // Copyright (c) MagicaSoft, 2020-2022.
  3. // https://magicasoft.jp
  4. using UnityEngine;
  5. namespace MagicaCloth
  6. {
  7. /// <summary>
  8. /// カメラ回転
  9. /// </summary>
  10. public class CameraOrbit : MonoBehaviour
  11. {
  12. [SerializeField]
  13. private Transform cameraTransform;
  14. [Header("Camera Target")]
  15. public Transform cameraTarget;
  16. public Vector3 cameraTargetPos;
  17. public Vector3 cameraTargetOffset;
  18. [Header("Now Position")]
  19. [SerializeField]
  20. private float cameraDist = 1.5f;
  21. [SerializeField]
  22. private float cameraPitch = 21.0f;
  23. [SerializeField]
  24. private float cameraYaw = 180.0f;
  25. [Header("Parameter")]
  26. [SerializeField]
  27. private float cameraDistHokanTime = 0.1f;
  28. [SerializeField]
  29. private float cameraAngleHokanTime = 0.1f;
  30. [SerializeField]
  31. private float cameraDistSpeed = 0.02f;
  32. [SerializeField]
  33. private float cameraDistMax = 8.0f;
  34. [SerializeField]
  35. private float cameraDistMin = 0.1f;
  36. [SerializeField]
  37. private float cameraYawSpeed = 0.3f;
  38. [SerializeField]
  39. private float cameraPitchSpeed = 0.3f;
  40. [SerializeField]
  41. private float cameraMaxAngleSpeed = 100.0f;
  42. [SerializeField]
  43. private float cameraPitchMax = 89.0f;
  44. [SerializeField]
  45. private float cameraPitchMin = -89.0f;
  46. // 中ボタンドラッグによる移動
  47. public enum MoveMode
  48. {
  49. None,
  50. UpDown,
  51. Free,
  52. }
  53. [SerializeField]
  54. private MoveMode moveMode = MoveMode.Free;
  55. [SerializeField]
  56. private float moveSpeed = 0.002f;
  57. // 移動作業用
  58. private float setCameraDist;
  59. private float setCameraPitch;
  60. private float setCameraYaw;
  61. private float cameraDistVelocity;
  62. private float cameraPitchVelocity;
  63. private float cameraYawVelocity;
  64. void Start()
  65. {
  66. if (cameraTransform == null)
  67. {
  68. var cam = GetComponent<Camera>();
  69. if (cam)
  70. cameraTransform = cam.transform;
  71. }
  72. if (cameraTransform == null)
  73. enabled = false;
  74. setCameraDist = cameraDist;
  75. setCameraPitch = cameraPitch;
  76. setCameraYaw = cameraYaw;
  77. }
  78. void OnEnable()
  79. {
  80. // 入力イベント登録
  81. SimpleInputManager.OnTouchMove += OnTouchMove;
  82. SimpleInputManager.OnDoubleTouchMove += OnDoubleTouchMove;
  83. SimpleInputManager.OnTouchPinch += OnTouchPinch;
  84. }
  85. void OnDisable()
  86. {
  87. // 入力イベント解除
  88. SimpleInputManager.OnTouchMove -= OnTouchMove;
  89. SimpleInputManager.OnDoubleTouchMove -= OnDoubleTouchMove;
  90. SimpleInputManager.OnTouchPinch -= OnTouchPinch;
  91. }
  92. void LateUpdate()
  93. {
  94. // カメラ更新
  95. updateCamera();
  96. }
  97. // カメラ更新
  98. private void updateCamera()
  99. {
  100. if (cameraTransform == null)
  101. return;
  102. // カメラターゲットポジション
  103. if (cameraTarget)
  104. {
  105. cameraTargetPos = cameraTarget.position;
  106. }
  107. // 補間
  108. cameraDist = Mathf.SmoothDamp(cameraDist, setCameraDist, ref cameraDistVelocity, cameraDistHokanTime);
  109. cameraPitch = Mathf.SmoothDampAngle(cameraPitch, setCameraPitch, ref cameraPitchVelocity, cameraAngleHokanTime);
  110. cameraYaw = Mathf.SmoothDampAngle(cameraYaw, setCameraYaw, ref cameraYawVelocity, cameraAngleHokanTime);
  111. // 座標確定
  112. Quaternion q = Quaternion.Euler(cameraPitch, cameraYaw, 0);
  113. q = transform.rotation * q; // コンポーネントの回転
  114. Vector3 v = new Vector3(0, 0, -cameraDist);
  115. Vector3 pos = q * v;
  116. // ターゲットポジション
  117. Vector3 tarpos = cameraTargetPos + cameraTargetOffset;
  118. Vector3 fixpos = tarpos + pos;
  119. cameraTransform.localPosition = fixpos;
  120. // 回転確定
  121. Vector3 relativePos = tarpos - cameraTransform.position;
  122. Quaternion rot = Quaternion.LookRotation(relativePos);
  123. cameraTransform.rotation = rot;
  124. }
  125. // 回転操作
  126. private void updatePitchYaw(Vector2 speed)
  127. {
  128. // Yaw
  129. setCameraYaw += speed.x * cameraYawSpeed;
  130. // Pitch
  131. setCameraPitch += -speed.y * cameraPitchSpeed;
  132. setCameraPitch = Mathf.Clamp(setCameraPitch, cameraPitchMin, cameraPitchMax);
  133. }
  134. // 移動操作
  135. private void updateOffset(Vector2 speed)
  136. {
  137. if (cameraTransform == null)
  138. {
  139. return;
  140. }
  141. if (moveMode == MoveMode.UpDown)
  142. {
  143. cameraTargetOffset.y -= speed.y * moveSpeed;
  144. }
  145. else if (moveMode == MoveMode.Free)
  146. {
  147. Vector3 offset = cameraTransform.up * -speed.y * moveSpeed;
  148. offset += cameraTransform.right * -speed.x * moveSpeed;
  149. cameraTargetOffset += offset;
  150. }
  151. }
  152. // ズーム操作
  153. private void updateZoom(float speed)
  154. {
  155. float value = speed * cameraDistSpeed;
  156. float scl = Mathf.InverseLerp(cameraDistMin, cameraDistMax, setCameraDist);
  157. scl = Mathf.Clamp(scl, 0.1f, 1.0f);
  158. setCameraDist -= value * scl;
  159. setCameraDist = Mathf.Clamp(setCameraDist, cameraDistMin, cameraDistMax);
  160. }
  161. //=============================================================================================
  162. /// <summary>
  163. /// 入力通知:移動
  164. /// </summary>
  165. /// <param name="screenPos"></param>
  166. /// <param name="screenVelocity"></param>
  167. private void OnTouchMove(int fid, Vector2 screenPos, Vector2 screenVelocity, Vector2 cmVelocity)
  168. {
  169. screenVelocity *= Time.deltaTime * 60.0f;
  170. if (fid == 2)
  171. {
  172. // 中ドラッグ
  173. updateOffset(screenVelocity);
  174. }
  175. else if (fid == 0)
  176. {
  177. // 左ドラッグ
  178. // 最大速度
  179. screenVelocity = Vector2.ClampMagnitude(screenVelocity, cameraMaxAngleSpeed);
  180. updatePitchYaw(screenVelocity);
  181. }
  182. }
  183. private void OnDoubleTouchMove(int fid, Vector2 screenPos, Vector2 screenVelocity, Vector2 cmVelocity)
  184. {
  185. if (SimpleInputManager.Instance.GetTouchCount() >= 3)
  186. updateOffset(screenVelocity);
  187. }
  188. /// <summary>
  189. /// 入力通知:ピンチイン/アウト
  190. /// </summary>
  191. /// <param name="speedscr"></param>
  192. /// <param name="speedcm"></param>
  193. private void OnTouchPinch(float speedscr, float speedcm)
  194. {
  195. //if (Mathf.Abs(speedcm) > 1.0f)
  196. if (SimpleInputManager.Instance.GetTouchCount() < 3)
  197. updateZoom(speedcm);
  198. }
  199. }
  200. }