2014-12-28 2 views
1

편집 : 더 자세히 설명되었습니다.Unity Inspector에서 모든 유형 가져 오기

나는 나의 게임을위한 SaveManager 시스템을 개발하고있다. 기본적으로해야 할 일은 다음과 같습니다.

1) 관리자로 끌어 & 드롭하여 "ANY"사용자 생성 직렬화 클래스를 가져옵니다. (데이터를 저장).

2) 경우 BinaryFormatter 또는 XmlSerializer를 중 하나를 사용하여 파일에 해당 클래스를 씁니다.

나는 내 미래 게임에서 사용할 수 있어야합니다. 따라서 데이터 클래스 (유형)를 독립적으로 저장해야합니다 (예 : 직렬 자). 자산처럼 사용하고, SaveManager를 가져오고, 매개 변수로 직렬화 된 클래스를 제공하고, 나머지는 그렇게 할 것입니다. 하지만 내가 말한대로 모든 사용자가 직렬화 된 클래스를 사용할 수 있어야합니다.

"직렬화 된 클래스"는 SaveManager 프로젝트가 아닌 "게임 프로젝트"에서 사용자가 작성하므로 SaveManager에 해당 "직렬화 된"클래스 유형이 없습니다. 프로젝트, 나는 SaveManager를 만드는 법을 모르며, inspector에서 클래스를 참조한다.

그래서 내가 게임 프로젝트 (안 SaveManager 프로젝트에서) 난 내 "게임"프로젝트에 SaveManager 프로젝트 (자산)을 가져올 때 이제 내가 할 수

[System.Serializable] 
public class SaveData 
{ 
    public string Name = "Name"; 
    public int Number = 5; 
} 

을해야이 클래스를 생성 말할 수 스크립트를 SaveManager 속성에 드래그 앤 드롭하고 나머지는 그대로 둡니다. BinaryFormatter는 모든 Serializable 형식에서 작동하기 때문에 실제로 형식의 이름은 중요하지 않습니다. BinaryFormatter는 유형이 직렬화 가능한 한 유형이 없음을 의미합니다. 그 기능을 사용하고 SaveManager 형식을 무료로 만들려고합니다.

그래서 미래에 "MyNewSaveData"라는 클래스를 "다른 게임에서"사용하고 싶다면 이것을 SaveManager 관리자로 드래그 앤 드롭하여 나머지 작업을 수행 할 수 있기를 원합니다. 내가 SaveManager 스크립트에서

public object _SaveData; 

를 사용하는 경우

지금은 일이있다, 단결 관리자는 표시되지 않습니다. 내가

public Object _SaveData 

를 사용하는 경우

그것은 객체로 유형을 만든 사용자 캐스트, 그리고 내가 필요로하는 유형을 잃게됩니다.

나는 System.Type을 사용했지만, 단결도를 표시하지 않습니다.

Basicly는 내가하고 싶은, 참고로 "모든"직렬화 클래스를 돌려줍니다. 마찬가지로

public SerializedClass _SaveData; 

또는 무언가 참조 "어떤"직렬화 클래스를 수용해야한다는

public Script _SaveData; 

있다. 형식이되면 그 형식으로 변환합니다. 내가 _SaveData.GetType()를 사용하는 경우 내가

public Object _SaveData 

를 사용하는 경우

, 나는 "사용자가 만든"유형을 얻을. 내 손에 형식이 있지만 Object를 그 형식으로 변환 할 수 없습니다. 캐스팅 할 때 그 유형을 사용하는 방법을 모르겠습니다.

내가 한 일은 인스펙터에 표시되지 않거나 다른 유형으로 캐스팅되어 데이터가 손실됩니다.

어떻게해야합니까?

+0

사이드 노트 : 유니티 (의존성 삽입 프레임 워크)가 아니라 Unity3d (게임 프레임 워크)에 대해 묻고 싶습니다. 사실이라면 반드시 태그를 업데이트하십시오. –

+0

'public Object _SaveData'를 사용하고'_SaveData.GetType()'을 호출하면 출력은 무엇입니까? – Ideae

+0

@ 아이디 나는 내가 원하는 타입을 얻습니다. 하지만 캐스팅에 사용하는 방법을 모르겠습니다. 나는 노력했다. 유형 type = _SaveData.GetType(); 여기 타입이 있습니다. 하지만 어떻게 사용합니까? 나는 (유형) _SaveData를 사용할 수 없다. 그런 용도는 없다. Unity 개체를 System 개체로 캐스팅 할 수 없으므로 Convert.ChangeType (object, type)도 작동하지 않습니다. 그래서 여기에 저는 제 손에있는 타입을 가지고 있지만 그것을 사용할 방법이 없습니다. – BerkayDrsn

답변

0

관리자가 [Serializable] 클래스를 드래그 앤 드롭 할 수 없으므로 이렇게 할 수 없습니다. 프로젝트 관리와 관련하여 표현이 없습니다. 또한 클래스 자체가 아니라 인스턴스를 드래그 앤 드롭 할 수 있습니다. 모노 스크립트 (MonoScript)에 대한 참조를 직렬화 할 수는 있지만 편집자 만이이 옵션을 사용할 수 있습니다.

어쩌면 ScriptableObject를 사용해 보거나 SaveManager 프로젝트에 기본 추상 형식을 제공해야하며 게임 프로젝트에서 파생되어야합니다.

하지만 어느 방식 으로든 진행 방법을 정확하게 이해할 수 있는지 확실하지 않습니다. 유형을 지정하면 무엇을 할 것입니까? 당신의 게임은 실제 데이터를 설정하고, 데이터 등을 읽거나 쓸 시간을 결정할 필요가 있습니다. 어떻게하면 드래그 할 수 있습니까? & 관리자는 그 자체로 모든 것을 알아낼 것으로 기대하십니까?

게임이 데이터를 설정 한 다음 SaveManager.Save (myData) 또는 .Load (myData)를 호출 한 다음 관리자가 해당 인스턴스를 바이너리 또는 XML 또는 다른 것으로 저장합니다.

BTW 나는 JSON을 권하고 싶습니다. 거기에는 좋은 Unity 호환 라이브러리가 많이 있습니다. 바이너리가 너무 위험합니다 (형식을 변경하면 저장을 작별 인사하거나 버전 간 변환의 골치 거리를 즐길 수 있습니다). XML은 너무 장황합니다.