public class CursorController : MonoBehaviour
{
int _mask = (1 << (int)Define.Layer.Ground) | (1 << (int)Define.Layer.Monster);
Texture2D _attackIcon;
Texture2D _handIcon;
enum CursorType
{
None,
Hand,
Attack,
}
CursorType _cursorType = CursorType.None;
private void Start()
{
_attackIcon = Managers.Resource.Load<Texture2D>("Textures/Cursor/Attack");
_handIcon = Managers.Resource.Load<Texture2D>("Textures/Cursor/Hand");
}
void Update()
{
if (Input.GetMouseButton(0))
return;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f, _mask))
{
if (hit.collider.gameObject.layer == (int)Define.Layer.Monster)
{
// 깜빡 거림 방지
if (_cursorType != CursorType.Attack)
{
Cursor.SetCursor(_attackIcon, new Vector2(_attackIcon.width / 5, 0), CursorMode.Auto);
_cursorType = CursorType.Attack;
}
}
else
{
if (_cursorType != CursorType.Hand)
{
Cursor.SetCursor(_handIcon, new Vector2(_handIcon.width / 3, 0), CursorMode.Auto);
_cursorType = CursorType.Hand;
}
}
}
}
PlayerController에서 구현한 기능을 새로 스크립트를 파서 옮겨주었다.
해당 스크립트는 씬에 붙였다.
attack이라는 매개변수를 추가하였다.
attack이 true인 경우 Attack Animation으로 넘어간다.
[SerializeField]
PlayerState _state = PlayerState.Idle;
public PlayerState State
{
get { return _state; }
set
{
_state = value;
Animator anim = GetComponent<Animator>();
switch(_state)
{
case PlayerState.Die:
anim.SetBool("attack", false);
break;
case PlayerState.Idle:
anim.SetBool("attack", false);
anim.SetFloat("speed", 0);
break;
case PlayerState.Moving:
anim.SetBool("attack", false);
anim.SetFloat("speed", _stat.MoveSpeed);
break;
case PlayerState.SKill:
anim.SetBool("attack", true);
break;
}
}
State를 프로퍼티로 만들었다.
현재 상태와 재생할 애니메이션을 함께 묶기 위함이다.
void UpdateMoving()
{
// 몬스터가 사정거리 내면 공격
if (_lockTarget != null)
{
float dist = (_destPos - transform.position).magnitude;
if (dist <= 1)
{
State = PlayerState.SKill;
return;
}
}
...
}
UpdateMoving에서 몬스터가 사정거리 안에 있는 경우 플레이어의 상태를 공격으로 수정한다.
공격 애니메이션을 완성하였다.
하지만 꾹 눌러도 공격 모션은 한 번만 실행된다는 문제가 생겼다.