[Unity] Knife Hit (7)

suhan0304·2024년 8월 30일

유니티 - Knife Hit

목록 보기
7/9
post-thumbnail

Boss Animation

보스 애니메이션을 이어서 개발해보자. 애니메이션을 새로 추가하기 전에 Events를 별도로 실행해주려고 델리게이트 정리를 좀 진행해주었다.

  • 보스가 생성될 때 실행될 애니메이션과 같은 메소드들의 들어갈 OnBossSpawn
  • 보스가 파괴됐을때 기존의 상태로 되돌아갈 메소드들을 담은 OnBossDestory

그 다음 GameManager에서 보스가 생성됐을때 이벤트가 실행되도록 했다.

private void StartStage() {
    if (stageNum%5 == 0) {
        SpawnBoss(stageNum%5);
        Events.OnBossSpawn.Invoke();
    }
    else {
        SpawnTarget();
    }

    UIManager.Instance.Initialize();
    UIManager.Instance.SpawnKnivesIcon(RemainKnives);
    
    SpawnKnife();
    Events.OnStartStage?.Invoke(stageNum);
}

그 다음 애니메이션을 DOTween Animation으로 넣어주고 아래와 같이 실행시킬 수 있다. ( OnComplete 콜백 함수로 애니메이션을 연결해놓았다. )

public void BossStageAnimation() {
    stageIconsContainer.GetComponent<DOTweenAnimation>().DOPlay();
}

보스 파괴 이벤트 애니메이션까지 구현한 최종 코드는 아래와 같다.

UIManager.cs


[Button("OnBossSpawn")]
public void OnBossSpawn() {
    stageIconBoss.transform.DOPunchScale(new Vector3(0.25f, 0.25f, 0), 0.5f, 5, 1f)
            .OnComplete(()=> {
                stageIconsContainer.GetComponent<DOTweenAnimation>().DOPlay();
            });
}

[Button("OnBossDestroy")]
public void OnBossDestroy() {
    stageIconBoss.GetComponent<DOTweenAnimation>().DOPlayBackwardsAllById("stageBoss");
    stageIconsContainer.GetComponent<DOTweenAnimation>().DOPlayBackwards();
}

DOPlayBackwards는 쉽게 말해 되감기라고 생각하면 된다. 이 때 오브젝트에 두 개의 DOTween Animation 컴포넌트가 들어있어서, AllById로 불러와서 같이 실행해주었다. (당연하게도 ID 설정해줘야 한다.)

문제가 생겼는데 OnComplete에서 호출한 DOPlay가 잘 실행되지 않는다, 인스펙터에서 버튼을 실행 시키면 잘 되는데 인 게임에서는 DOTween이 작동이 원할하지 않다... 왜 이럴까

-> 원인을 찾았는데 엄한 곳에서 OnBossDestroy를 호출하고 있었다. 아래와 같이 수정해주니깐 해결됐다.

public void OnAllKnivesOnHit() {
    if(stageIdx > 4) {
        Events.OnBossDestroy.Invoke();
        InitializeStageIcons();
    }
    else if (stageIdx == 4){
        stageIdx++;
    }
    else {
        stageIcons[stageIdx].transform.DOPunchScale(new Vector3(0.25f, 0.25f, 0), 0.5f, 5, 1f)
            .OnComplete(()=> {
                stageIconsImage[stageIdx++].color = stageCurrentColor;
            });
    }
    HideStageTextFadeAnimation();
}

최종적으로는 아래와 같이 코드와 컴포넌트를 설정해주었다.

[Button("OnBossSpawn")]
public void OnBossSpawn() {
    Debug.Log("[UIMagner.cs] OnBossSpawn");
    stageIconBoss.transform.DOPunchScale(new Vector3(0.25f, 0.25f, 0), 0.5f, 5, 1f)
            .OnComplete(()=> {
                stageIconsContainer.GetComponent<DOTweenAnimation>().DOPlay();
            });
}

[Button("OnBossDestroy")]
public void OnBossDestroy() {
    Debug.Log("[UIMagner.cs] OnBossDestroy");
    DOTween.Sequence()
        .AppendCallback(() => {
            stageIconBoss.GetComponent<DOTweenAnimation>().DOPlayBackwards();
        })
        .AppendInterval(0.5f)
        .AppendCallback(() => {
            stageIconsContainer.GetComponent<DOTweenAnimation>().DOPlayBackwards();
        });
}

이 때 중요한 점은 DOPlay()와 같은 DOTween Animation 컴포넌트 메소드들은 Tweening 반환 형식이 아니라서 Sequence에 그냥 추가할 수 없다. 따라서 AppendCallback으로 콜백 함수로 시퀀스에 추가해주어야 한다.

Rewind를 쓰기 위해서는 AutoKill을 비활성화 해주어야한다. AutoKill이 활성화되어 있으면 시작 애니메이션이 실행 후에 Kill되서 Rewind 할 수 없다. Rewind(되감기)를 위해서는 그 트위닝을 보유한 상태로 있어야한다.

완성된 모습은 아래와 같다. 보스 스테이지에서 UI의 애니메이션이 잘 적용된 모습니다.

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글