인프런 커뮤니티 질문&답변

최원준님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

몬스터 AI #2

오류

22.09.16 13:06 작성

·

438

0

8분여 정도 몬스터 따라오기 실행시키는 가운데 아래와 같은 에러 메시지가 뜹니다.

NullReferenceException: Object reference not set to an instance of an object

MonsterController.UpdateMoving () (at Assets/Scripts/Controllers/MonsterController.cs:66)

BaseController.Update () (at Assets/Scripts/Controllers/BaseController.cs:54)

cs 66번째 줄은 nma.speed 줄이고

// 이동

Vector3 dir = _destPos - transform.position;

if (dir.magnitude < 0.1f)

{

State = Define.State.Idle;

}

else

{

NavMeshAgent nma = gameObject.GetOrAddComponent<NavMeshAgent>();

nma.SetDestination(_destPos);

nma.speed = _stat.MoveSpeed;

transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 20 * Time.deltaTime);

}

BaseController cs 54는 UpdateMoving(): 줄입니다.

void Update()

{

switch (State)

{

case Define.State.Die:

UpdateDie();

break;

case Define.State.Moving:

UpdateMoving();

break;

case Define.State.Idle:

UpdateIdle();

break;

case Define.State.Skill:

UpdateSkill();

break;

}

}

 

무엇이 문제인지요?

답변 5

0

최원준님의 프로필 이미지
최원준
질문자

2022. 09. 16. 14:13

아직까지 따라가기 급급해서 전체적 맥락만 대략 파악하고 진도 나가고 있습니다. 다시 한번 학습하면서 브레이크포인트 등을 통해 세밀하게 복습해 나가겠습니다. 친절한 가르침 넘넘 감사드립니다. 불금되세요.

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2022. 09. 16. 14:16

ㅎㅎ 찾으셨다니 다행이고 다음 강의 만들 땐 디버깅을 더더더 강조해야겠군요.

스스로 코드 작업을 하실 땐 위와 같이 짜잘한 크래시가 많이 나는데
null 크래시 같은 경우에는 30초 이내로 원인 파악까지 끝낼 정도로 숙련이 되어야 합니다.

1) _stat에서 크래시 났다!
2) breakpoint 걸고 null 여부 확인
3)
_stat 채우는 부분에서 breakpoint 걸고 확인
4) 해당 줄이 무엇이 문제인지 분석

요 스텝은 딱히 책에서 가르쳐주는 개념은 아니고,
스스로 버그마다 접근하는 요령이 생겨야 합니다.

그럼 힘내세요!

0

최원준님의 프로필 이미지
최원준
질문자

2022. 09. 16. 14:12

_stat = gameObject.GetComponent<Stat>();

이것이 저는

_stat = gameObject.GetComponent<PlayerStat>();

으로 되어 있었습니다.

이것을 샘과 같이 고쳤더니 더 이상 에러가 안뜹니다.

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2022. 09. 16. 14:09

그 부분이 아닙니다.
float MoveSpeed는 애당초 단순 float라서 아무 문제가 없고
_stat = gameObject.GetComponent<Stat>();
하는 부분 바로 다음에 breakpoint를 걸고 _stat을 잘 찾는지를 확인하셔야 합니다.
아마도 Stat 콤포넌트가 없을 확률이 높습니다.

0

최원준님의 프로필 이미지
최원준
질문자

2022. 09. 16. 14:04

Monstercontroller.cs 위에 마우스를 가져가면 아래와 같이 나옵니다.

맥용 비주얼스튜디오 사용중입니다.

스크린샷 2022-09-16 오후 2.02.35.png스크린샷 2022-09-16 오후 2.02.42.png

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2022. 09. 16. 13:41

크래시가 나는 부분에 breakpoint를 걸고 디버깅을 해보시기 바랍니다.
null 크래시는 가장 빈번하게 발생하는 버그라서, 쉽게 찾으실 수 있을겁니다.
이런 문제는 반드시 스스로 찾는 연습을 꾸준히 해야 디버깅 속도가 빨라집니다.

최원준님의 프로필 이미지
최원준
질문자

2022. 09. 16. 13:49

nma.speed = _stat.MoveSpeed;

이 부분을 빼니깐 되네요. 제가 몬스터를 다른 것을 가져와 붙여서 그런가요?

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2022. 09. 16. 13:53

코드를 빼서 테스트를 하기 보단 breakpoint를 걸고 유니티에 연결을 하신 다음
멈춰서 살펴보세요. _stat이 null이라거나, nma가 null이라거나 어떤 이유가 있겠죠!
_stat이 null이라면 다시 _stat을 채워주는 부분 코드에 가서 살펴보면 됩니다.

최원준님의 프로필 이미지
최원준
질문자

2022. 09. 16. 13:57

스크린샷 2022-09-16 오후 1.56.04.pngbreakpoint 이렇게 해서 찾는 것이 맞는지요?

보니 _stat에 대한 MoveSpeed 구성원을 찾을 수 없다고는 말이 나오는데 무슨 말인지요?

제가 MoveSpeed를 규정하지 않아서 그런가요?

Stat.cs 보면 아래와 같이 선언되어 있는데요.

스크린샷 2022-09-16 오후 1.59.25.png

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2022. 09. 16. 14:01

혹시 VS를 사용하시는게 맞나요?
그리고 stat이 null인 상황으로 보이는데,
위에서 _stat에 마우스를 갖다 대면 어떻게 나오는지 확인 후
stat을 채우는 코드에서도 bp를 걸어보세요.