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

coffeecat0213님의 프로필 이미지
coffeecat0213

작성한 질문수

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

스킬 구현 질문입니다

작성

·

24

0

워크래프트3 영웅들 패시브 오라처럼 영웅이 살아있을때 영구적으로 지속되는 스킬은
패시브로 짧은 주기마다 계속해서 효과를 주면 되는걸까요?

간단한 스탯 영구적 증가 효과 스킬을
패시브 타입으로 세팅에 apllycount 1, cooldown 1
이펙트 세팅에서 duration 1.5 로
이와 같이 하여 구현을 해보았습니다.
혹여 더 좋은 방법이나 위의 방법이 문제가 있을지 궁금하여 질문드립니다.

답변 2

0

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

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

 

말씀하신 방식대로 진행을 하셔도 되구요, Effect의 duration을 0(=무한)으로 설정하고 종료 Option을 DurationEnded로 설정하면 무한히 적용되니, Buff를 준 영웅이 죽었을 때 다른 Entity들에 적용된 Buff를 삭제할 방법만 마련하시면 이 방법을 쓰셔도 됩니다. 삭제 방법으로는 Effect 자체에 종료 조건을 Module로 만들어서 Effect Owner Skill의 Owner Entity가 죽으면 끝나게하거나 영웅이 죽을 때 다른 Entity들을 조사해서 영웅이 준 Buff를 삭제하는 식 등이 있습니다. 답은 없으니 낫다고 생각되는 방향으로 진행하시면 됩니다.

 

감사합니다.

coffeecat0213님의 프로필 이미지
coffeecat0213
질문자

답변 감사합니다.
구현에 관해 질문이 하나 더 있습니다.
플레이 중에 스킬을 레벨업 하지 않고 스킬에 이펙트를 추가하는 방법이 있을까요
Skill 스크립트에 effects 를 public으로 해서 단순히 이펙트를 add 하는 방법을 써봤는데 적용이 되지 않았고
foreach (Skill skills in skill.Owner.SkillSystem.ActivateSkills)

if(skills.HasCategory(category) && !skills.skillDatas.Last(x => x.level <= skills.Level).effectSelectors.Contains(skill.skillDatas.Last(x => x.level <= skill.Level).effectSelectors[0]))

{

skills.skillDatas.Last(x => x.level <= skills.Level).effectSelectors.AddRange(skill.skillDatas.Last(x => x.level <= skill.Level).effectSelectors);

}

skillDatas를 List로 바꾸고 public으로 하여
이런 식으로 주먹구구식으로 적용해봤는데 의도한대로 작동하긴 합니다..
더 나은 방법이 있으실까하여 물어봅니다

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

effectSelectors를 public으로 만들지 마시고
EffectSelector class에 Effect와 Level 값을 받을 수 있는 생성자를 추가하신 뒤
effctSelectors의 자료형을 List<EffectSelector>()로 바꾸시고
Skill에 다음과 같은 함수를 추가하시면 됩니다.

void AddEffect(int targetSkilllevel, Effect effect, int effectLevel)
{
skillDatas[targetSkilllevel- 1].effctSelectors.Add(new EffectSelector(effect, effectLevel))
// Effect가 추가된 skillData와 currentData의 Level이 같다면 Skill의 Effects 변수 재할당 작업
if (level == currentData.level)
ChangeData(currentData);
}

Contains 같은 경우도 함수를 AddEffect처럼 함수를 따로 만들어서 Check하시거나 IReadOnlyList<EffectSelector> EffectSelectors => currentData.effectSelectors처럼 ReadOnly Type으로 반환해주시면 됩니다.

다만 위 Add함수처럼 Data에 직접 Effect를 삽입하면 나중에 Level이 바뀌어도 추가된 Effect가 유지되기 때문에 딱 지금만 임시로 추가되는 Effect라면 Effects 변수에 직접 넣는게 맞습니다. Effects에 넣었는데 작동안하신다고 얘기하신 부분은 실제로 모든 작업은 Effects 변수가 하고 있기 때문에 작동을 안하는건 이상한 상황입니다.

감사합니다.

0

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

워크래프트 3의 영웅처럼 지속적으로 효과를 발휘하는 패시브 스킬을 구현하는 방법에 대해 문의 주셨군요. 말씀하신 대로 간단한 스탯 증가 효과를 지속적으로 주기 위해 주기적으로 효과를 적용하는 방식으로 접근하신 것은 좋은 방법입니다.

  • 영구적 스탯 증가: 패시브 스킬의 일환으로 한 번 적용되면 게임 종료까지 지속되는 방식이 있습니다. 이 경우 초기 적용 시점에 한 번만 효과를 적용시키고 이후에는 별도의 업데이트를 하지 않도록 설정할 수 있습니다.

  • 주기적 효과: 주기적으로 스탯을 증가시키는 방법도 가능합니다. 말씀하신 설정대로 applyCountcooldown을 활용하여 주기적으로 효과를 갱신하면 됩니다. 그러나 기본적으로 이 방법은 지속적인 체크가 필요하므로 퍼포먼스를 고려해야 합니다.

  • 더 나은 방식: 만약 효과가 복잡하지 않고 단순한 상태 변화라면, 상태 변화를 초기 상태에서 한 번만 설정하고, 별도의 주기적 체크를 피하는 것이 효율적일 수 있습니다. (예: HP 증가, 방어력 증가 등 영구적 변화는 초기 상태 체크 후 변화.)

적절한 접근 방식은 게임 내 다른 시스템과의 연계, 스킬의 복잡성, 퍼포먼스 이슈 등을 고려해 선택하셔야 합니다. 기본적으로 큰 문제는 없을 것으로 보이지만, 테스트 통해 다양한 게임 상황에서의 동작을 확인해 보시길 권장드립니다.

더 많은 정보와 사례를 원하시면 아래 유사한 기존 질문과 답변을 참고하시기 바랍니다:
- 적 스킬 관련 질문
- 스킬제작 질문입니다

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

coffeecat0213님의 프로필 이미지
coffeecat0213

작성한 질문수

질문하기