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
}