2016-07-14 1 views
0

가능한 한 간단히 말하면, 필자의 캐릭터의 필수 정보를 저장하려고하고 있는데, PlayerPrefs가 좋지 않다고 들었을뿐만 아니라 일부 정보 나는 (예를 들어, PlayerPrefs 내 직업과 그 동반 된 통계 및 상속 된 클래스 정보를 가질 수 없다.) 그래서 나는 이것을 달성하기 위해 최선을 다할 것 같지 않다.유니티의 직렬화

이제 핵심적인 방법으로 직렬화를 이해할 수 있지만 매우 친밀하다는 것을 알지 못한다고 생각합니다. 따라서 저는 약간 구속력이 있습니다.

상당수의 스크립트가 작성되었으며 here's the gist for them입니다. 참고 : 제 스크립트는 엉망이 될 수 있습니다. 그렇다면 말해주십시오. 나는 그들이 위대하다는 것을 주장하지 않는다. 나는 거기에 많은 것을 가지고있다. AFAIK, 그들은 모두 괜찮아. 그냥 어떤 이유로 든 나를 위해 어려운 직렬화를하고있다.

약간의 설명 : Guard : Type : GuardPrototype뿐 아니라 Job : Mercenary를 모두 사용하는 캐릭터 스크립트를 만들려고합니다. 그런 다음 저장할 수 있기를 원합니다. 이론적으로, GameControl.cs 스크립트는 그것을 성취 할 것이지만, 나는 (분명히) 문제를 겪고 있으며, 나는 꽤 우둔이기 때문에 여러 가지를 주석 처리했다.

그래서 내가 Persistence and Saving 튜토리얼을 Unity에서했지만, 다른 스크립트를 사용하거나 호출하는 것이 아니라 단순한 수레를 처리하지 않아서 수정하기가 어려웠습니다. . 궁극적으로, 나는 단지 두 가지를 알고 싶다. 즉, 내가 구할 수있는 코드가 내게 합당한가? 그렇다면 어떻게 정보를 저장하기 위해 직렬화를 사용할 수 있습니까?

미리 감사드립니다. 얻은 도움에 감사드립니다.

TL; DR 직렬화가 단순한 수레가 아닌 별도의 스크립트로 어떻게 작동합니까?

주 : 다음 내가 사용하려는 스크립트의 사슬입니다

  • ClassParadigm -> 용병 //이 여러 있기 때문에
  • 이 TypeParadigm //이 될 수 사용됩니다 작업입니다 -> StandardParadigm -> GuardPrototype // 모든 표준 유형 중 가드입니다.

그런 다음 스크립트를 호출하고 싶습니다. - 캐릭터 (이 경우, GuardA), 그리고 어떤 타입 (둘 다 위에 설치됨)뿐만 아니라 StandardPlayerParadigm // 표준 플레이어는 무엇을 소유합니까?

마지막으로 이것은 모두 유니티 (Unity)의 객체에 놓을 수 있습니다. 그러면 그 객체의 조립식을 만들 수 있습니다. 즉, 이것이 게임에서 캐릭터라면, 그 프리 프레임이 필드 위에있을 때마다 GuardPrototype + Mercenary가됩니다.

편집 : 덕분에 Mike Hunt에게 감사드립니다. 제게 큰 문제가있는 큰 시간을 확실히 도와 주었기 때문입니다. 이제 약간 다른 문제가 생겼지 만, 이것은 훨씬 더 실현 가능합니다.

첫째로, I updated my gist. 둘째로, gameObject에 XMLSerialization 스크립트를 첨부 할 때 중첩 된 메뉴처럼). 나는 그것을 어떻게 대처해야하는지 잘 모르겠다. 실제로 그것이 원하는 값을 할당하는 것처럼 보이지는 않는다. (GuardA 스크립트가 그것의 " 유형 "스크립트를 작성했지만 작동하지 않는다고 생각합니다.) 나는 긍정적이다. 나는 약간의 과도한 일을했다. 그리고 어딘가에서 내 코드에서 뭔가 여분의 것을 부르도록 만들었지 만, 내 인생에서 그게 어디 있었는지 알아낼 수는 없다.

이제 두 가지 질문이 있습니다. A) 그게 무슨 일 이니? B) 효과적인 사용인가요? 의도 한대로 이것을 구현하지 않았습니까?

