해결된 질문
작성
·
93
답변 3
1
수강해주셔서 감사합니다.
해당 기능은 ApplyCount마다 Effect와 TargetSearcher, Animation을 따로 지정할 수 있게 확장해주시면 됩니다.
강의에서 여러 Data들을 Level로 묶었듯이 여러 정보들을 ApplyCount로 묶는겁니다.
이게 강의에서 만든 단일 설정의 Skill이구요,
이런 식으로 Action과 관련된 설정을 묶어서 현재 ApplyCount에 해당하는 설정을 가져와서 사용해주면 됩니다. ApplyCount가 많을 시에는 Level처럼 새로운 ApplyCount 설정이 있을 때까지 이전 ApplyCount 설정을 사용하는 형태로 만들어주시면 됩니다. 이미지에는 없지만 PrecedingAction과 Action도 추가해주시면 ApplyCount에 따라서 완전히 다른 형태의 공격이 나가는 Skill도 만들 수 있습니다.(ex.리신 음파-1타 투사체-2타 돌진)
이 이외의 방법으로는 Input마다 Skill들을 아예 따로 만들어서 Link 시켜두고 Skill을 사용할 때마다 Skill이 Link된 다른 Skill로 교체되게 만드는 방법이 있습니다.
방법은 여러가지가 될 수 있기 때문에 조언드린 얘기를 토대로 해당 기능 구현을 시도해보시면 될 것 같습니다.
감사합니다.
일단 Skill Damage에 영향을 주는 Bonus Stat이 있어야할거구요,
Effect가 영구 적용되는 패시브를 만들어서 Effect 자체가 event를 통해 Stack을 쌓고, 쌓인 Stack마다 BonusStat의 수치를 올려주면 됩니다.
예를 들어 다음과 같습니다.
// EffectAction.cs
[SerializeField]
private Stat bonusStat;
private Effect ownerEffect;
public void Start(Effect effect;)
{
ownerEffect= effect;
// Effect의 소유주인 Entity가 적에게 Damage를 줬을 때
ownerEffect.Owner.Owner.OnDealDamage += OnDealDamage;
// Effect의 소유주인 Entity가 적을 죽였을 때
ownerEffect.Owner.Owner.OnKill += OnKill;
}
public bool Apply(Effect effect)
{
// Apply에서 해줄 것은 없음.
return true;
}
public void Relese(Effect effect)
{
ownerEffect.Owner.Owner.OnDealDamage -= OnDealDamage;
ownerEffect.Owner.Owner.OnKill -= OnKill;
bonusStat.RemoveBonusValue(this);
}
Public void OnStackChanged(Effect effect, int newStack)
{
// 이 BonusStat을 다른 Effect들의 Damage에 곱해지는 Bonus 값으로 사용하면 Stack 중첩에 따라 Effect의 Damage가 늘어나게됨.
bonusStat.SetBonusValue(this, newStack * bonusValue);
}
public void OnDealDamage(object causer, Entity target, float damage)
{
// Entity가 적에게 Skill로 Damage를 줬다면 이 Action을 소유한 Effect의 Stack을 1 올림
if (causer is Effect)
ownerEffect.Stack += 1;
}
public void OnKill(Entity instigator, object causer, Entity target)
{
// Entity가 적을 스킬로 죽였고, 스킬이 초강력 화염 숨결이라면 소유한 Effect의 Stack을 1 올림, 실제로 개발할 때는 변수로 확인할 Skill을 받는게 좋음.
if (causer is Effect && causer.Owner.CodeName == "초강력 화염 숨결")
ownerEffect.Stack += 1;
}
Apply를 지속적으로 안해줘도 event를 통해서 Effect를 지속적으로 업데이트 해줄 수 있기 때문에 duration = 0, ApplyCount는 1로해서 한번만 적용해주면 됩니다.
다양한 형태의 Skill을 만들기 위해서는 event 기반 구조가 필수이기 때문에 event 기반 구조에 익숙해지시는게 중요합니다.
0
0
안녕하세요, 인프런 AI 인턴입니다. 장원님.
리븐의 Q나 아트록스의 Q와 같은 Input형 스킬을 구현하려면, n번째 사용에 따라 다른 동작을 수행하도록 설계해야 합니다. 이러한 스킬은 일정 시간 내 재사용 시 다른 효과를 적용하게 됩니다. 아래에 유사한 구현 사례와 함께 링크를 제공드립니다.
위 링크들은 모듈식 스킬 시스템을 활용하여 다양한 스킬을 구현하는 방법을 설명합니다. 이를 참고하여 원하는 기능을 추가하실 수 있을 겁니다.
간단한 개요:
1. 상태 관리:
- 각 스킬의 상태(예: 리븐 Q의 1타, 2타, 3타)를 추적해야 합니다.
- 타이머를 사용하여 일정 시간 내에 다음 타를 사용하지 않을 경우 초기 상태로 돌아가도록 설정합니다.
Effect와 스킬 구현:
코루틴과 타이머 이용:
Coroutine
을 사용하여 일정 시간이 지나면 상태를 초기화하도록 구현.예를 들어, 리븐의 Q를 구현한다면:
private int currentSkillStage = 0;
private float lastSkillTime;
public float skillResetTime = 2f;
public void OnSkillInput()
{
if (Time.time - lastSkillTime > skillResetTime)
{
currentSkillStage = 0;
}
lastSkillTime = Time.time;
switch (currentSkillStage)
{
case 0:
// 첫 번째 공격
PerformFirstAttack();
break;
case 1:
// 두 번째 공격
PerformSecondAttack();
break;
case 2:
// 세 번째 공격
PerformThirdAttack();
break;
}
currentSkillStage = (currentSkillStage + 1) % 3;
}
private void PerformFirstAttack()
{
// 첫 번째 공격 로직
}
private void PerformSecondAttack()
{
// 두 번째 공격 로직
}
private void PerformThirdAttack()
{
// 세 번째 공격 로직 (에어본)
}
이러한 방법으로 스킬을 구성하면 사용에 따라 다른 효과를 구현할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사드립니다! 추가로, 스몰더 패시브와 같이 특정 조건들(ex) 스킬로 챔피언을 맞추는 경우, 특정 스킬로 적을 처치할 경우)을 만족하면 Stack이 증가하고 해당 Stack이 다른 스킬에 영향을 미치는 구조(ex) 중첩에 따라 스몰더의 기본 스킬 피해량이 증가한다.)의 경우 기존 Apply시 CurrentStack이 상승하는 구조에서 Stack 상승에 관한 모듈을 따로 만들어서 적용시키면 될 지, 또 해당 Stack이 다른 스킬들에 영향을 미치게 하려면 어떤 방식이 제일 좋은 지 궁금합니다.