RPG Project - 1 [ MOVE ]
이번 Project는 개인적으로 학습하는 Project 입니다.
유니티를 공부하다 심화를 조금 더 하고 싶어서
RPG 제작을 해보자라는 마음이 생겨 제작을 하게 되었습니다.
가장 먼저 캐릭터를 일단 세웠습니다. 하지만 움직이지 않습니다
당연히 코드를 아무것도 작성을 하지 않아 움직이지 않는 상태입니다.
저는 가장 먼저 Animation을 설정을 해주기 위해 Animator를 선언을 하고 연동을 하였습니다.
위를 보시면 알겠지만 아직 플레이어가 사망을 할 경우는 넣지 않았습니다. 이는 후반에 넣을 예정입니다.
아무 상태에서 만약에 아이템을 줍는 행위를 하면 Gather라는 트리거가 활성화가 되어 Gathering으로 이동을 해 줍는 모션을 실행합니다.
그와 마찬가지로 Attack은 Attack이라는 트리거가 활성화가 되면 Attack 모션으로 이동이 됩니다.
Skill은 트리거로 하지않고 Bool형식으로 하였습니다. 이는 스킬 끝나는 시점을 체크하기 위해서 입니다.
그래서 Skill이라는 변수가 True가 되면 Skill로 이동을 합니다.
여기서 Skill, Idle,Walk, Run, Attack은 Blend Tree로 구성을 하였습니다.
스킬 블렌드 트리입니다 Skill type이라는 변수 값에 맞추어서 Buff, SpellCast, Spin 등 다양한 스킬을 연동을 하였습니다.
공격은 이렇게 나눈 이유는 무기에 따라서 모션을 나누기 위해 Blend tree로 구현을 하였습니다.
그래서 만약에 AttackType이 1이면 주먹이 나가고, 4면 활을 쏘는 모션을 실행 합니다.
이번에는 Idle상태와 walk상태 입니다. 이 Blend tree는 위에서 설명해드린 것과 다르게 두개의 변수를 받습니다.
현재는 X와 Y값을 받습니다.
만약에 X와 Y가 0이라면 움직이지 않는 상태이니 Idle 상태를 출력 해줍니다.
그게 아니라 값이 변한다면 움직이니 그것에 맞추어 모션을 취해줍니다.
이와 같이 Run 또한 똑같지만 모션만 달라집니다.
void Freeze()
{
_rigid.angularVelocity = Vector3.zero;
_rigid.velocity = Vector3.zero;
int _Imask = 1 << LayerMask.NameToLayer("House") | 1 << LayerMask.NameToLayer("Monster") | 1 << LayerMask.NameToLayer("Wall") | 1 << LayerMask.NameToLayer("Wood");
_isfrontcheck = Physics.Raycast(transform.position, transform.forward, _frontDistance, _Imask);
}
void FixedUpdate() => Freeze();
void UserMove()
{
float mx = Input.GetAxisRaw("Horizontal");
float my = Input.GetAxisRaw("Vertical");
_Action.SetFloat("X", mx);
_Action.SetFloat("Y", my);
if (Input.GetKey(KeyCode.LeftShift))
{
_Action.SetBool("IsRun", true);
if(!_isfrontcheck)transform.Translate(Vector3.forward * my * Time.deltaTime * _runSpeed);
}
else
{
_Action.SetBool("IsRun", false);
if (!_isfrontcheck) transform.Translate(Vector3.forward * my * Time.deltaTime * _walkSpeed);
}
transform.Rotate(Vector3.up * mx * Time.deltaTime * _rotationspeed);
}
Move 구현입니다. x와 y 값을 이용해서 움직임을 구현을 한다고 하였으니 x와 y를 받아줄 변수를 선언을 해주었고
그 값을 해당 Animator의 변수 값에 저장을 하였습니다.
또한 만약에 유저가 LeftShift를 누르고있는 상태라면 IsRun을 활성화 시켜 이동속도를 올려줍니다.
이제 속도에 맞추어서 이동을 할탠데 이때 자신 앞에 집, 몬스터, 벽, 나무 등 장애물이 있으면 움직이지 않게 합니다.
마지막으로 유저가 움직이는 방향에 맞추어 방향 전환까지 넣어주었습니다.
오늘 부터 구현을 하는 것은 올릴 생각이지만
복잡하거나 어려웠던 부분 위주로 올릴 예정입니다.