유니티 다크소울 따라만들기 ch_9 공격
이 글은 유튜브 Sebastian Graves Create Dark Souls를 보고 따라 만들면서 헷갈리는 부분을 정리한 글입니다.
구현 개요
플레이어의 강공격 약공격을 구현한다.
구현 원리
무기마다 애니메이션이 다를 것이다. 그렇기에
무기 별로
재생할 공격 애니메이션을 string변수
로 할당해서
공격할 때 무기에 접근하여 무기에 있는 애니메이션 변수를 실행하도록 한다.
수정 사항
스크립트 수정 이름 변경
애니메이션이 끝나면 자동으로 isInteracting 파라미터를 수정하던 스크립트인 ResetIsInteracting을
다음과 같이 이름과 내용을 수정한다.
ResetIsInteracting -> ResetAnimatorBool
public class ResetAnimatorBool : StateMachineBehaviour
{
public string targetBool;
public bool status;
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.SetBool(targetBool, status);
}
}
애니메이터 수정
새 Layer인 Override
를 만든 후
이동 애니메이션과 행동 애니메이션을 분리해준다.
Override
Base Layer
그리고 모든 애니메이션에서 제거한 뒤 공통의 상태 empty를 만들고 그 안에 넣어준다.
이렇게 수정됨으로써 각 애니메이션을 탈출할 때 바뀌는 것이 아닌 공통된 empty 상태에 진입하게 되면 관련 파라미터값을 설정해주도록 바뀌었다.
Weapon Item 스크립트 수정
다음과 같이 수정한다.
[CreateAssetMenu(menuName = "Items/Weapon Item")]
public class WeaponItem : Item
{
public GameObject modelPrefab;
public bool isUnarmed;
[Header("One Handed Attack Animations")] // 추가된 부분
public string OH_Light_Attack_1;
public string OH_Heavy_Attack_1;
}
PlayerAttacker 스크립트 추가
무기를 매개변수로 받아 애니메이션을 실행하는 스크립트를 만든다.
public class PlayerAttacker : MonoBehaviour
{
AnimatorHandler animatorHandler;
private void Awake()
{
animatorHandler = GetComponentInChildren<AnimatorHandler>();
}
public void HandleLightAttack(WeaponItem weapon)
{
animatorHandler.PlayTargetAnimation(weapon.OH_Light_Attack_1, true);
}
public void HandleHeavyAttack(WeaponItem weapon)
{
animatorHandler.PlayTargetAnimation(weapon.OH_Heavy_Attack_1, true);
}
}
InputAction 추가
새로운 키를 할당해준다. RB와 RT키가 생겼다.
InputHandler 내용 추가
입력을 감지해서 PlayerInventory를 통해 장착중인 무기를 가져와서
PlayerAttacker의 함수를 실행
public bool rb_Input;
public bool rt_Input;
PlayerAttacker playerAttacker;
PlayerInventory playerInventory;
private void Awake()
{
playerAttacker = GetComponent<PlayerAttacker>();
playerInventory = GetComponent<PlayerInventory>();
}
private void HandleAttackInput(float delta)
{
inputActions.PlayerActions.RB.performed += i => rb_Input = true;
inputActions.PlayerActions.RT.performed += i => rt_Input = true;
if(rb_Input)
{
playerAttacker.HandleLightAttack(playerInventory.rightWeapon);
}
if (rt_Input)
{
playerAttacker.HandleHeavyAttack(playerInventory.rightWeapon);
}
}
PlayerManager 내용 추가
PlayerManager에서 새로 생긴 입력값들을 주기적으로 false로 만들어줌
private void LateUpdate()
{
inputHandler.rollFlag = false;
inputHandler.sprintFlag = false;
inputHandler.rb_Input = false; // 추가된 부분
inputHandler.rt_Input = false; // 추가된 부분
if (isInAir)
{
playerLocomotion.inAirTimer = playerLocomotion.inAirTimer + Time.deltaTime;
}
}
공격 애니메이션 추가
공격 애니메이션을 추가한다.
sword 프리팹에 애니메이션 이름을 맞춰서 입력해줌
버그 수정
mixamo에서 가져온 애니메이션의 경우 정면을 바라보고 있더라도 애니메이션 실행시
대각선을 바라보며 애니메이션이 실행
됐다.
이 경우 애니메이션을 다음과 같이 수정해주면 해결이가능하다.
수정 전
수정 후
배운점
- 공격 애니메이션을 무기에 string 변수로 무기마다 가지고 있게하여
무기마다 애니메이션을 매끄럽게 다르게 하는 방법을 알 수 있었다. - mixamo에서 가져온 애니메이션의 방향이 이상해지는 문제를 해결할 수 있었다.
댓글남기기