MouseTranslate.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using UnityEngine;
  2. /// <summary>
  3. /// Mouse pointer drag to translate gameobject.
  4. /// </summary>
  5. public class MouseTranslate : MonoBehaviour
  6. {
  7. #region Field and Property
  8. /// <summary>
  9. /// Target camera for translate direction.
  10. /// </summary>
  11. public Transform targetCamera;
  12. /// <summary>
  13. /// Settings of mouse button and pointer.
  14. /// </summary>
  15. public MouseSettings mouseSettings = new MouseSettings(0, 1, 0);
  16. /// <summary>
  17. /// Settings of move area.
  18. /// </summary>
  19. public PlaneArea areaSettings = new PlaneArea(null, 10, 10);
  20. /// <summary>
  21. /// Damper for move.
  22. /// </summary>
  23. [Range(0, 10)]
  24. public float damper = 5;
  25. /// <summary>
  26. /// Current offset base area center.
  27. /// </summary>
  28. public Vector3 CurrentOffset;
  29. /// <summary>
  30. /// Target offset base area center.
  31. /// </summary>
  32. public Vector3 targetOffset;
  33. public AroundCamera mAroundCamera;
  34. #endregion
  35. #region Protected Method
  36. protected virtual void Start()
  37. {
  38. Initialize();
  39. mAroundCamera = Component.FindObjectOfType<AroundCamera>();
  40. }
  41. public float mCameraDistance = 0.0f;
  42. protected virtual void Update()
  43. {
  44. if (AroundCamera.IsTouchedUI()) return;
  45. Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
  46. RaycastHit hit;
  47. if (Physics.Raycast(ray, out hit, float.MaxValue))
  48. {
  49. float cameraDistance = Vector3.Distance(Camera.main.transform.position, hit.point);
  50. mouseSettings.pointerSensitivity = cameraDistance / 10;
  51. mCameraDistance = cameraDistance;
  52. }
  53. TranslateByMouse();
  54. }
  55. /// <summary>
  56. /// Initialize component.
  57. /// </summary>
  58. protected virtual void Initialize()
  59. {
  60. CurrentOffset = targetOffset = transform.position - areaSettings.center.position;
  61. }
  62. /// <summary>
  63. /// Translate this gameobject by mouse.
  64. /// </summary>
  65. public void TranslateByMouse()
  66. {
  67. Vector3 preOffset = targetOffset;
  68. float mouseX = 0;
  69. float mouseY = 0;
  70. #if !UNITY_ANDROID
  71. if (Input.GetMouseButton(mouseSettings.mouseButtonID))
  72. {
  73. //Mouse pointer.
  74. mouseX = Input.GetAxis("Mouse X") * mouseSettings.pointerSensitivity;
  75. mouseY = Input.GetAxis("Mouse Y") * mouseSettings.pointerSensitivity;
  76. }
  77. #else
  78. if (Input.touchCount == 1)
  79. {
  80. Touch touch0 = Input.GetTouch(0);
  81. if (touch0.phase == TouchPhase.Moved)
  82. {
  83. //Mouse pointer.
  84. mouseX = Input.GetAxis("Mouse X") * mouseSettings.pointerSensitivity * 0.2f;
  85. mouseY = Input.GetAxis("Mouse Y") * mouseSettings.pointerSensitivity * 0.2f;
  86. }
  87. }
  88. #endif
  89. //Deal with offset base direction of target camera.
  90. targetOffset -= targetCamera.right * mouseX;
  91. targetOffset -= Vector3.Cross(targetCamera.right, Vector3.up) * mouseY;
  92. //Range limit.
  93. targetOffset.x = Mathf.Clamp(targetOffset.x, -areaSettings.width, areaSettings.width);
  94. targetOffset.z = Mathf.Clamp(targetOffset.z, -areaSettings.length, areaSettings.length);
  95. if (!MovableDetection())
  96. {
  97. targetOffset = preOffset;
  98. return;
  99. }
  100. //Lerp and update transform position.
  101. CurrentOffset = Vector3.Lerp(CurrentOffset, targetOffset, damper * Time.deltaTime);
  102. //Not Lerp
  103. //CurrentOffset = targetOffset;
  104. transform.position = areaSettings.center.position + CurrentOffset;
  105. #if !UNITY_ANDROID
  106. if (Vector3.Distance(CurrentOffset, targetOffset) > 1.0f)
  107. PlayerPrefs.SetInt("CameraTranslating", 1);
  108. else
  109. PlayerPrefs.SetInt("CameraTranslating", 0);
  110. #endif
  111. }
  112. bool MovableDetection()
  113. {
  114. if (!mAroundCamera.mIsMovableDetection) return true;
  115. Vector3 prePos = transform.position;
  116. transform.position = areaSettings.center.position + targetOffset;
  117. Vector3 curPos = transform.position - mAroundCamera.transform.forward * mAroundCamera.targetDistance;
  118. if (Physics.Linecast(mAroundCamera.transform.position, curPos))
  119. {
  120. transform.position = prePos;
  121. return false;
  122. }
  123. return true;
  124. }
  125. #endregion
  126. }