inflearn logo
강의

Course

Instructor

Game Development with Unity: Part 2. Introduction to C# Programming

List of reference formats

NullReferenceException을 기대했는데....

326

Hyobin Kim

81 asked

0

쓰신 코드 보니까 Destroy 관련해서 NullReferenceException을 유도해낼 수 있을거라 생각을 했는데 그렇지가 않아서 질문을 드립니다

    public List<GameObject> objs;

    void Start()

    {

        objs = new List<GameObject>();

        GameObject go1 = new GameObject();

        GameObject go2 = new GameObject();

        objs.Add(go1);

        //objs.Add(go2);

        //Destroy(objs[0]);

        Destroy(go1);

        //objs.RemoveAt(0);

        print(go1.name);

    }

이게 제가 테스트 해본 내용입니다

제 생각에는 objs에 go1을 추가하고, 

 Destroy(go1); 실제 go1을 없애고

objs.RemoveAt(0)을 하지 않았기에 해당 리스트의 참조변수는 남아있으나 참조 대상이 없어져버려서(go1) nullReferenceException이 일어날거라고 생각을 했습니다

결과는 일어나지 않았고 그래서 그 앞에 Destroy(objs[0]);을 추가 해봤지만 print(go1.name);는 앞선 경우와 마찬가지로 작동을 하더군요

제 생각에 이러는 이유는 계층뷰에서 해당 게임 오브젝트가 존재해서 같은데 이유가 뭔가요?

C# unity

Answer 1

1

UDevApp

안녕하세요. 요즘 바빠서 답변이 늦었습니다. 죄송합니다. 

Destroy 가 되었어도 현재 Start 에서 Destroy 를 실행했기에 현재 프레임이 끝나고 나서 다음 프레임에서 print(go1.name); 을 실행해야 오류가 발생합니다. 

업데이트에서 실행해보면 오류를 발생시킬수 있는데 이 경우 go1 과 go2 를 멤버로 잡아야하겠죠. 

아래와 같이 하면 오류가 발생합니다.  삭제 하고 나서 다시 접근하니까요.

public class TestScript : MonoBehaviour
{
    public List<GameObject> objs;
    GameObject go1;
    GameObject go2;
    void Start()
    {
        objs = new List<GameObject>();
        GameObject go1 = new GameObject();
        go1.name = "go1";

        GameObject go2 = new GameObject();
        go2.name = "go2";
        objs.Add(go1);


        Destroy(go1);
        print(go1.name);
    }

    // Update is called once per frame
    void Update()
    {
        print(go1.name);
    }
}

0

Hyobin Kim

이게 라이프 사이클이랑 관련 있을거라고는 생각을 못했네요

어쨋거나 한 프레임에서 일어나는 거니까 Start()함수가 실행된 바로 그 프레임에서 만들고, 추가하고 지우고 그리고 다시 접근하는 이 모든게 다 일어나는 거라 생각했습니다

그렇다면, 메모리 인스턴스의 새로고침(?)은 프레임 단위로 일어난다고 봐도 될 까요?

0

UDevApp

네 현재 프레임이 끝나고 나서 일어납니다. 다음프레임에서는 적용되니까요.

어디서 일어나는지는 현재 프레임이 끝나고 나서 적용된다고 예상할수 있죠. 

다음프레임에 적용된다고 생각하셔도 무리 없을 것 같습니다. 

Part4 유니티로 세가지의 게임만들기 강의도 들을 수 있는건가요?

0

263

1

플레이 버튼이 없어요

0

758

1

전체 연습문제 다운방법, 현재 연습문제 파일이 깨져서 열립니다.

0

377

2

연습문제파일

0

262

1

중단점을 찾을수가 없습니다

0

470

1

10분 24초에 만약 b를 0으로 둘시, "나눗셈이 불가능"대신 attempt to divide by zero 오류가 뜹니다.

0

313

1

if문의 비교(10분56초~59초사이)

0

219

1

C#에서의 메모리 관리

0

273

1

Heap 과 Stack

0

303

1

앞선 강의에서 Instance와 연관 지어서

0

271

3

Instance와 variable

0

243

1

구조체 6번째 강의

0

190

1

제공 함수는 실제 구현하는 몸체가 없다

1

343

1

인자와 매개변수

1

215

1

코드에서 new GameObject를 실행했을 때 유니티 화면상의 상태 문의

2

624

1

유니티 콘솔화면에 나타난 내용 문의

1

353

1

멤버변수를 전역변수라고 생각해도 되는지요?

1

1227

1

출력만 있는 함수 관련 질문

1

422

2

문제 파일은 어디에 있나요?

0

235

1

제 윈도우용 visual studio에서는 코드행 앞에 아무것도 안찍힙니다.

0

321

2

혹 강의내용을 캡쳐해서 블로그에 공개해도 되나요?

0

365

1

비쥬얼 스튜디오에서 강의대로 입력했는데 콘솔창에 아무것도 안나타나네요.

0

264

1

저는 윈도우즈에서 모니터를 두개로 나눠 강의영상과 Unity작업창으로 나눠서 하고 있는데 무슨 얘긴지 하나도 모르겠어요

0

231

2

갑자기 파일을 추가하려면 과정을 설명해 주셔야 하는데 그냥 파일부터 추가하네요.

0

172

1