2010-01-24 6 views
1

Unity3D의 C# 스크립팅 환경 (Mono 아래 실행 됨)은 개체를 손상시킬 때 좋은 동작을합니다. 파괴 된 오브젝트를 가리키는 모든 참조를 automaticly null을 가져옵니다C# 자동 참조 할당 - 만들기 참조 null

GameObject ref1 = (GameObject)Instantiate(obj); 
    GameObject ref2 = ref1; 

    if (ref1 != null) 
     Debug.Log("ref1 is not null"); 

    DestroyImmediate(ref1); 

    if (ref1 == null) 
     Debug.Log("ref1 is null"); 

    if (ref2 == null) 
     Debug.Log("ref2 is null");  

출력 :

ref1 is not null 
    ref1 is null 
    ref2 is null 

이 acheive하는 방법에 어떤 아이디어?

감사

+0

ref1과 ref2가 GameObject가 아니라 System.Object 인 경우 작동하지 않습니다. – noon

답변

2

은 Unity3D (AB)는 연산자 오버로딩 + isDeletedDestroyImmediate 함수 true로 설정된 경우 bool isDeleted; 그래서 다음 null 대하여 평등 테스트 true을 수득 같은 내부 플래그의 어떤 종류를 사용하는 것이 가능하다.

+0

나는 그렇게 생각한다. 감사합니다. – noon

+0

그건 그렇고, 왜 "수익률"이라고 말했고 단순히 "돌아 오지"않았습니까? – noon

+0

그는 'yield'키워드를 의미하지는 않았지만 단어의 올바른 사용법입니다. :) –

1

당신은 값 매개 변수에 의해 호출 C#에서이 작업을 수행 할 수 없습니다. 전화 사이트에서도 ref 키워드가 필요한 ref 키워드를 사용해야합니다.

실제로 도달 가능하지만 파괴 된 (즉, 할당 취소 된) 관리 객체에 대한 유용한 개념은 없습니다 (실제로는 계산하지 않는 WeakReference 무시). 개체에 도달 할 수 없거나 파괴 할 수 없습니다.

+0

그는 개체를 참조하는 모든 변수를 Destroy 메서드 ... yeuch에 전달해야합니다. – x0n

0

"일반".NET에서는 불가능합니다. CLR이 작동하는 방식이 아닙니다.

+0

Unity는 여전히 C#이며 Mono에서 실행됩니다. 그들의 목적을 위해 모노 행동을 일부 변경했다고 생각하십니까? – noon

+0

unity3d가 Mono를 기반으로하는 반면, 그들은 크게 수정했습니다. 결국 유니티 3d는 모노 터치를하기 훨씬 전에 iPhone을 지원했습니다. –

0

재미있는 학문적 도전이지만 기술적 인 관점에서 볼 때 가치가있는 것은 아닙니다. 당신은 틀린 각도에서 이것을보고 있습니다 - CLR은 당신을위한 객체의 수명을 관리합니다. 모든 "변수"를 null로 설정할 수있는 유일한 방법은 destroy 메소드에 "ref"매개 변수 수정자를 사용하여 모든 변수를 전달한 경우입니다. 한 가지 방법으로 전체 프로그램을 작성하려고 계획하지 않는 한, 잘못된 트리를 짖고있는 것입니다. 제대로 구조화 된 클래스와 메서드는 가비지 수집 대상 객체를 해제하여 범위를 벗어나는 변수를 "제거"합니다.

+0

나는 당신의 요점을 이해하지만, 나의 목표는 이것이 좋은 디자인인지 아닌지에 대해 논쟁하는 것이 아니었다. 나는 그들이 그것을 어떻게하는지에 관하여 다만 정직하다. – noon

+0

좋아, 내가 unity3d를 오해 한 것 같아. 나는 그것이 C#처럼 보이는 스크립팅 언어라고 생각했지만, 이제는 그것을 볼 수있다. 나는 당신과 마찬가지로 관심이있다 : – x0n

3

아마도 동등 연산자가 대체 되었습니까? 그것은 당신의 의견을 설명해 줄 것입니다 : "ref1과 ref2가 GameObject가 아니라 System.Object라면 작동하지 않을 것입니다."

+0

DestroyImmediate를 호출 할 때 "Destroyed"플래그가 true로 설정되었다는 뜻인가? 그런 다음 == 연산자에서 null과 비교할 때이 플래그를 검사합니까? – noon

0

실제 클래스에 대한 참조를 보유하는 중개 클래스 (프록시)를 추가 할 수 있습니다.

귀하의 모든 참조는이 새로운 GameObjectProxy에 대한 것입니다. 이것은 GameObject와 동일한 API를 제공하고, 그것에 대한 모든 호출을 기본 GameObject 객체로 전달합니다.

GameObjectProxy는 또한 기본 GameObject를 파괴하고 GameObject가 null인지 여부를 쿼리하는 추가 메서드를 제공합니다. (그리고 실제로 이것들은 operator =와 operator ==에 내장 될 수 있습니다.) 실제로는 악의 있고 싶다면

이 접근법은 게임을 호출 할 때마다 프록시를 통해 리디렉션되어야하므로 성능이 저하 될 수 있습니다. 또한 다소 악의적인데, 이는 자신의 참조가 "정상적으로"행동 할 것으로 기대하는 프로그래머를 혼란스럽게합니다.