캐릭터의 스킬구조를 뜯어 고치고 있다.
스킬 버튼을 누르면 해당 스킬의 범위를 보여주고, 버튼을 뗄때 스킬이 발동된다.
스킬 범위 구현
데칼을 활용해서 보여주도록 했다.
90도 부채꼴, 180도, 원형 세종류의 데칼을 준비하고, 이 데칼이 바닥에만 표시될 수 있도록 Rendering Layers를 LightLayer1을 지정해주고, 바닥도 LightLayer1을 지정해주었다.
public virtual void OnInputDown()
{
if (IsSkillAvailable)
{
if (stateMachine.Skill!=null && stateMachine.Skill != this)
{
stateMachine.Skill.areaIndicator.gameObject.SetActive(false);
}
stateMachine.Skill = this;
attackPosition = character.Pivots.AttackPivot.position + character.transform.forward * Info.ActivationRange;
ShowArea();
GameObject collider = SpawnManager.SpawnCollider(Info.AttackAngle,
character.transform.forward * Info.ActivationRange,
Quaternion.Euler(new Vector3(90, Info.AttackAngle==90? -45:0, 0)),
character.transform);
collider.transform.localScale = new Vector3(Info.AttackRange, Info.AttackRange, 1);
areaCollider = collider.GetComponent<SkillAreaCollider>();
}
}
public virtual void ShowArea()
{
areaIndicator = SpawnManager.SpawnSkillIndicator(Info.AttackAngle,
character.transform.forward * Info.ActivationRange,
root: character.transform).GetComponent<AreaIndicator>();
areaIndicator.Init(Info.AttackRange,Info.ActivationRange,character.transform);
}
스킬이 눌렸을 때 해당 스킬의 공격 위치와 범위정보를 가져와 적절한 위치와 크기로 생성해준다. SpawnManager를 통해 생성하는데, SpawnManger는 오브젝트를 생성할 때 자동으로 풀링을 관리해준다. 즉, 이 영역을 보여주는 데칼 오브젝트도 풀링이 적용되고 있다.
스킬의 타격 구현
처음에는 overlapsphere로 범위의 오브젝트를 찾은 후, 내적으로 원하는 공격 각도 내의 몬스터를 선별하게 했었다. 이렇게 하면 범위내의 몬스터를 훌륭히 찾을 수는 있지만.. 공격 범위에 매쉬가 애매하게 겹쳐있는 경우에는 매쉬는 범위안에 들어가 있지만, 포지션은 범위 밖이라 검출되지 않는 문제가 있었다.
이렇게 되면 몬스터가 조금 커져서 몬스터의 일부분을 타격하게 되는 경우 상당히 불쾌해질 것 같았기에 블랜더에서 매쉬를 몇개 만들어와서 콜라이더를 적용했다.
캡슐이나 박스보다 조금 부하가 먹겠지만... 한두개씩만 생성 될 것이니 큰 문제 없을 것이라 생각한다. 나중에 좀더 네모나게,,, 폴리곤을 조금 줄이는 정도의 타협은 가능할 듯.
Collider를 Trigger로 설정하여 Trigger안에 들어온 collider들을 list로 갖고 있도록 한다.
public override void Excute()
{
base.Excute();
int count = Mathf.Min(Info.TargetCount, areaCollider.colliders.Count);
for(int i = 0; i< count; i++)
{
if (areaCollider.colliders[i].gameObject.TryGetComponentInParent<IDamagable>(out IDamagable component))
{
float damage = (character.StatHandler.CurrentStat.PhysicalAttack + Info.PhysicalFlat) * (Info.physicalMultiplier / 100);
component.TakeDamage(damage);
}
}
areaCollider.gameObject.SetActive(false);
}
스킬을 발동시키는 부분에서 이렇게 콜라이더 내의 오브젝트가 맞을 수 있는 오브젝트인지 검사해서 맞을 수 있는 오브젝트일 때 데미지를 가하도록 하였다.
'Develop_Log' 카테고리의 다른 글
[내배캠 최종 프로젝트] 스테이지 및 캐릭터 데이터 구성 (0) | 2024.12.11 |
---|---|
[내배캠 최종 프로젝트] 캐릭터 구현 (0) | 2024.12.04 |
[내배캠 최종 프로젝트] 맵 장애물 구현 (0) | 2024.12.03 |
[ScriptableObject Loader] Excel에서 SO로 만들기 (0) | 2024.11.24 |
[팀플젝 회고] 유니티 심화주차 (0) | 2024.11.22 |