2017-11-01 1 views
2

Unity Resource.Loadfunction에는 두 개의 오버로드 된 메소드가 있습니다. 하나는 asset 경로이고 다른 하나는 SystemTypeInstance 유형을 묻습니다. 왜 하나의 방법을 사용해야하는지에 대한 정보가 없습니다. 하지만 하나의 매개 변수로 Resources.Load를 시도했을 때 null을 반환했으며 두 번째 매개 변수를 추가하면 모든 것이 정상이었습니다. 예를 들어 Sprite asd = Resources.Load("test") as Sprite;은 null을 반환하지만 Sprite asd = Resources.Load("test", typeof(Sprite)) as Sprite;"Assets/Resources/test"에 스프라이트를 반환합니다. 두 번째 매개 변수를 추가해야하는 이유는 무엇입니까? 왜 필요한가?systemTypeInstance없이 Resources.Load가 작동하지 않는 이유

답변

1

두 번째 매개 변수를 추가해야하는 이유는 무엇입니까? 필요한 이유는 무엇입니까?

.

public static Object Load(string path); 

2 : 하지 일을하고 null을 반환 Sprite asd = Resources.Load("test") as Sprite; 아래의 오버로드를 사용합니다.

public static Object Load(string path, Type systemTypeInstance); 

제네릭을 사용하는 다른 오버로드가 있습니다 예상대로 작동 Sprite asd = Resources.Load("test", typeof(Sprite)) as Sprite; 아래의 오버로드를 사용하고 있습니다.


제네릭하지만이 질문이 두 가지 문제를 사용하는 다른 오버로드가 있습니다.

당신이 당신의 이미지를 가져 스프라이트 (2D 및 UI)텍스처 유형을 설정

, 그것은 Sprite의 유형이된다. 문제는 # 1의 첫 번째 오버로드가 Unity 유형 ObjectSprite이 아닌 것으로 사용하고 있다는 것입니다. Unity Object을 반환합니다. 그것은 다음과 같습니다 당신이 as SpriteSprite에 유니티 Object에서 캐스팅을 수행 할 때

public static Object Load(string path) 
{ 
    return Load(path, typeof(Object)); 
} 

첫 번째 코드와 문제입니다. Unity의 Object으로 캐스팅을하면 제대로 작동합니다.

예 :

작동 두번째 파라미터없이 Resources.Load 함수를 사용하여 다음 가변null하지한다

//OK 
UnityEngine.Object asd = Resources.Load("test") as UnityEngine.Object; 

ASD. 객체를로드해야하지만 이 될 수 없습니다. Sprite으로 전송하십시오.

당신이 변환 할 수 있기 때문에 이제, 당신이 Sprite에 캐스팅 할 때, 그것은 null 될 것 유니티의 ObjectSprite합니다. 아래 코드에서 주석을 읽어

//OK 
UnityEngine.Object asd = Resources.Load("test") as UnityEngine.Object; 
//NOT OK(NULL) 
Sprite obj1 = asd as Sprite; 
//NOT OK(NULL) + InvalidCastException 
Sprite obj2 = (Sprite)asd; 

다시,이 때문에 Sprite에 캐스트에 null를 반환합니다.


이 두 번째로드 기능이 추가 된 이유 :

public static Object Load(string path, Type systemTypeInstance); 

내가 하나의 방법 또는 다른를 사용해야하는 이유 아무런 정보가 없습니다.

. 첫 번째 것은 프리 패브를로드하는 데 사용됩니다. GameObject를 만들 때, 그것을 Prefab로 만들어 Resources 폴더에 넣을 수 있습니다.

//OK 
UnityEngine.Object asd = Resources.Load("test") as UnityEngine.Object; 
//OK 
GameObject obj2 = asd as GameObject; 

OR

//OK 
UnityEngine.Object asd = (GameObject)Resources.Load("test"); 

국지적 2 번째는 (.PNG, JPEG), 오디오, 비디오, FBX 이미지와 같은 파일을로드하는 데 사용된다

. 파일. 로드 Object하지
조립식 경우

//OK 
Mesh model = Resources.Load("test", typeof(Mesh)) as Mesh; 
//Not Ok 
Mesh model2 = Resources.Load("test") as Mesh; 

마지막으로, 다른 유형에 UnityEngine.Object을 변환 할 수 없습니다 : 리소스 폴더에있는 FBX 파일을로드 예를 들어

. 그것은 조립식 일 수 있습니다. 이미지, 오디오, 비디오와 같은 파일이라면 Object을 해당 파일 형식으로 변환 할 수 없습니다. 심지어 GameObject로 변환하는 것은 불가능합니다.

0

Unity에서 Sprite은 텍스처 형식이므로 유형 인수가없는 호출이 Texture2D을 반환하고 캐스팅하지 못했을 가능성이 있습니다 (스프라이트는 본질적으로 텍스처의 하위 애셋입니다. . 유니티의 프로젝트

이 몇 가지 디버깅 결정하기 쉬워야한다, Object로 먼저 저장하려고 디버거를 연결하고, 그 호출이 실제로 캐스트 전에 반환 무엇을 참조하십시오.

Object testObj = Resources.Load("test"); 
Texture text = testObj as Texture2D; // Probably a valid Texture2D 
Sprite spr = testObj as Sprite; // Probably null 
관련 문제