잘못된 참조값으로 인한 코드 오류(게임매니저에서 드래그엔 드롭을 하면 객체가 생성되니 그거를 가지고 코드 작성)
문제
문제의 코드 내용
게임 매니저
public GameObject endPanelRef;
private GameObject endPanel;
private EndPanelController endPanelController;
public List<Sprite> castings;
private EndPanelAnimationController endpanelanimation;
public void StageStart()
{
endPanelController = endPanel.GetComponent<EndPanelController>();
endpanelanimation = endPanel.GetComponentInChildren<EndPanelAnimationController>();
life = 3;
currentScore = 0;
GameObject newball = Instantiate(Ball, new Vector3(0, -3, 0), Quaternion.identity);
BallList.Add(newball);
Time.timeScale = 1f;
}
public void GameOver(bool clear)
{
EndPanel(clear);
Time.timeScale = 0;
endPanel.SetActive(true);
endPanelController.ClearText(clear);
endPanelController.SetScore(currentScore);
endPanelController.SetCastingImage(castings[3]);
endpanelanimation.Down();
highScore = Mathf.Max(highScore, currentScore);
scoreRanking.Add(currentScore);
scoreRanking.Sort(new Comparison<int>((n1, n2) => n2.CompareTo(n1)));
}
EndPanelAnimationController 클래스
public class EndPanelAnimationController : MonoBehaviour
{
Animator animator;
private static readonly int isDown = Animator.StringToHash("isDown");
private void Start()
{
animator = GetComponent<Animator>();
}
public void Down()
{
animator.SetBool(isDown, true);
}
}
게임 매니저에 endPanel 오브젝트를 가지고 와서 그 오브젝트에서 가지고 있는 스크립트를 받아와서 안에있는 함수를 호출하는 코드인데 밑에 오류메세지를 보시면 EndPanelAnimationController클래스에서 Animator animator 이 부분이 할당이 되지 않는다 라고 해서 이해가 가지를 않았다. 나는 분명 드래그엔드롭으로 값을 넣어줬는데 어째서 할당이 안되는건지 전혀 모르겠다.
오류메세지
UnassignedReferenceException: The variable animator of EndPanelAnimationController has not been assigned.
You probably need to assign the animator variable of the EndPanelAnimationController script in the inspector.
해석
EndPanelAnimationController의 변수 애니메이터가 할당되지 않았습니다.
아마도 인스펙터에서 EndPanelAnimationController 스크립트의 애니메이터 변수를 할당해야 할 것입니다.
문제 해결
값이 할당이 되지 않았던 이유는
게임매니저에 넣었던 게임오브젝트는 프리펩에 있던 게임오브젝트였고
하이어라키창에 넣은 오브젝트는 프리펩에서 드래그엔 드롭으로 놓은 오브젝트이다.
이렇게 놓으면 같은 프리펩에서 꺼내와 사용을 했다고 해도 게임매니저에서 참조하고 있는 게임오브젝트와 하히어라키창에 올려놓은 게임 오브젝트는 다른 게임오브젝트인 것이다. 왜냐하면 게임 매니저에서 드래그 앤 드롭을 이용해서 게임 오브젝트를 가져오면 그 자체로 객체가 생성이 되는건데, 생성된 객체를 사용하지 않고 프리팹 자체를 참조하려고 했기 때문입니다. 이렇게 하면 하이어라키에 있는 인스턴스와 코드에서 참조하는 객체가 서로 다른 인스턴스가 되어, 오브젝트를 올바르게 제어할 수 없게 됩니다.
해결방법은 게임매니저에서 참조하는 게임오브젝트를 endPanel = Instantiate(endPanelRef);를 사용해서 새로운 인스턴스를 만든다음에 그거를 가지고 이제 하이어라키창에 넣은것처럼 코드를 작성하면 된다.( 그냥 Instantiate 이거 한줄만 넣으면 된다. )