2016-09-18 3 views
0

Я хочу сохранить словарь в текстовом файле в Unity3D (используя C#). Словарь содержит GameObjects как ключи, соответствующие спискам Vector2.Сохранить словарь в текстовом файле (C#)

Это мой код:

public void SaveLevel(string LevelName) 
{ 
    using (StreamWriter file = new StreamWriter (LevelName+".txt")) 
    { 
     foreach (GameObject entity in levelStruct.Keys) 
     { 
      file.WriteLine (entity.ToString() + ": " + levelStruct[entity].ToString());   
     } 
    } 
} 

Который производит пример файла:

wall (UnityEngine.GameObject): System.Collections.Generic.List`1[UnityEngine.Vector2] 
rat (UnityEngine.GameObject): System.Collections.Generic.List`1[UnityEngine.Vector2] 
dwarf (UnityEngine.GameObject): System.Collections.Generic.List`1[UnityEngine.Vector2] 
floor (UnityEngine.GameObject): System.Collections.Generic.List`1[UnityEngine.Vector2] 

Моя проблема заключается в том, что файл должен содержать фактические элементы в списке Vector2, а не сам список :

System.Collections.Generic.List1[UnityEngine.Vector2] 

Я хочу эту строку, чтобы выглядеть примерно так:

System.Collections.Generic.List1[(0,2),(3,1),(4,3)] 

Как бы это осуществить?

+0

Ваш лучший и простой вызов состоит в том, чтобы преобразовать ваш словарь в JSON, большинство json parser сделает это, а затем просто сохранит json как текст.Не только вы можете сохранить, но вы получите его в известном формате. – Everts

ответ

1

вы можете создать Название переменной конкретного типа и получить свойства, которые вам нужны

public void SaveLevel(string LevelName) 
    { 
    string res; 
     using (StreamWriter file = new StreamWriter (LevelName+".txt")) 
     { 
      foreach (GameObject entity in levelStruct.Keys) 
      { 
       foreach(Vector2 v in levelStruct[entity])){ 
         res = " "+"("+v.x+"."+v.y+")"; 
      } 
      file.WriteLine (entity.ToString() + ": " + res); 

      } 
     } 
    } 
+0

Подождите, не так ли просто напишите один из элементов списка? – Bonbin

+0

Я отредактировал новый, теперь он работает –

+0

Да, большое спасибо – Bonbin

1

Я раньше не использовал Единство, поэтому извиняюсь, если я неправильно понял. Если Vector2 - это созданный вами пользовательский класс, вы можете переопределить метод ToString() по умолчанию, чтобы он выплескивал нужную строку. Кроме того, вам нужно получить доступ к тому, какое свойство вы пытаетесь записать из значения в словаре. Например (предполагая, что Foo - это ваша собственность).

file.WriteLine (entity.ToString() + ": " + levelStruct[entity].Foo.ToString()); 
+0

Спасибо за ответ. Хотя я не имею репутацию, чтобы проголосовать. Также Vector2 похож на кортеж в python, если вы знакомы с ним, его включаете в api и пригождаете, когда хотите представить координату в 2D-среде. – Bonbin

1

Я думаю, вы должны использовать сериализации и десериализации для сохранения и восстановления объектов, потому что при использовании ToString () функция возвращает только имя объекта в большинстве случаев. Я предлагаю вам Google это, но есть некоторые ресурсы:

http://www.codeproject.com/Articles/483055/XML-Serialization-and-Deserialization-Part

https://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx

+0

Спасибо за советы! – Bonbin

1

Вы пишете объекты. Когда вы вызываете ToString() для объекта, вы получаете имя типа объекта. Вместо этого вам нужно сделать одну из двух вещей:

# 1: Если вы действительно хотите, чтобы написать с помощью CSV, как ваш код предполагает:

Object.Property.ToString(); 

В случае GameObject, возможно, потребуется чтобы использовать отражение для этого

using System.Reflection; 
foreach(PropertyInfo p in typeof(UnityEngine.GameObject).GHetProperties()){ 
    Console.WriteLine(p.Name+","+p.GetType().ToString()); 
} 
//repeat as necessary with fields and methods and ... as needed using System.Reflection 

Второй элемент - это список векторов - то же самое. Для этого нужно использовать

foreach(UnityEngine.Vector2 vect in levelStruct[entity])){ 
    //write ToString(); 
    } 

# 2: Узнайте, как сериализовать объект в XML или Json и сохранить то, что путь: https://www.google.com/search?q=c-sharp+how+to+serialize+objects+into+json&ie=&oe=

удачи - если вы застряли на что-то конкретное Просто спроси.

+0

Спасибо за ответ. Проголосовал бы, но у меня еще нет репутации. – Bonbin

+0

Нет проблем! Я не здесь для репутации - просто пытаюсь помочь и учиться. Ура! –

+0

@Bonbin Сделал это для вас. – Programmer

Смежные вопросы