using UnityEngine; /// /// Mouse pointer drag to translate gameobject. /// public class MouseTranslate : MonoBehaviour { #region Field and Property /// /// Target camera for translate direction. /// public Transform targetCamera; /// /// Settings of mouse button and pointer. /// public MouseSettings mouseSettings = new MouseSettings(0, 1, 0); /// /// Settings of move area. /// public PlaneArea areaSettings = new PlaneArea(null, 10, 10); /// /// Damper for move. /// [Range(0, 10)] public float damper = 5; /// /// Current offset base area center. /// public Vector3 CurrentOffset; /// /// Target offset base area center. /// public Vector3 targetOffset; public AroundCamera mAroundCamera; #endregion #region Protected Method protected virtual void Start() { Initialize(); mAroundCamera = Component.FindObjectOfType(); } 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(); } /// /// Initialize component. /// protected virtual void Initialize() { CurrentOffset = targetOffset = transform.position - areaSettings.center.position; } /// /// Translate this gameobject by mouse. /// 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 }