상세 컨텐츠

본문 제목

1014 TIL - Unity 애니메이터 갈아끼우기

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 10. 14. 20:33

본문

유니티 과제를 진행하면서

Player의 스프라이트가 변경되면(캐릭터가 바뀐다면) 애니메이션도 덩달아 바뀌게 하고싶다.

 

그런데 애니메이터로 생성된 오브젝트에 애니메이터를 넣을 수가 없다...

애니메이터를 제작하고

집어넣으려고 해도 안집어넣어진다.

오브젝트에 포함되어 있는 애니메이터만 오브젝트를 드래그 앤 드랍하는 것으로 집어넣을 수 있다..

 

그렇다면 스크립트로 직접 애니메이터를 넣으려면 어떻게 해야할까

우선 스프라이트의 경우를 보자

 

우선 플레이어는 위 사진과 같은 오브젝트 들로 이루어져있다.

 

Player 자체는 빈 오브젝트로 이 안에 스크립트들을 넣어서 작동하게끔 해주었다.

 

MainSprite 오브젝트에 SpriteRenderer를 추가해주고 스프라이트를 집어넣어주었다.

 

스크립트를 하나 작성해보자.

우선 게임매니저를 싱글톤 선언을 해준 후 플레이어를 집어넣어서 접근이 가능하게 해줬다는 점을 기억하자.

 

public class CharacterChange : MonoBehaviour
{
    private SpriteRenderer _playerMainSprite; //플레이어 스프라이트
    public Sprite ChangeToThisSprite; //를 이걸로 바꾸고 싶다.

	//Awake에서 플레이어 스프라이트를 게임매니저를 통해 변수에 할당
    private void Awake()
    {
        _playerMainSprite = GameManager.Instance.Player.GetComponentInChildren<SpriteRenderer>();
    }

	//이 메소드가 동작하면 스프라이트가 변경 됨
    public void ChangeCharacterSprite()
    {
        _playerMainSprite.sprite = ChangeToThisSprite;
    }
}

애니메이터도 똑같이 만들어보자.

 

using UnityEngine;

public class CharacterChange : MonoBehaviour
{
    private SpriteRenderer _playerMainSprite;
    public Sprite ChangeToThisSprite;

    private Animator _playerMainAnimator; //플레이어의 애니메이터
    public Animator ChangeToThisAnimator; //갈아끼울 애니메이터

    private void Awake()
    {
        _playerMainSprite = GameManager.Instance.Player.GetComponentInChildren<SpriteRenderer>();
        _playerMainAnimator = GameManager.Instance.Player.GetComponent<Animator>();
    }

    public void ChangeCharacterSprite()
    {
        _playerMainSprite.sprite = ChangeToThisSprite;
        _playerMainAnimator = ChangeToThisAnimator; //변수에 할당되기 때문에 변경되지 않음
    }
}

_playerMainSprite.sprite는 _playerMainSprite의 하위에 있는 스프라이트 란에 직접적으로 접근하지만

_playerMainAnimator는 그냥 변수이기 때문에 변수에 할당만 시킬 수 있고 접근이 되지 않는다.

 

따라서 Animator 하위에 있는 AnimatorController에 직접 접근해야 하는데

하위를 확인해봐도 뭐가 뭔지 알 수가 없다.

 

정답은 runtimeAnimatorController이다.

 

목표 애니메이터 또한 Animator가 아닌 RuntimeAnimatorController로 변경해주자.

using UnityEngine;

public class CharacterChange : MonoBehaviour
{
    private SpriteRenderer _playerMainSprite;
    public Sprite ChangeToThisSprite;

    private Animator _playerMainAnimator;
    public RuntimeAnimatorController ChangeToThisAnimator;

    private void Awake()
    {
        _playerMainSprite = GameManager.Instance.Player.GetComponentInChildren<SpriteRenderer>();
        _playerMainAnimator = GameManager.Instance.Player.GetComponent<Animator>();
    }

    public void ChangeCharacterSprite()
    {
        _playerMainSprite.sprite = ChangeToThisSprite;
        _playerMainAnimator.runtimeAnimatorController = ChangeToThisAnimator;
    }


}

이제 화면에 버튼을 추가해주고

 

컴포넌트를 수정해주고 실행해보면?

 

작동이 안된다.

 

널 참조 에러가 발생했다.

 

여러분은 GetComponent를 Awake에서 실행하는 실수를 범하지 말고

항상 Start에서 실행하십시오.

TTE

 

관련글 더보기