[Charon] #10. "카론의 노" 무기 공격 및 스킬 구현하기

2023. 4. 4. 17:01Projects/Charon

 

 

 

플레이어가 공격을 하거나 스킬을 사용하면, 그에 따라 화려하고 멋진 이펙트와 사운드가 나면서 유저가 게임에 더욱 몰입할 수 있게 해줍니다. 이펙트는 아티스트분들이 제작하여 주지만, 저는 아티스트가 없기 때문에 Unity Asset store에서 구매하여 사용하였습니다. 문제는 제가 이펙트를 적용하여 게임을 제작해 본 적이 없다는 것이지요.

 

공격 및 스킬 이펙트를 모션과 어떻게 싱크를 맞춰 자연스럽게 보이게 할 것이며, 피격 판정 또한 어떻게 하면 자연스럽게 들어갈까가 고민사항이었습니다. 이 부분에 대한 경험이 없다보니, 구글링도 해보고 유튜브도 찾아봤지만 죄다 아티스트를 위한 이펙트 제작 정보만 있었습니다... Unity Asset Store에 샘플 프로젝트라도 있었으면 뜯어봐서 참고해봤을텐데 찾진 못했습니다. 발표 마감일도 다가오니 시간도 없고 해서 하드코딩으로 구현하는 수 밖에 없었네요...

 

 

 


1. IEffect, ISound 인터페이스와 EffectGenerator

 

공격 유형에 따라 그에 따른 이펙트와 사운드 에셋들이 필요합니다. 카론의 노 프리팹에서 필요한 에셋들을 추가해주었습니다.

 

 

그리고, 각 공격 유형에 따라 어떠한 이펙트를 생성하고, 어떤 사운드를 재생해야 할 지 결정해야 합니다. 이 부분과 관련해서는 인터페이스(Interface)를 사용하여 구현하는 것이 편하겠다고 판단하였습니다.

 

카론의 노(CharonPaddle) 클래스에서는 이펙트 생성과 사운드 재생 메서드만 가지고 있고, 이것을 실제로 호출하는 시점은 애니메이션에서 이벤트 함수를 사용할 예정입니다.

 

 

 

그리고 플레이어 캐릭터(손돌)의 자식 빈 오브젝트로 EffectGenerator를 하나 만들어주었습니다.

이 오브젝트의 위치에서 수행하는 공격과 관련된 이펙트를 생성할 것입니다.

 

 

이렇게 되면, 각 공격 애니메이션마다 EffectGenerator의 위치를 조정하여, 공격 모션과 이펙트가 싱크가 맞는지를 체크해줘야 합니다. 좀 하드한 방법이긴 한데, 다른 특별한 방법이 생각나질 않더군요.

 

기본 공격 1타
기본 공격 2타
기본 공격 3타

 

다른 공격 및 스킬들도 비슷한 원리로 적용해주었습니다. 이제 IEffect 인터페이스 구현부에서 EffectGenerator의 트랜스폼 위치를 받아와서 생성해주면 됩니다.

 public void PlayComboAttackEffects()
 {
     int comboCount = Mathf.Clamp(ComboCount - 1, 0, 3);
     GameObject effect = Instantiate(defaultAttackEffs[comboCount]);
     Vector3 targetDirection = Player.Instance.Controller.MouseDirection;

     effect.transform.position = Player.Instance.effectGenerator.position;

     // 2번째 공격 이펙트의 각도가 90도 틀어져 있어서 조치한 방법
     Vector3 secondAttackAdjustAngle = ComboCount == 2 ? new Vector3(0f, -90f, 0f) : Vector3.zero;
     effect.transform.rotation = Quaternion.LookRotation(targetDirection);
     effect.transform.eulerAngles += secondAttackAdjustAngle;
     effect.GetComponent<ParticleSystem>().Play();
}

 

 

 


2. 애니메이션 이벤트 함수

 

이펙트 생성 부분은 다했습니다. 이제 애니메이션에서 적절한 키프레임에 이벤트 함수를 호출해주는 일만 남았습니다.

플레이어(손돌) 캐릭터에 Animator 컴포넌트가 붙어있으므로, 손돌 오브젝트에 부착되어 있는 AnimationEventHandler 스크립트에서 이 부분을 작성해주었습니다.

 

AnimationEventHandler 클래스에서는 다음과 같은 Dictionary를 가지고 있습니다.

public Dictionary<string, IEffect> myWeaponEffects { get; private set; }
public Dictionary<string, ISound> mySounds { get; private set; }

 

무기 이름key로 가지고, 해당 무기에 대한 참조value로 가집니다. 이렇게 하면, 현재 내가 가지고 있는 무기 클래스에 대해 참조하여, 이펙트나 사운드 재생 관련 메서드를 실행할 수 있습니다.

 

해당 Dictionary에 등록하는 과정은 게임이 처음 실행될 때, WeaponManager 클래스에서 사용 가능한 무기 목록들을 체크한 뒤 모두 등록합니다. 아무튼, AnimatinoEventHandler 클래스에서는 현재 착용 중인 무기 이름을 키 값으로 하여, 찾고자 하는 value가 있는지 확인하여 재생하면 됩니다.

 

공격 모션을 시작할 때 애니메이션 이벤트 함수로 호출할 메소드

 

아래 정도 키프레임이 됐을 때, 호출하면 될 것 같아 해당 키프레임에 이벤트 함수로 걸어줬습니다.

 

공격 모션이 시작될 때의 키 프레임에 이벤트 함수를 걸어주는 모습

 

공격 모션이 끝났는지 어떻게 판별할까 하다가, 이것도 끝 부분에 애니메이션 이벤트 함수를 등록해주었습니다.

해당 모션이 끝났다면, 세팅들을 초기화해줘야 합니다.

 

 

공격 모션이 끝났을 때의 키 프레임에 이벤트 함수를 걸어주는 모습

 

이와 비슷하게 확장해나가면서, 다른 공격 유형과 스킬에 대해서도 적용해주면 됩니다.

다음과 같은 모습이 되겠네요.

 

 

 

 


3. 테스트 및 결론

 

이펙트 적용과 관련하여 노하우가 없어, 되게 하드한 방식으로 만든 것 같다는 느낌도 들었습니다. 어떤 좋은 방법이 있다면 샘플 프로젝트라도 얻어서 뜯어 공부하고 싶네요. 이펙트와 사운드 부분은 제가 많이 다뤄보지 못해 부족하다는 느낌을 얻은 경험이었습니다. 많이 다뤄봐야겠네요!

 

아래는 이펙트를 적용한 결과들입니다. GIF라 소리는 안 나긴 하네요.

(GIF 녹화 버튼 누르고, 게임 화면을 클릭하니 처음 평타가 나가네요..ㅎㅎ)

 

기본 3타 공격
대시 공격
차징 공격 중단(3초 차징 시 차징 모드 해제됨)
차징 공격 성공
스킬

 

여기에 몬스터들이랑 이제 카메라 셰이킹만 추가하면 타격감이 좋아지겠네요!

긴 글 읽어주셔서 감사합니다.

 

 

728x90
반응형