채널톡 아이콘

인프런 커뮤니티 질문&답변

고우진님의 프로필 이미지

작성한 질문수 25

[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템

패링형 스킬에 대해 여쭤보고싶습니다

작성

·

107

1

롤에 피오라 W, 이터널 리턴의 니키 W의 스킬들은 각각 가드 성공의 트리거가 하드CC기, 데미지가 트리거가 되는데 이 트리거가 되는 시간을 만들기 위해서는 이펙트를 이용한 버프를 활용하기에는 InActionState에 추가적인 수정이 필요한것같아 모듈식 개발의 취지에 맞질 않다고 생각합니다.

추가적인 스킬 스테이트 머신을 만들고 InGuardingState와 같은 예시로 신규 스테이트를 만든 후에 해당 스테이트에서 공격한 대상, 받은 공격의 종류, CC기의 유무를 받게하고 이를 통해서 추가적인 애니메이션과 이펙트를 발동하게 하려고 하는데 이런식의 구조가 모듈식 개발의 적합할까요?

답변 2

1

Developer G님의 프로필 이미지
Developer G
지식공유자

수강해주셔서 감사합니다.

개인적으로 봤을 때 InGuardingState을 만드는건 그다지 좋은 생각 같진 않습니다.
피오라의 W는 공격을 막을 뿐만 아니라 마지막에 찌르기로 공격도 하죠?
니키도 마찬가지구요.
상태의 이름이 Guarding인데 여기에 공격에 대한 처리까지 들어간다는건 맞지 않을거구요, 공격에 대한 부분을 다른 State로 뺀다고하면, 앞으로 만들 다양한 효과를 가진 Skill들도 다 이런 식으로 State를 만들어줄거란 얘기인데 StateMachine이 불필요하게 커지겠죠.

예시의 두 캐릭터 정도의 Skill은 Skill System을 크게 확장안해도 쉽게 만들 수 있습니다.

[피오라 응수]
(PrecedingAction, 자신한테 Buff Effect를 걸고 0.75초 대기)피오라가 0.75초 동안 받는 모든 공격과 이동 불가 효과, 해로운 효과를 막아낸 다음,
(Action, 공격이 적중한 적에게 Effect 적용)검을 찌릅니다. 검은 처음 적중한 챔피언에게 마법 피해를 입히고, 2초간 이동 속도와 공격 속도를 25%씩 둔화시킵니다.
(Action 강화)피오라가 이동 불가 효과를 막아낼 경우, 찔린 적은 둔화하는 대신 기절시킵니다.

마지막에 특정 조건 하에 Skill의 효과가 강화되는 부분만 기능 확장을 해주시면 됩니다. 살짝 편법으로 CC를 막아내면 순간적으로 Skill의 레벨을 올렸다가 Skill의 발동이 끝나면 다시 원래 레벨로 돌리는 식으로도 구현할 수 있을겁니다.

[니키 가드&카운터]

(Skill1)가드:
(PrecedingAction, 자신한테 Buff Effect를 걸고 0.75초 대기)마우스 커서가 위치한 방향으로 가드 자세를 취하여 0.75초 동안 모든 받는 피해가 감소하고, 모든 방해 효과를 무효화합니다.
(Effect가 다른 Skill을 활성화 시킴)피해 효과 혹은 이동 불가 효과의 가드에 성공한 경우, 7초 동안 분노의 펀치!(E2)를 사용할 수 있게 되며,
(Action, Skill2를 발동)지속 시간이 끝나면 카운터를 발동합니다.

(Skill2)카운터: 짧은 거리를 돌진하면서 주변의 적들에게 스킬 피해를 입히고 1.5초 동안 이동 속도가 65% 느려지며, 지속 시간에 걸쳐 천천히 회복됩니다. 이동 불가 상태에서는 카운터가 발동하지 않습니다.

니키의 W는 리신의 음파와 비슷하게 사실 Skill이 두 개입니다. 자기한테 0.75초 동안 공격 피해를 감소하는 Buff를 걸고, 이 Buff의 특수 효과로 공격 피해를 감소시킬 때 같은 Button에 할당되어 있는 분노의 펀치 Skill을 활성화시키는거죠(UseCondition 이용). 이 Skill을 사용하게되면 사용하고 있던 가드 Skill이 Cancel되면서 발동하는 겁니다.

감사합니다.

고우진님의 프로필 이미지
고우진
질문자

피오라 같은경우에는 가드 성공 유무의 상관없이 무조건 반격이 되는거라 어떤 구조로 설명하셨는지 이해했습니다.

그런데 니키의 경우처럼 성공하면 자동으로 카운터가 재생되고 후에 E스킬이 강화가 되고 반격에 실패할경우 카운터 없이 그대로 스킬이 끝나게 되는데 자동으로 카운터가 작동하게 되는것이 이해가 가질 않습니다.

신규 스테이트를 만들지 고민을 했던 이유가 후자의 사유 때문이라 InActionState에 조건이 맞지않으면 끝내버리면 쉽긴 하겠지만 부적합한것같은데 자동으로 카운터를 나가게 하려면 어떻게 해야할지 여쭤봐도 괜찮을까요?

Developer G님의 프로필 이미지
Developer G
지식공유자

제가 니키의 스킬 구조를 약간 잘못 이해했었네요.

Skill1 가드는 그냥 Guard Skill입니다. Action으로 받는 데미지 감소 Buff를 걸어주는 Skill이구요, 그러면 0.75초가 지나면 Skill이 그냥 끝나겠죠?

Skill2는 Passive Skill입니다. 데미지 감소 Buff가 발동하고(=데미지를 감소시켰고) Skill 1이 발동중인 상태가 아니라면 UseCondition이 true가되서 자동으로 발동됩니다. UseCondition에서 Skill1의 데미지 감소 Buff가 발동했는지를 감시해서 변수에 값을 저장하고, true를 return했다면 다시 값을 false로 초기화 시킵니다.

결과적으로 가드가 성공하면 Skill2로 연계, 가드가 실패하면 그대로 끝이 되는겁니다.
Skill 두 개가 연계된다는게 중요한 것이므로 연계 방법은 제가 설명드린 것 외에도 여러 가지가 있을 수 있습니다.

니키의 W를 하나의 Skill로만 보셔서 만들기 어려워보인다고 생각이 드실 수 있는데, 분리해서 보시면 만들기 쉽습니다.

고우진님의 프로필 이미지
고우진
질문자

좋은 조언 감사합니다

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 고우진님.

피오라의 W와 같은 패링형 스킬은 복잡한 로직과 여러 트리거 조건이 포함되어 있어, 모듈식으로 개발하는 데 있어 다소 도전적인 요소일 수 있습니다. 하지만 제안하신 방법은 모듈식 개발에 잘 맞는 접근 방식 중 하나입니다. 아래에 관련 유사 사례와 참고할 만한 링크를 안내드리겠습니다.

가능성 있는 접근 방식

새로운 스킬 스테이트 머신을 만들어 InGuardingState와 같은 상태를 추가하는 것은 좋은 방법입니다. 이렇게 하면 다음과 같은 이점이 있습니다.
- 모듈화: 각각의 상태에 따라 개별적으로 로직을 추가하거나 수정하기 용이합니다.
- 유지 보수: 특정 상태의 로직만 수정하면 되므로, 코드 유지 보수성이 높아집니다.
- 확장성: 새로운 패링 조건이나 효과가 필요할 때 쉽게 상태를 추가하거나 수정할 수 있습니다.

스킬 구현 시 고려 사항

  1. 상태 관리:

    • 각 패링의 상태를 독립적으로 구현하여 다양한 조건에 맞게 확장할 수 있습니다.
  2. 트리거 조건 검사:

    • 공격한 대상, 받은 공격 유형 등을 조건으로 걸어 다양한 트리거를 검사합니다.
  3. 효과 및 애니메이션:

    • 애니메이션과 이펙트를 각 상태 기반으로 설정하여 독립적인 로직을 유지합니다.

관련 질문 링크

위의 링크들은 각각의 상태와 트리거 조건을 어떻게 관리하고 모듈화할지에 대한 힌트를 제공할 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.