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

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