유니티 공부.. 버그 잡기. 디버깅
unity 유니티 공부 2024. 11. 26. 18:04 |
골드메탈님디버그 강좌
Compile error = 소스 코드 에러
ide (비쥬얼 스튜디오) 에서 이런 빨간 밑줄이 보통 에러난 부분이다
runtime error 플레이 모드 실행 중 갑자기 발생하는 에러
런 타임 에러는 코드 한 줄 수정해서 끝나는 게 아닐 수 있음
여러 부분을 살펴봐야 함
Console 창의
빨간 느낌표 더블 클릭 하면 ide 로 연결됨
로직 에러
logic error
에러 메시지는 안 뜨지만, 의도하지 않은 결과가 나타남
+
![]() |
![]() |
오류가 난 곳에 간 후 | Debug.Log(속내용물);을 넣는다 |
디버깅 방법
Debug Log 사용해보기
Debug Log 사용 후 Null 메시지 가 나오면
해당 부분(Item)이 없어서 생기는 오류라 캄
해결되면 디버그 로그 이렇게 뜸
+
ide 에서 , 맨 왼쪽을 누르면 저렇게
빨간 점 이 생김
중단점 (break point) 이라 불림
상단 디버깅 시작
디버깅 모드 진입
유니티 인게임 플레이모드 시,
버그 뜨는 부분에 돌입시
게임 멈추고 ide 화면으로 돌입하게 됨
해당 줄 - > 우클 -> 조사식 추가
영문판에서 조사식은 watch 다
그럼 하단에
값이 null 인 걸 확인 가능
프로시저 나가기 를 누르면
다시 게임 플레이모드 재개 가능
디버깅 완료했으면 빨간 동그라미, 중단점 을 해제 할 것
+
유니티에서 자주 발생되는 오류 들
NullReferenceException
존재하지 않는 값(null)을 참조하려고 할 때 나타남
초기화 되기 전 사용되고 있나 확인할 것
MissingReferenceException
참조할 걸 찾을 수 없을 때
ArgumentException
이 에러는 매개변수가 예상된 값과 다르면 발생합니다
IndexOutOfRangeException
리스트 인덱스 범위가 예상 값을 초과할 때
FileNotFoundException
파일을 찾을 수 없을 때
+
NullReferenceException 해결법
null : 공허하다. 아무것도 없다는 뜻임
초기 시작 작업을 안해줘서 생기는 문제
오류가 난 곳. rigid 라는 구문 더블 클릭해서
위 쪽으로 타고 올라가고 살펴보기
Awake 나 Start 에
알맞은 문구를 넣어 초기화를 하면 해결됨
+
public 변수인 경우, 인스펙터 창에서 오브젝트 드래그 해서 지정해서
NullReferenceException 해결 가능
+
다른 오브젝트와 충돌시 이런 NullReferenceException 에러가 뜨기도 함
다른 오브젝트에서 꺼내쓸 컴포넌트를 지정하지 않아서임
= 스크립트를 빼 먹어서임
![]() |
![]() |
스크립트 빼 먹은 실수였던 거임
스크립트를 지정해주면 해결
+
IndexOutOfRangeException
배열, 리스트 범위를 넘을 때 발생
초과 하거나 미만해서 접근하면 발생
위의 경우
Size 4 로 설정했으면 값은 0 1 2 3 이다
유니티에선 첫 시작을 0부터 시작한다
스크립트 상에서 index < 5 로 해놨다
이 때 4 가 값이 되면 에러가 나는 것이다
왜냐면 0 1 2 3 만 해당되기 때문임
for 조건문 다룰 땐
상수를 쓰면 이런 문제가 자주 발생한다 함
상수 = 변수의 반댓말. 특정하게 지정한 숫자
![]() |
![]() |
상수를 쓰지 않고 objList.Length 를 쓰면 해결
또다른 해결법으론,
for 가 아니라 foreach 를 쓰면 해결
+
Debug 밑줄 오류. 모호한 참조 에러 날 때
맨위 using 참조 저 두개가 겹치는 게 원인
using U/nityEngine; 말고 다른 참조는 지워주면 해결
그래도 해결 안되면 아래 참조문구 추가
using Debug = UnityEngine.Debug;
+
ui 버튼 만들었는데 반응이 없을 때
다른 ui가 그 위를 덮어버려서 임
위 예시의 경우 "컨트롤" 글자 크기가 쓸데없이 커서 아래까지 침범했던 거임
UI - EventSystem 을 만들면 해결
+
버튼을 안 눌렀는데 눌림 상태가 되는 버그
button - navigation - none 으로 설정
+
이미지 Sprite 불러왔는데 이상하게 보여질 때
![]() |
![]() |
Sprite Mode = Pixel Per Unit 을 이미지 고유 사이즈로 변경 - Apply
예 : 이미지 사이즈가 16 x 16 이면 16을 입력
Advanced - Filter - Point 등으로 변경 - Apply
Default - Compression - None - Apply
압축을 안 시키겠다는 뜻
+
![]() |
![]() |
자동완성으로 문구를 만들었는
private void 이렇게 자동으로 생성되는 경우
비쥬얼 스튜디오 - tools - option - tools for unity - scope - default 로 설정
+
![]() |
![]() |
색이 이상하게칙칙하면 window - rendering - light - generate lighting 클릭
+
스크립트 컴파일 속도 빠르게 하는 법
이거 해보니 오히려 플레이 버튼 두 번 눌러야 함
1 프로젝트 세팅- 에디터 - enter play mode settings
do not reload domain or scene
2
무료 에셋 Fast Script Reload 을 깔기
https://assetstore.unity.com/packages/tools/utilities/fast-script-reload-239351?locale=ko-KR&srsltid=AfmBOooKyZdilioQmDKKUFO8Sn4nqU3AljKd0-HWoYAR1-AMxToQmh5B
Fast Script Reload | 유틸리티 도구 | Unity Asset Store
Use the Fast Script Reload from Chris Handzlik on your next project. Find this utility tool & more on the Unity Asset Store.
assetstore.unity.com
이거 버그 많음
+
컴파일 작동 안하면
유니티 에디터의 메뉴에서 Edit > Preferences로 이동합니다.
General 탭에서 Auto Refresh 옵션이 활성화되어 있는지 확인합니다.
만약 비활성화되어 있다면, 이를 활성화해 주세요.
+
https://www.youtube.com/watch?v=dynN70kyD9A
물리 버그 문제 고치기 영상 링크
+
rigid.velocity=Vector3.zero;
라고 쓰면 비주얼스튜디오에서 취소선이 생기는 오류가 있음
rigid.Sleep();
//rigid.velocity=Vector3.zero; 대체코드
그래서 rigid velocity vector3 zero 코드 말고
rigid sleep 을 사용함
+
![]() |
![]() |
척추개수 3 + 갑빠 매뉴얼 뼈 추가 |
척추개수 3 , 가슴 뼈 다른 아마추어를 사용할 경우 |
같은 블렌더 오토리그 를 사용해서 리깅해도
뼈 가 서로 다르면 저렇게 애니 깨짐
다른 캐릭간 애니메이션 공유시 주의할 것
+
유니티 플젝 평소대로 열었는데, 갑자기 세이프 모드니 오류 뜰 때,
예전에 만든 스크립트에 글자 오류가 있었다는 뜻임
괄호 () {} [] 를 빠뜨렸다던가
; 마침표를 빠뜨렸다던가
철자가 틀렸다던가가 원인임
+
int equipWeaponIndex = -1;
이런 인덱스 값은 맨처음 값을 -1 로 지정해줘야 버그가 해결되기도 함
0 으로 설정? 아님
1 으로 설정? 아님
-1 임. -1은 아무것도 아닌 걸 지정할 때를 의미함
+
챗봇에게 스크립트 물어볼 땐, 글자수 제한 10,000자가 있으니
다 복붙 못하니 주의
+
rigid.AddForce(Vector3.up * 80, ForceMode.Impulse);
플레이어가 점프했는데, 점프 모션에서 착지모션으로 변환이 안되는 버그
rigidbody 컴포넌트의 Mass 무게 5 이 값을 줄이거나
스크립트 상 애드 포스의 저 80 숫자 값을 올려 점프하는 힘을 높이면 됨
+
playTime / 3600
(int) (playTime / 3600);
값 적용 안되면
이렇게 앞에 (int) 넣기
정수숫자 라고 알려줘야 함
new Vector3 (boss.curHealth / boss.maxHealth, 1 , 1);
new Vector3 ((float)boss.curHealth / boss.maxHealth, 1 , 1);
값 적용 안되면
이렇게 앞에 (float) 소수 라고 알려줘야 함
+
public TextMeshProUGUI talkText;
// 옛날 방식 :
// public Text talkText;
유니티 최신버전에선 그냥 Text를 스크립트에서 안씀
전부 TMP 를 씀
TextMeshProUGUI 라고 스크립트 상에 표기함
+
StopCoroutine(Talk());
StartCoroutine(Talk());
뭔가를 스크립트로 실행하기 전에
stop 으로 닫기를 먼저 하자
이래야 꼬이지 않고 정상적으로 출력 가능해짐
+
using System;
using Random = UnityEngine.Random;
Random 사용시
스크립트 맨위 네임 스페이스를 이거 불러오게 함
int ranCoin = UnityEngine.Random.Range(0, 3);
// int ranCoin = Random.Range(0, 3);
// 이렇게 그냥 Random 쓰면 빨간줄 오류남
+
애니메이션 탭에서 add property 가 안눌러져요
하이어라키 창에서 해당 오브젝트를 클릭하면 됨
+
볼트 구버전 -> 비쥬얼 스크립팅 신규버전
구버전 Bolt | 신버전 Visual Scripting |
new flow machine | New Script Graph |
flow machine component | script machine component |
Branch | if |
Self | This |
Control Inputs | Trigger Inputs |
Value Inputs | Data Inputs |
Super Unit | Subgraph |
Graph Inspector 는 Window탭에서 켜는게 아니라 Script Graph의 왼쪽 위 자물쇠 옆에 i 버튼 |
|
Set Text | Text Mesh Pro UGUI Set Text |
Edit > Project Settings > Type Options ( unit wizard) |
Edit > Project Settings > Visual Scripting > Type Options |
tools - bolt - update unit options | edit - project settings - visual scripting - regenerate nodes |
window> variable 창이 없어지고 그래프 창에서 왼족 위에 <X> 버튼 (BlackBoard) |
+
베리어블 Variable 타입이 다 통일 했는지 확인해라
Scene에 속해있는 변수는 Get 노드 그리고 Set 노드에 Scene 으로 되어있나 확인해야함
+
tmp text mesh pro 의 맨아래 오버플로우 기본값은 no wrap, overflow 임