class PlayerController {
...
protected override void UpdateController()
{
switch(State)
{
case CreatureState.Idle:
GetDirInput();
GetIdleInput();
break;
case CreatureState.Moving:
GetDirInput();
break;
}
base.UpdateController();
}
...
void GetIdleInput()
{
if (Input.GetKey(KeyCode.Space))
{
State = CreatureState.Skill;
_coSkill = StartCoroutine("CoStartPunch");
}
}
IEnumerator CoStartPunch()
{
GameObject go = Managers.Obj.Find(GetFrontCellPos()); // 내가 바라보고 있는 방향 +1
if(go != null)
{
Debug.Log(go.name);
}
yield return new WaitForSeconds(0.5f);
State = CreatureState.Idle;
_coSkill = null;
}
위 코드에서 플레이어가 Idle인 상태에서 방향을 업데이트하고 GetIdleInput() 함수를 호출하여 코루틴 함수를 호출시켜준다.
만약 플레이어의 State가 Idle인 상태에서 스페이스바를 누르면 State를 Skill로 바꿔주고 (CreatureController::UpdateController의 switch 문에서 Skill로 분기) 코루틴 함수를 호출시켜준다. 내가 바라보고 있는 방향에서 한 칸 앞에 다른 Creature가 존재하는지 확인 후 있으면 이름을 출력해준다. 0.5초 동안 스킬을 시전해준 후 State를 다시 Idle로 맞춰주도록 동작한다.
public Vector3Int GetFrontCellPos()
{
Vector3Int cellPos = CellPos;
switch(_lastDir)
{
case MoveDir.Up:
cellPos += Vector3Int.up;
break;
case MoveDir.Down:
cellPos += Vector3Int.down;
break;
case MoveDir.Left:
cellPos += Vector3Int.left;
break;
case MoveDir.Right:
cellPos += Vector3Int.right;
break;
}
return cellPos;
}
그리고 GetFrontCellPos() 함수도 정의해 주었는데 내가 마지막으로 바라본 방향의 앞 칸의 좌표를 반환해준다. 만약 범위 공격 스킬이라면 Vector3Int.up (0,1,0)에 5를 곱해주는 방식으로 응용할 수도 있겠다.