유니티 과제를 진행하면서
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에서 실행하십시오.
1016 TIL - Unity InputSystem 심화 (5) | 2024.10.16 |
---|---|
1015 TIL - 유니티 입문 팀 프로젝트 주차 돌입 (3) | 2024.10.15 |
1011 TIL - Unity 오브젝트 풀링 (1) | 2024.10.12 |
1007 TIL - 유니티 InputSystem (5) | 2024.10.07 |
1002 TIL - 프로젝트 5일차 (0) | 2024.10.02 |