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