Interface 가 붙은 gameObject를 널체크할때 항상 true가 리턴되는 문제가 있다.

유니티 gameObject는 Destroy 되면 실제 null이 아닌 fake null 을 넣기때문에, null체크시 항상 유니티Object의 오버라이딩 된 == 를 사용해야 한다.

그러나 인터페이스로 참조된 gameObject는 fake null이 들어갔지만 연산자 == 를 c# 꺼로 사용해서 항상 true가 나오는 것

 

아래 코드를보자. (작동하는 코드는 아니고 개념만 보는용도)

 

public interface Unit
{
}

public class Monster : Monobehavior, Unit
{
}


void Start()
{
	var monster = Instanciate(monsterPrefab);
    Unit unit = (Unit)monster;
    
    Destroy(monster.gameObject); // 여기서 fake null이 들어감

	if(unit == null){ // 항상 true. c#의 == 연산자 사용
    	 
    }
    
    if((UnityEngine.Object)unit == null){ // 올바른 null 체크법. 유니티 Object의 오버라이딩된 == 연산자 사용
    	
    }
}

 

UnityEngine.Object 로 캐스팅해서 오버라이딩 된 유니티 == 연산자를 쓰도록 하면 된다.

 

 

+ Recent posts