게임 개발 공부 기록

65일차 - Abyss_Slayer 최종 팀 프로젝트 15 (트러블 슈팅 보완, 메이지 스킬 구현)

00lwt 2025. 4. 24. 21:44

▶▷ 이전 트러블 슈팅 보완

1. 어제 작성했던 트러블 슈팅의 내용 중 애니메이션 클립 상의 회전값 적용에 대한 내용에 대해 방향에 맞는 이미지를 사용하는 것으로 문제를 해결했으나 원인이 궁금해서 찾아보았고 해당 내용에 대해 추가로 작성해보려고 한다.

문제의 원인은 Apply Root Motion이었다. 루트 모션을 체크한 상태로 하면 적용이 되지 않고 해제하면 적용되는 것을 확인했다.

루트 모션은 애니메이션에 포함된 리소스의 회전 및 이동 데이터를 자동으로 적용하는 것인데 이것 때문에 애니메이션의 회전이 정상적으로 적용되지 않고 어딘가에서 막힌 것 같다.

2. 어제 해결하지 못한 코루틴의 반복에 대한 내용의 원인은 코루틴을 시작하는 부분에서 생긴 문제였다.
기존에는 싱글톤으로 만든 별도의 코루틴 매니저를 통해 StartCoroutineEnter()를 호출해서 사용했었는데 이것이 문제가 되었다.

CoroutineManager.cs

public class CoroutineManager : Singleton<CoroutineManager>
{
    protected override void Awake()
    {
        base.Awake();
    }


    public Coroutine StartCoroutineEnter(IEnumerator enumerator)
    {
        return StartCoroutine(enumerator);
    }


    public void StopCoroutineExit(Coroutine coroutine)
    {
        if(coroutine != null)
        {
            StopCoroutine(coroutine);
        }
    }
}

코루틴을 자주 사용할 것 같아 미리 만들어두고 사용하는 방식이고 이 스크립트를 통해

player.SkillTrigger.HoldSkillCoroutine = CoroutineManager.Instance.StartCoroutineEnter(Repeat());

이런식으로 호출을 했는데 이건 홀딩 스킬 전용 호출 방식이라 그런 방식이 아닌 메이지의 d스킬 코루틴이 제대로 반복되지 않았고

CoroutineManager.Instance.StartCoroutine(Repeat());

이렇게 수정하니 정상적으로 호출되었다.

▶▷ 메이지 d스킬

전방으로 일정 거리만큼 충격파를 일으키는 스킬이다.

 

RepeatRangeSkill.cs

[CreateAssetMenu(fileName = "NewRepeatRangeSKill", menuName = "Skill/RangeAttack/RepeatRange")]

public class RepeatRangeSkill : RangeAttackSkill
{

    [field: Header("콜라이더 크기")]
    [field: SerializeField] public Vector2 ColliderSize { get; private set; } = new Vector2(1.8f, 14);

    [field: Header("오브젝트 크기")]
    [field: SerializeField] public Vector2 SpawnSize { get; private set; } = new Vector2(1, 0.4f);

    [field: Header("콜라이더 위치 값 조정")]
    [field: SerializeField] public Vector2 ColliderOffset { get; private set; } = new Vector2(0, 7);

    [field: Header("오브젝트 위치 값 조정(플레이어 기준)")]
    [field: SerializeField] public Vector2 SpawnOffset { get; private set; } = new Vector2(3, -1.1f);

    [field: Header("생성 딜레이 시간")]
    [field: SerializeField] public float TickRate { get; private set; } = 0.5f;

    [field: Header("콜라이더 유지 시간")]
    [field: SerializeField] public float Duration { get; private set; } = 0.5f;

    [field: Header("Effect 이름")]
    [field: SerializeField] public string EffectName { get; private set; } = "이펙트 이름";

    public override void UseSkill()
    {
        base.UseSkill();
        CoroutineManager.Instance.StartCoroutine(Repeat());
    }

    public IEnumerator Repeat()
    {
        WaitForSeconds wait = new WaitForSeconds(TickRate);

        // 풀에서 ZoneAOE 꺼내기
        for (int i = 0; i < 5; i++)
        {
            Vector3 offset = new Vector3(SpawnOffset.x * PlayerFrontXNormalized(), SpawnOffset.y, 0);
            Vector3 spawnPos = player.transform.position + offset + new Vector3(i * 2 * PlayerFrontXNormalized(), 0, 0);

            var zone = PoolManager.Instance.Get<ZoneAOE>();
            zone.Init(player, this, spawnPos, SpawnSize,  ColliderSize, ColliderOffset, TickRate, Duration, Damage, TargetLayer, EffectName);

            yield return wait;
        }
    }
}

기존의 범위 스킬에서 사용했던 RemoteZoneSkill.cs와 구조는 비슷하지만 범위를 반복 생성하는 로직에서 차이가 있다.

생성 위치를 기준으로 반복을 한번 할 때마다 플레이어 포지션을 기준으로 i * 2를 하여 x축으로 두칸씩 멀어지면서 생성이 되도록 구현하였다.

 

▶▷ 트러블 슈팅

막히는 점
1. 스킬 이펙트가 살짝 위로 올라간 이미지라 콜라이더와 이미지의 위치가 일치하지 않는 현상

2. 애니메이션 클립에서 일정 값을 입력해도 입력한대로 들어가지 않고 이상한 수로 변경되는 현상.
(포지션 부분에 -17을 입력하면 -2.62로 바뀌어서 입력되고 -18을 입력하면 -2.77로 입력됨)

시도한 점
1-1. 이펙트의 포지션 값만 변경 시도
1-2. 애니메이션 클립에서 포지션 및 스케일 값 변경 시도

2-1. 회전 문제 때 시도했던것 처럼 프레임을 한칸 당겨서 값 설정 시도
2-2. 이펙트 프리펩 내 스프라이트 오브젝트의 인스펙터 창에서 값 설정 시도

원인
1. 같은 프리펩에서 오프셋이랑 콜라이더 크기랑 애니메이터등의 정보만 바꿔서 스킬이 실행되는 방식이라
프리펩 자체의 값을 변경하면 나머지도 다 바뀌고 별도로 애니메이션 클립 상에서 값을 변경하려고 해도 적용되지 않음

2. 정확한 원인은 발견하지 못함. (코드 상에서 초기화하는 부분도 없었고 스케일 또한 기본값인 상태였음)

해결
1. 코드 상에서 콜라이더 및 오브젝트의 크기, 콜라이더 및 오브젝트의 위치를 전부 각각 초기화 하는 부분을 추가하여 해결

2-1. 애니메이션 클립의 녹화 버튼을 누르고 인스펙터 창에서 수치를 변경하여 해결
2-2. 1번의 방식으로 바꾸면서 애니메이션 클립에서 변경한 부분들은 삭제하여 해결