123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- using UnityEngine;
- /// <summary>
- /// Mouse pointer drag to translate gameobject.
- /// </summary>
- public class MouseTranslate : MonoBehaviour
- {
- #region Field and Property
- /// <summary>
- /// Target camera for translate direction.
- /// </summary>
- public Transform targetCamera;
- /// <summary>
- /// Settings of mouse button and pointer.
- /// </summary>
- public MouseSettings mouseSettings = new MouseSettings(0, 1, 0);
- /// <summary>
- /// Settings of move area.
- /// </summary>
- public PlaneArea areaSettings = new PlaneArea(null, 10, 10);
- /// <summary>
- /// Damper for move.
- /// </summary>
- [Range(0, 10)]
- public float damper = 5;
- /// <summary>
- /// Current offset base area center.
- /// </summary>
- public Vector3 CurrentOffset;
- /// <summary>
- /// Target offset base area center.
- /// </summary>
- public Vector3 targetOffset;
- public AroundCamera mAroundCamera;
- #endregion
- #region Protected Method
- protected virtual void Start()
- {
- Initialize();
- mAroundCamera = Component.FindObjectOfType<AroundCamera>();
- }
- public float mCameraDistance = 0.0f;
- protected virtual void Update()
- {
- if (AroundCamera.IsTouchedUI()) return;
- Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
- RaycastHit hit;
- if (Physics.Raycast(ray, out hit, float.MaxValue))
- {
- float cameraDistance = Vector3.Distance(Camera.main.transform.position, hit.point);
- mouseSettings.pointerSensitivity = cameraDistance / 10;
- mCameraDistance = cameraDistance;
- }
- TranslateByMouse();
- }
- /// <summary>
- /// Initialize component.
- /// </summary>
- protected virtual void Initialize()
- {
- CurrentOffset = targetOffset = transform.position - areaSettings.center.position;
- }
- /// <summary>
- /// Translate this gameobject by mouse.
- /// </summary>
- public void TranslateByMouse()
- {
- Vector3 preOffset = targetOffset;
- float mouseX = 0;
- float mouseY = 0;
- #if !UNITY_ANDROID
- if (Input.GetMouseButton(mouseSettings.mouseButtonID))
- {
- //Mouse pointer.
- mouseX = Input.GetAxis("Mouse X") * mouseSettings.pointerSensitivity;
- mouseY = Input.GetAxis("Mouse Y") * mouseSettings.pointerSensitivity;
- }
- #else
- if (Input.touchCount == 1)
- {
- Touch touch0 = Input.GetTouch(0);
- if (touch0.phase == TouchPhase.Moved)
- {
- //Mouse pointer.
- mouseX = Input.GetAxis("Mouse X") * mouseSettings.pointerSensitivity * 0.2f;
- mouseY = Input.GetAxis("Mouse Y") * mouseSettings.pointerSensitivity * 0.2f;
- }
- }
- #endif
- //Deal with offset base direction of target camera.
- targetOffset -= targetCamera.right * mouseX;
- targetOffset -= Vector3.Cross(targetCamera.right, Vector3.up) * mouseY;
- //Range limit.
- targetOffset.x = Mathf.Clamp(targetOffset.x, -areaSettings.width, areaSettings.width);
- targetOffset.z = Mathf.Clamp(targetOffset.z, -areaSettings.length, areaSettings.length);
- if (!MovableDetection())
- {
- targetOffset = preOffset;
- return;
- }
- //Lerp and update transform position.
- CurrentOffset = Vector3.Lerp(CurrentOffset, targetOffset, damper * Time.deltaTime);
- //Not Lerp
- //CurrentOffset = targetOffset;
- transform.position = areaSettings.center.position + CurrentOffset;
- #if !UNITY_ANDROID
- if (Vector3.Distance(CurrentOffset, targetOffset) > 1.0f)
- PlayerPrefs.SetInt("CameraTranslating", 1);
- else
- PlayerPrefs.SetInt("CameraTranslating", 0);
- #endif
- }
- bool MovableDetection()
- {
- if (!mAroundCamera.mIsMovableDetection) return true;
- Vector3 prePos = transform.position;
- transform.position = areaSettings.center.position + targetOffset;
- Vector3 curPos = transform.position - mAroundCamera.transform.forward * mAroundCamera.targetDistance;
- if (Physics.Linecast(mAroundCamera.transform.position, curPos))
- {
- transform.position = prePos;
- return false;
- }
- return true;
- }
- #endregion
- }
|