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

이상목님의 프로필 이미지
이상목

작성한 질문수

[Unity] 함께 만들어가는 방치형 게임 개발

근접 공격

근접 공격 강좌에서 NRE이 발생하는데 시점 문제로 발생한 문제인지 이슈를 쳐내기가 곤란합니다.

해결된 질문

작성

·

62

·

수정됨

0

image.png

이러한 이슈가 발생해 찾은 결과

 

image.png

Monster Script의 37번 째 줄인 FindClosetTarget 함수에서 타겟을 찾지 못해 NPR이 발생한 내용으로 확인되었는데

Spawner에 Players를 넣어주어 플레이어인 Cleric과 Barbarian이 잡히나, 간헐적으로 Null을 return 해주는 현상이 발생하는데, 이게 Update 문 안에서 실행되어 FindClosetTarget 구문이 매우 빠른 속도로 실행되어 발생한 시점 문제인지 궁금합니다. 현재 강사분과 코드는 동일한 것으로 확인됩니다.

 

image.png

 

답변 2

0

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

안녕하세요, 괜찮으시다면 pinous.g@gmail.com
으로 프로젝트 전체를 보내주실 수 있으실까요? 직접 파악하여 컴포넌트 설정에서의 문제가 혹시 있을지 파악을 좀 해보도록 하겠습니다 🙂

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

프로젝트 보내시는게 혹여 어려움이 있으시다면 크롬 원격 데스크톱도 가능하니 참고 부탁드립니다 🙂

이상목님의 프로필 이미지
이상목
질문자

안녕하십니까, 혹시 깃 주소로 보내드려도 괜찮을까요 ?

이상목님의 프로필 이미지
이상목
질문자

https://github.com/sangmoki/IdleHero_RPG

로 현재까지 강의 보며 진행한 내용 최신화 진행해놓았습니다.

이상목님의 프로필 이미지
이상목
질문자

번거로우시다면 원격 진행도 가능합니다.

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

원격은 안 해도 될 것 같습니다 ㅎㅎ 프로젝트 파악 후 말씀드리겠습니다!

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

안녕하세요! 스크립트 파악 해 보았습니다.

m_Target.GetComponent<Character>().isDead<- 해당 구분을 수정 하였습니다.
현재 새소식란에 제가 깃허브 링크로 지금까지 만들었던 스크립트를 넣어 두었는데요,

차이점을 먼저 말씀드리면
FindClosetTarget은 m_Target이 null일때에만 작업을 진행하고,
m_Target이 null이 아닐때에 하단의 문장들이 시작됩니다.

현재 수강생님 코드는 m_Target이 null일 때에도 해당 Target의 isDead변수를 참조하려고 하면서 문제가 발생합니다.

Target이 없기에 isDead도 찾지 못하여서 생긴 문제이니 스크린샷을 보시고 수정 해 주시면 좋을 것 같습니다 😃

또 다른 어려운 점이 있으시다면 편하게 질문 부탁드리겠습니다 !!

image.png


이상목님의 프로필 이미지
이상목
질문자

빠른 답변 감사합니다.

혹시 현재 Unity 버전과 visual studio 버전을 동일하게 맞춰놓았는데

지금 강사님과의 코드와 상이한 부분이 있었던 것인지,

아니면 장비의 렌더링 차이 ex) CPU, RAM 등 으로 인한 속도 차이 때문에 발생한 것 인지

어떠한 문제가 발생된 것일까요 ?

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

코드 부분이 약간 다르게 되어 있었더라구요, 위에 설명드렸듯 수강생님 코드에서는 조건문이 빠져 있었습니다..!

아마 현재까지 수강한 제 강의에서는 저대로만 진행이 됐어도 추후에 수정이 들어갔을 수도 있습니다. 깃허브 링크 안에 있는 코드와는 조건문의 차이로 오류가 발생하고 있었습니다 🙂

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

image.png


현재 제가 깃허브에 올려둔 수강생님의 코드 부분입니다.
다른점은 if문의 차이이고 보고 계시는 영상속에서 제가 해당 부분을 작업하지 않았다면 그 부분은 추후에 오류수정을 함께 진행하면서 작업했을 가능성이 있습니다..! 이 점 양해 부탁드리겠습니다..!

이상목님의 프로필 이미지
이상목
질문자

아 그렇군요, 같은 코드로 실행하는데 이슈가 발생해 계속 문제를 찾고 있었는데,

최신화 부분은 강사님 깃허브 소스를 참고하겠습니다.

추후 해당 회차 강의(섹션3. 근접공격 강좌의 약 27분경 부근)에서 이 문제를 겪으시는 분들이 계실 것 같습니다 !!.

굉장히 빠른 답변 감사드리며 좋은 강의 제공해주셔서 감사합니다.

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

넵! 좋은 피드백 진심으로 감사드립니다. 해당 영상에는 추후 자막으로 간단한 안내문구를 삽입하겠습니다 :)

0

안녕하세요, 인프런 AI 인턴입니다. 이상목 님.

NullReferenceException 오류는 Unity에서 빈 객체 참조를 처리할 때 흔히 발생하는 문제입니다. 질문주신 내용으로 유추해보면 FindClosestTarget 함수에서 타겟을 찾지 못해 오류가 발생하는 상황인 것 같습니다. 간헐적으로 Null을 반환하는 문제는 다양한 요인에서 발생할 수 있습니다. 이 문제를 해결하기 위한 몇 가지 방안을 제안드리겠습니다.

문제분석 및 원인

  • 타겟팅이 불규칙적으로 Null을 반환하는 경우:
    1. 스크립트에서 플레이어 목록을 올바르게 초기화하지 않거나, 업데이트 중에 플레이어 객체가 삭제되어 참조를 잃었을 가능성이 있습니다.
    2. Update 메서드 내에서 FindClosestTarget 함수가 너무 자주 호출되면서, 플레이어 객체들이 제대로 갱신되지 않은 상태에서 접근하려고 했을 때 발생할 수 있습니다.

해결 방안

  1. 타겟 리스트 초기화 및 갱신 확인:

    • Spawner 혹은 관련 매니저 클래스에서 플레이어 리스트를 일관되게 유지하고 초기화해주세요. 예를 들어, 게임 시작 시점이나 새로운 플레이어가 추가될 때마다 리스트를 갱신하는 코드를 작성하세요.
  2. 제대로 초기화 되었는지 체크 및 길이 확인:

    • FindClosestTarget 함수에서 플레이어 리스트가 비어 있지 않은지를 먼저 체크하고, Null이 반환되지 않도록 방지하는 코드 추가:
    if (players == null || players.Count == 0) 
    {
       Debug.LogWarning("플레이어 리스트가 비어 있습니다.");
       return; // 또는 기본 동작 정의
    }
    
  3. 에러 방지를 위한 조건 처리:

    • FindClosestTarget 함수 내에서 타겟이 유효한지를 항상 체크하고 설정하기 전 모든 참조가 올바른지 확인합니다.
    if (currentTarget == null)
    {
       currentTarget = DefaultTarget(); // 또는 적절한 기본값 반환
    }
    

기존 질문 및 해결 방법 열람

유사한 문제에서 기존 수강생들이 비슷한 문제를 해결한 방안을 보시고 참고하실 수 있습니다:
- 애니메이션 점프 적용되지 않는 문제

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이상목님의 프로필 이미지
이상목

작성한 질문수

질문하기