public enum MouseEvent
{
Press,
PointerDown,
PointerUp,
Click,
}
마우스의 상태를 추가하였다.
bool _pressed = false;
float _pressedTime = 0;
public void OnUpdate()
{
// UI 컴포넌트를 클릭했을 경우
if (EventSystem.current.IsPointerOverGameObject())
return;
if (MouseAction != null)
{
// 마우스 왼쪽 버튼을 누르면
if (Input.GetMouseButton(0))
{
// 아직 누르지 않은 경우
// 누른 이벤트를 Invoke하고 누른 시간을 기록한다.
if (!_pressed)
{
MouseAction.Invoke(Define.MouseEvent.PointerDown);
_pressedTime = Time.time;
}
MouseAction.Invoke(Define.MouseEvent.Press);
_pressed = true;
}
else
{
// 누르다가 뗀 경우
// 일정시간 내라면 Click이벤트 발생
if (_pressed)
{
if (Time.time < _pressedTime + 0.2f)
MouseAction.Invoke(Define.MouseEvent.Click);
MouseAction.Invoke(Define.MouseEvent.PointerUp);
}
_pressed = false;
_pressedTime = 0;
}
}
}
마우스의 왼쪽 버튼을 누르는 순간, 홀드, 떼는 순간을 위한 코드를 추가하였다.
void OnMouseEvent(Define.MouseEvent evt)
{
if (_state == PlayerState.Die)
return;
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
bool raycastHit = Physics.Raycast(ray, out hit, 100.0f,_mask);
// Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);
switch (evt)
{
// 처음으로 누르는 순간 일어나는 이벤트
case Define.MouseEvent.PointerDown:
if (raycastHit)
{
_destPos = hit.point;
_state = PlayerState.Moving;
if (hit.collider.gameObject.layer == (int)Define.Layer.Monster)
_lockTarget = hit.collider.gameObject;
else
_lockTarget = null;
}
break;
// 누르는 동안 일어나는 이벤트
case Define.MouseEvent.Press:
if (_lockTarget != null)
_destPos = _lockTarget.transform.position;
else if (raycastHit)
_destPos = hit.point;
break;
// 버튼을 떼는 순간 일어나는 이벤트
case Define.MouseEvent.PointerUp:
_lockTarget = null;
break;
}
처음으로 눌렀을 때 누른 것에 따라 _lockTarget을 설정해주었다.
나중에 몬스터의 락온 하기 위한 변수이다.