유니티 오류의 각종 디버그 메세지 해결 방법 모음집
유니티를 처음 공부하거나 아직 유니티의 문법이나 사용법에 익숙하지 않은 사람들이 반드시 한번씩 보게 되는
각종 디버그 메세지들은 처음 읽어보면 대체 무슨 말인지 어떻게 해결 하라는 것인지 알 수 없는 경우가 많고
하나씩 다 찾아다니며 해결하기엔 시간이 너무나 많이 소모되는 불상사가 벌어집니다.
글쓴이 역시 너무나 시간을 낭비하며 공부를 했고, 아직 모든 디버그 메세지를 보진 못했지만
이곳에 점차 오류와 디버그 메세지들을 정리해가며 내용을 추가하려고 합니다.
유니티 이벤트 시스템 오류
there are 2 event systmes in the scene. Please ensure there is always exactly oneevent system in the scene
이 부분은 Hierarchy 혹은 GameObject, Inspector 안에 자신도 모르게 이벤트 시스템을 1개 이상 넣었을 경우 발생하는 오류로,
한 Scene에서 1개의 이벤트 시스템만 존재해야 합니다. (나머지를 삭제 하면 해결되는 오류)
유니티 개체 참조 예외 처리 오류
NullReferenceException: Object reference not set to an instance of an object
참조 예외 처리 오류도 자주 나는 실수 중 하나로 대부분 component 가져오거나 다른 스크립트를
불러올 때 변수의 선언만 하고 실제로 component 가져오지 않았거나, 혹은 선언하는 순서의 문제로
null값이 들어왔기 때문이므로 선언의 순서를 바꿔보는 것으로 해결이 가능합니다.
혹은 다른 스크립트의 변수나 함수를 호출하는 부분이 private 선언 되어 있다면 public으로 선언을 바꿔 다른 스크립트에서
가져올 수 있도록 설정해 두는 것도 체크.
유니티 인스턴스화 하려는 오브젝트가 Null입니다 오류
ArgumentException: The Object you want to instantiate is null
이 오류는 대부분 프리팹을 만들고 불러오면서 값이 제대로 들어오지 않았을 때 생기는 오류로,
게임오브젝트를 선언 한 뒤에 프리펩이 있는 경로를 잘못 썼거나 프리펩의 이름이 다른 경우 오류가 생깁니다.
아래의 샘플 코드에서 무엇을 놓쳤는지 확인해보면 오류 해결 가능.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class s_open_kiosk : MonoBehaviour
{
public GameObject prefab;
public GameObject cube;
// Start is called before the first frame update
void Start()
{
prefab = Resources.Load<GameObject>(“Kiosk”);
}
private void Throw()
{
cube = Instantiate(prefab);
}
public void Update()
{
if (Input.GetButtonDown(“Y”))
{
Throw();
}
}
}
|
cs |
유니티 할당되지 않은 참조 목록 상 예외 상황 처리 오류
UnassingedReferenceException 에러
처음 씬에서 만들어진 게임 오브젝트에 사용되어 인스펙터창에 연결되어진 것들이 Prefab으로 만들었을 때
None상태로 변하면서 생겨나는 오류로 스크립트에서 요구되는 게임 오브젝트 연결이 제대로 되어 있는지 확인하거나
코드에서 하나하나 다시 찾아주어야 해결 가능한 오류입니다.
생각지도 못한 곳에서 연결이 빠져 있거나 코드로 불러올 때 참조 선언을 빼놓기 쉬우므로 천천히 살펴보아야 합니다.
코드상으로는 선언문에서 참조할 게임 오브젝트를 선언 후 Awake() 또는 Start() 메서드에서 초기화하여
연결하는 것으로 해결 가능합니다. (각 프로젝트에 따라 어디에서 참조할 오브젝트가 있는지 알 수 없으므로 스스로
어느 오브젝트에 컴포넌로 스크립트를 달아주었는지 생각하고 코드 작성할 것)
개인적으로 가장 편한 방식은 코드에서 다른 스크립트의 참조할 변수를 가져오는 것으로…
1
2
3
4
5
6
7
8
9
|
public class test : MonoBehavior
{
int value; //다른 스크립트 변수를 담음 변수
private void OnEnable()
{
vale = scriptname.other_value; //참조할 다른 스크립트.변수이름
}
}
|
cs |
(이 방식이 가장 편했습니다)
정리 하자면, 위의 샘플 코드는 다른 스크립트 변수를 현재 스크립트에서 새로운 변수로 받아서 사용할 때이고
- 다른 스크립트에 선언된 int 형은 public static int로 선언 되어 있어야 위의 코드가 작동
- 다른 스크립트의 변수를 그대로 유지하고 바꿔야 한다면
other_scriptname now_name; 선언 후
Awake() 또는 Start()함수에 now_name = Gameobject.Find(“하이라키 창 게임 오브젝트 이름”).GetComponent<other_criptname>(); - 그리고 사용할 때는 now_name.가져올 변수 이름
- 이 예제도 게임 오브젝트 타입일 때이고 각각 알아서 타입에 맞게 작성해서 사용하면 됩니다.
(새롭게 발견할 때마다 계속 추가 중)