| 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}
 |