또한 세 번째 질문입니다. 통계에 약간의 차이가있는 중복 된 적을 가진 방법처럼 보이지만 내 표준 플레이어를 저장하려면 정확히 무엇이 필요합니까? 그래도 아직 그 목표를 달성하지 못하는 것 같지만 잘못 될 수는 있습니다.

+0

태그 태그 섹션에서 이동, 질문의 제목에 넣어하지 마십시오. –

답변

0

저장하고 직렬화 속성을 장식하여 정보를 저장하는 클래스를 만듭니다가 : 당신은, 데이터를 저장이 클래스의 인스턴스를 생성 할 때

[Serializable] 
public class Storage{ 
    public string name; 
    public int score; 
} 

, 그것을 채울를 사용 .NET 직렬화 및 PlayerPrefs에 저장합니다

// Create 
Storage storage = new Storage(); 
// Populate 
storage.name = "Geoff"; 
storage.score = 10000; 
// .NET serialization 
BinaryFormatter bf = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(); 
bf.Serialize(ms, items as Storage); 
// use PlayerPrefs 
PlayerPrefs.SetString("data", Convert.ToBase64String(ms.GetBuffer())); 
당신은 반전 프로세스를 검색 할 수 있습니다

:

if (PlayerPrefs.HasKey("data") == false) { return null; } 
string str = PlayerPrefs.GetString("data"); 
BinaryFormatter bf = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(Convert.FromBase64String(str)); 
Storage storage = bf.Deserialize(ms) as Storage; 

나는 당신이 어떤 키를 사용하여 모든 유형을 사용할 수 있도록 일반적인 방법으로 그것을 변환하는 제안 :

public static class Save 
{ 
    public static void SaveData<T>(string key, object value) where T : class 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream ms = new MemoryStream(); 
     bf.Serialize(ms, value as T); 
     PlayerPrefs.SetString(key, Convert.ToBase64String(ms.GetBuffer())); 
    } 

    public static T GetData<T>(string key) where T: class 
    { 
     if (PlayerPrefs.HasKey(key) == false) { return null; } 
     string str = PlayerPrefs.GetString(key); 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream ms = new MemoryStream(Convert.FromBase64String(str)); 
     return bf.Deserialize(ms) as T; 
    } 
} 
+0

을 그래서 최대에 당신과 함께 해요 내가 클래스를 인스턴스화하는 지점.내 요점에, 나는 GameControl.cs의 Save()에서 그것을하려고하지만 PlayerData에서 어떤 통계도 선택할 수 없다. 내 말은, 내가 GuardA에서 다른 정보에 액세스해야한다는 것을 의미합니다. 그래도 충분하다면 GuardA의 정보를 GameControl.cs에서 작동시키기 위해 무엇을해야합니까? – DCoward

+0

GuardA는 MonoBehaviour이므로 저장을 피해야합니다. 그것은 많은 쓸데없는 정보를 직렬화 할 것입니다. 필요한 것을 저장하는 간단한 수업을 만드십시오. 그런 다음 데이터를 가져와 액세스해야한다면 SaveData 및 GetData에서 제공된 메서드를 사용할 수 있습니다. – Everts

+0

이해가 안되면 GuardA로 저장하려고하지 않고 대신 GameControl을 사용하여 저장 및로드를 시도하지만 GuardA에 액세스 할 수 없습니다. 그리고 지금은 직접 액세스하고 있거나 시도하고 있으므로 직렬화를 확실히 알기 위해 변경 사항을 저장하여 실험 해 볼 수 있습니다. – DCoward

1

당신이 ISerializable을 구현하기 위해 최선을 수 있습니다 binnary 직렬화를 사용합니다. 당신은이 개 항목을 제공해야합니다 : 시리얼을 안내 할 것, 직렬화

  1. 방법을 '무엇을'저장하기 '방법':

무효 GetObjectData ( 하여 SerializationInfo 정보, StreamingContext 컨텍스트를 )

  1. 맞춤 컨스트럭터. 를 ISerializable 인터페이스는 서명 생성자

(SerializationInfo에 정보, StreamingContext 컨텍스트)

와 생성자를 의미 그리고 당신은 또 다른 예 기사 Object serizalization이 필요합니다.

하지만 게임에서는 사용자 정의 XML 기반의 serizaliser를 살펴볼 것이므로 모든 클래스 변경시 binaryserizaliation에 대한 지침을 작성할 필요가 없으며 필요한 속성 만 필요합니다. 속성 유니티에서 :(. 와 함께 몇 가지 문제가있을 수 있습니다 OFC.