24.03.02 TIL - Unity : Animator | Rebind(), 애니메이터 리셋 & Play() : 지정 애니메이션 재생

JJwoo·2024년 3월 1일

몬스터 오브젝트 하위에 UI Canvas 있고, 이 하위에는 QuestionMark 오브젝트가 있으며, ImageAnimator 컴포넌트를 보유중

한줄 요약

특정 조건이 만족 되면, 숨겨놓은 Image를 팝업 하고, 애니메이션을 1회 재생하고 다시 숨긴다.
다만 이 과정에서 애니메이션을 항상 초기화 시키고,
조건 성립 때마다 애니메이션의 처음부터 재생되어야 함

A. 현재 트러블

조건에 의해 작동 될 때, QuestionMark 오브젝트의 Animation이 처음부터 제대로 재생되지 않고 이미지의 중간 즈음에서 멈춰 있다.


B. 구현 상황

  1. 평상시에는 QuestionMark라는 이미지는 보이지 않음
    (완료)

  2. OnTriggerEnter2D 작동 시 QuestionMark라는 이미지가 보임 (스크립트로 구현 완료)

수정 되어야 할 부분

3.QuestionMarkAnimator가 작동하면서 미리 설정해둔 Question 이라는 애니메이션이 이미지 애니메이션의 처음부터 끝까지 1회만 재생됨
다음에 다시 작동할 수 있도록 애니메이션 단계 초기화

  1. 이후 QuestionMark 이미지는 다시 사라짐

C. 해결 방법

Animator 클래스의 Play()와 Rebind()를 사용하여 애니메이션을 원하는 시점에서 재생하고, 초기화하는 로직을 구현.

위 메서드들의 매개 변수에 대한 자세한 설명은 코드 이미지나, 주석 참조

전체 코드)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ColliderMark : MonoBehaviour
{
    public Image questionMark; // 물음표 이미지
    public Animator questionMarkAnimator; // 물음표 이미지에 대한 Animator 컴포넌트

    void Start()
    {
        if (questionMark != null)
        {
            questionMark.enabled = false; // 물음표 이미지 비활성화
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        // 물음표 마크 오브젝트의 콜라이더, 플레이어와 충돌했는지 확인
        if (collision.CompareTag("Player") && questionMark != null)
        {
            questionMark.enabled = true; // 물음표 이미지 활성화

            if (questionMarkAnimator != null)
            {
                // Animator 컴포넌트를 사용하여 애니메이션을 제어
                questionMarkAnimator.Rebind(); // Animator 컴포넌트 상태 초기화(처음으로)
                
                questionMarkAnimator.Play("Question", -1, 0f);
                // "Question" 이라는 애니메이션 / -1 : 레이어(-1은 모든 레이어) / 0f : 애니메이션(시간)의 처음부터.
                // 요약 : 첫 프레임부터 재생한다
            }
            StartCoroutine(DeactivateImage(questionMark, questionMarkAnimator, 1.0f)); 
            // 지정된 시간 1초 후에 이미지와 애니메이션을 비활성화
        }
    }
    private IEnumerator DeactivateImage(Image image, Animator animator, float delay) // 매개변수 - 이미지 / 애니메이터 / 지정 시간
    {
        yield return new WaitForSeconds(delay);

        if (animator != null)
        {
            animator.Rebind(); // 애니메이터 상태 리셋
        }

        image.enabled = false; // 이미지를 비활성화
    }
}
  • questionMark 이미지와 questionMarkAnimator 애니메이터에 대한 참조함.

  • 플레이어가 콜라이더와 충돌하면, 이미지가 활성화되고 애니메이션이 재생 됨.

  • 이 후, Coroutine을 활용하여 지정된 지연 시간(1초) 후에 이미지와 애니메이션을 비활성화

  • Rebind 메서드는 애니메이터의 상태를 초기화하고, Play 메서드는 우리가 설정한 시간 0f(초)에 따라 애니메이션을 처음부터 재생한다.

  • 이후 인스펙터 창에서 QuestionMark 오브젝트의 Image, Animotor를 스크립트가 참조할 수 있도록 각각 연결해준다.

4. 결과

물음표 마크의 애니메이션이 잘 재생되고 있다.


이후 목표는
1. 물음표 마크 로직 작동 (감정 표현) 위에서 구현 완료
2. 상호 작용
3. 상호 작용 끝나고 보여주고 싶은 다른 이미지 기능을 프로그래밍해야 한다.

profile
개발 모코코

0개의 댓글