You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
4.2 KiB
174 lines
4.2 KiB
using UnityEngine;
|
|
|
|
public class ObjectDrag : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private Camera camMain;
|
|
[SerializeField]
|
|
private Transform trfDragWrapper;
|
|
|
|
private float fClickTimeMax = 0.3f;
|
|
|
|
private Vector3 v3Init = Vector3.zero;
|
|
private Vector3 v3Offset = Vector3.zero;
|
|
private float fTotalTime = 0f;
|
|
private bool bTouch = false;
|
|
private bool bDrag = false;
|
|
|
|
|
|
|
|
private void Update()
|
|
{
|
|
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
|
|
|
|
if (Input.GetMouseButtonDown(0))
|
|
{
|
|
OnTouchBegin();
|
|
}
|
|
else if (Input.GetMouseButtonUp(0))
|
|
{
|
|
OnTouchFinish();
|
|
}
|
|
else if (Input.GetMouseButton(0))
|
|
{
|
|
OnTouchContinue();
|
|
}
|
|
|
|
#else
|
|
if (Input.touchCount == 0)
|
|
return;
|
|
|
|
if (Input.GetTouch(0).phase == TouchPhase.Began)
|
|
{
|
|
OnTouchBegin();
|
|
}
|
|
else if (Input.GetTouch(0).phase == TouchPhase.Ended || Input.GetTouch(0).phase == TouchPhase.Canceled)
|
|
{
|
|
OnTouchFinish();
|
|
}
|
|
else if (Input.GetTouch(0).phase == TouchPhase.Moved)
|
|
{
|
|
OnTouchContinue();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// 터치 취소.
|
|
public void TouchCancel()
|
|
{
|
|
if (!bTouch)
|
|
return;
|
|
|
|
// 터치 이전 위치로 되돌림.
|
|
trfDragWrapper.position = v3Init;
|
|
|
|
v3Offset = Vector3.zero;
|
|
bDrag = false;
|
|
fTotalTime = 0f;
|
|
}
|
|
|
|
// 터치 시작.
|
|
private void OnTouchBegin()
|
|
{
|
|
if (bTouch)
|
|
return;
|
|
|
|
Vector3 v3pos;
|
|
if (Input.touchCount > 0)
|
|
v3pos = Input.GetTouch(0).position;
|
|
else
|
|
v3pos = Input.mousePosition;
|
|
Ray ray = camMain.ScreenPointToRay(v3pos);
|
|
RaycastHit hit;
|
|
if (!Physics.Raycast(ray, out hit))
|
|
{
|
|
return;
|
|
}
|
|
|
|
Vector3 v3worldpos = camMain.ScreenToWorldPoint(v3pos);
|
|
v3Init = trfDragWrapper.position;
|
|
v3Offset = trfDragWrapper.position - v3worldpos;
|
|
v3worldpos += v3Offset;
|
|
v3worldpos = ClampWorldPos(v3worldpos);
|
|
v3worldpos.z = -1f;
|
|
|
|
trfDragWrapper.position = v3worldpos;
|
|
|
|
fTotalTime = 0f;
|
|
bTouch = true;
|
|
bDrag = false;
|
|
}
|
|
|
|
// 터치 지속.
|
|
private void OnTouchContinue()
|
|
{
|
|
if (!bTouch)
|
|
return;
|
|
|
|
Vector3 v3pos;
|
|
if (Input.touchCount > 0)
|
|
v3pos = Input.GetTouch(0).position;
|
|
else
|
|
v3pos = Input.mousePosition;
|
|
Vector3 v3worldpos = camMain.ScreenToWorldPoint(v3pos);
|
|
v3worldpos += v3Offset;
|
|
v3worldpos = ClampWorldPos(v3worldpos);
|
|
v3worldpos.z = -1f;
|
|
|
|
trfDragWrapper.position = v3worldpos;
|
|
|
|
if (!bDrag)
|
|
{
|
|
fTotalTime += Time.unscaledDeltaTime;
|
|
if (fTotalTime >= fClickTimeMax)
|
|
{
|
|
bDrag = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 터치 종료.
|
|
private void OnTouchFinish()
|
|
{
|
|
if (!bTouch)
|
|
return;
|
|
bTouch = false;
|
|
|
|
Vector3 v3pos;
|
|
if (Input.touchCount > 0)
|
|
v3pos = Input.GetTouch(0).position;
|
|
else
|
|
v3pos = Input.mousePosition;
|
|
Vector3 v3worldpos = camMain.ScreenToWorldPoint(v3pos);
|
|
v3worldpos += v3Offset;
|
|
v3worldpos = ClampWorldPos(v3worldpos);
|
|
|
|
trfDragWrapper.position = v3worldpos;
|
|
//if (!PveManager.Instance.UpdateCharPosition(v3worldpos))
|
|
// // 터치 이전 위치로 되돌림.
|
|
// trfDragWrapper.position = v3Init;
|
|
|
|
v3Offset = Vector3.zero;
|
|
bDrag = false;
|
|
fTotalTime = 0f;
|
|
}
|
|
|
|
// 범위 제한.
|
|
public static Vector3 ClampWorldPos(Vector3 v3worldpos)
|
|
{
|
|
v3worldpos.x = Mathf.Clamp(v3worldpos.x, -5.1f, 2.1f);
|
|
v3worldpos.y = Mathf.Clamp(v3worldpos.y, 14.2f, 18.2f);
|
|
v3worldpos.z = (v3worldpos.y - 16.5f) / 100f;
|
|
return v3worldpos;
|
|
}
|
|
|
|
// 랜덤 위치.
|
|
public static Vector3 RandomWorldPos()
|
|
{
|
|
Vector3 v3worldpos = new Vector3();
|
|
v3worldpos.x = Random.Range(-5.1f, 2.1f);
|
|
v3worldpos.y = Random.Range(14.2f, 18.2f);
|
|
v3worldpos.z = (v3worldpos.y - 16.5f) / 100f;
|
|
return v3worldpos;
|
|
}
|
|
}
|