Как воспроизвести лист данных?

Общие вопросы о Unity3D

Re: Как воспроизвести лист данных?

Сообщение jimmm 28 июл 2018, 01:09

1max1 писал(а):
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections.Generic;

[System.Serializable]
class Track
{
    public List<Vector3> positions = new List<Vector3>();
    public List<Quaternion> rotations = new List<Quaternion>();
    public List<float> times = new List<float>();

    public void Add(Vector3 position, Quaternion rotation, float time)
    {
        positions.Add(position);
        rotations.Add(rotation);
        times.Add(time);
    }
}

class test : MonoBehaviour
{
    void Start()
    {
        Track t = new Track();

        t.Add(Vector3.zero, Quaternion.identity, 0.0f);
        t.Add(Vector3.zero, Quaternion.identity, 10.0f);
        t.Add(Vector3.zero, Quaternion.identity, 20.0f);

        var save = JsonUtility.ToJson(t);

        PlayerPrefs.SetString("Save", save);

        var load = JsonUtility.FromJson<Track>(PlayerPrefs.GetString("Save"));

        print(load.times[2]);
    }
}
 


Спасибо большое!!
Но чет я так и не смог применить правильно в свой скрипт, ничего не происходит на мобильном устройстве.
вот такой костыль я сделал:
Синтаксис:
Используется csharp
using UnityEngine;

public class PointTime{

        public Vector3 position;
        public Vector3 scale;
        public Quaternion rotation;
        public string nname;
        public float time;

        public PointTime (Vector3 pos, Quaternion rot, Vector3 scl, float tt){
       
                position = pos;
                rotation = rot;
                scale = scl;
                time = tt;
        }
}
 


Синтаксис:
Используется csharp

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TrackCam : MonoBehaviour {


        public GameObject camPos;
        public GameObject camPlayPos;
        public RecScreen rec;

        List<PointTime> pointsTime;
        List<PointTime> pointsLocTime;

        int tt = 0;

        void Start () {
                pointsTime = new List<PointTime> ();
                pointsLocTime = new List<PointTime> ();
        }


        void FixedUpdate () {
                if (rec.recording) {
                        RecTrack ();
                } else {
                        SaveTrack ();
                }
                if (playTrackink) {
                        PlayTrack ();
                        camPos.SetActive (false);
                        camPlayPos.SetActive (true);
                } else {
                        camPos.SetActive (true);
                        camPlayPos.SetActive (false);
                }
        }

        void RecTrack (){
                pointsTime.Add ( new PointTime (camPos.transform.position, camPos.transform.rotation, camPos.transform.localScale, +1f));
        }

        class Track
        {
                public List<PointTime> po = new List<PointTime>();
        }

        void SaveTrack(){
                var save = JsonUtility.ToJson(pointsTime);
                PlayerPrefs.SetString("Save", save);
                pointsTime.Clear ();
                LoadSaveTr ();
        }

        void LoadSaveTr(){
                var load = JsonUtility.FromJson<Track>(PlayerPrefs.GetString("Save"));
                pointsTime = load.po;
        }

        void PlayTrack (){
                tt += 1;
                if (pointsTime.Count > 0 && tt < pointsTime.Count) {
                        PointTime ppp = pointsTime [tt];

                        camPlayPos.transform.position = ppp.position;
                        camPlayPos.transform.rotation = ppp.rotation;
                        camPlayPos.transform.localScale = ppp.scale;

                }

        }
}
 



А как можно обратно перевести сохраненный лист, в обычный лист?

И что можете сказать про ArrayPrefs2, удобниее ли это использовать?
Последний раз редактировалось jimmm 28 июл 2018, 02:31, всего редактировалось 5 раз(а).
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Re: Как воспроизвести лист данных?

Сообщение Anonymyx 28 июл 2018, 02:02

Насколько я помню, JsonUtility не сериализует лист как корневой объект. Его надо обернуть в класс, как в коде выше.
Создать экземпляр класса Track, проинициализироввать лист, и этот экземпляр передать в .ToJson();
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Как воспроизвести лист данных?

Сообщение jimmm 28 июл 2018, 10:22

Anonymyx писал(а):Насколько я помню, JsonUtility не сериализует лист как корневой объект. Его надо обернуть в класс, как в коде выше.
Создать экземпляр класса Track, проинициализироввать лист, и этот экземпляр передать в .ToJson();

А в чем разница, сериализиррвать лист вектора или как у меня лист с несколькими значениями?

Синтаксис:
Используется csharp
using UnityEngine;

public class PointTime{

        public Vector3 position;
        public Vector3 scale;
        public Quaternion rotation;
        public string nname;
        public float time;

        public PointTime (Vector3 pos, Quaternion rot, Vector3 scl, float tt){
       
                position = pos;
                rotation = rot;
                scale = scl;
                time = tt;
        }
}
 


Синтаксис:
Используется csharp

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TrackCam : MonoBehaviour {


        public GameObject camPos;
        public GameObject camPlayPos;
        public RecScreen rec;

        List<PointTime> pointsTime;
        List<PointTime> pointsLocTime;

        int tt = 0;

        void Start () {
                pointsTime = new List<PointTime> ();
                pointsLocTime = new List<PointTime> ();
        }


        void FixedUpdate () {
                if (rec.recording) {
                        RecTrack ();
                } else {
                        SaveTrack ();
                }
                if (playTrackink) {
                        PlayTrack ();
                        camPos.SetActive (false);
                        camPlayPos.SetActive (true);
                } else {
                        camPos.SetActive (true);
                        camPlayPos.SetActive (false);
                }
        }

        void RecTrack (){
                pointsTime.Add ( new PointTime (camPos.transform.position, camPos.transform.rotation, camPos.transform.localScale, +1f));
        }

        class Track
        {
                public List<PointTime> po = new List<PointTime>();
        }

        void SaveTrack(){
                var save = JsonUtility.ToJson(pointsTime);
                PlayerPrefs.SetString("Save", save);
                pointsTime.Clear ();
                LoadSaveTr ();
        }

        void LoadSaveTr(){
                var load = JsonUtility.FromJson<Track>(PlayerPrefs.GetString("Save"));
                pointsTime = load.po;
        }

        void PlayTrack (){
                tt += 1;
                if (pointsTime.Count > 0 && tt < pointsTime.Count) {
                        PointTime ppp = pointsTime [tt];

                        camPlayPos.transform.position = ppp.position;
                        camPlayPos.transform.rotation = ppp.rotation;
                        camPlayPos.transform.localScale = ppp.scale;

                }

        }
}
 
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Re: Как воспроизвести лист данных?

Сообщение getAlex 28 июл 2018, 10:30

jimmm писал(а):А в чем разница, сериализиррвать лист вектора или как у меня лист с несколькими значениями?

В том что вектор уже сам по себе сериализован самим юнити, а ваши значения в листе нет. Все поля вашего класса, которые изначально не сериализованы, также должны быть сериализованы.
Если вы сериализуете класс А, а в нём есть поле класса В, в котором поле класса С, то вам нужно сериализовать все эти три класса.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Как воспроизвести лист данных?

Сообщение jimmm 30 июл 2018, 01:13

Спасибо большое за попомощь!!
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Re: Как воспроизвести лист данных?

Сообщение jimmm 30 июл 2018, 15:16

А как можно сохраненные данные потом сохранить в iCloud Drive на ios?
Если можно вообще
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Re: Как воспроизвести лист данных?

Сообщение jimmm 03 авг 2018, 03:41

А как удалять сохраненные данные json? Просто удаление PlayerPrefs?
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57


Re: Как воспроизвести лист данных?

Сообщение jimmm 03 авг 2018, 12:22



Я просто думал что playerPrefs созраняют только имя создаваемого json файла.
Думал что если просто удалить playerprefs, то сам json файл останется?
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Re: Как воспроизвести лист данных?

Сообщение 1max1 03 авг 2018, 16:10

Я просто думал что playerPrefs созраняют только имя создаваемого json файла.

Какое имя? Какой файл? PlayerPrefs не сохраняет файлы (по крайней мере на пк)
Думал что если просто удалить playerprefs, то сам json файл останется?

Естественно, ты пытаешься связать несвязуемое, плеерпрефс не имеет отношения к тем файлам что ты сохраняешь вручную [-x
Json это просто строка, которая содержит информацию о переменных и их значениях, эту строку ты можешь сохранить либо на диск в виде файла через File.WriteAllText, либо сохранить в реестр через плеерпрефс, соответственно, удалять файл нужно через File.Delete, а если ты сохранил через плеерпрефс, то через PlayerPrefs.DeleteKey или PlayerPrefs.DeleteAll(чтобы удалить вообще всё).
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как воспроизвести лист данных?

Сообщение jimmm 03 авг 2018, 18:41

Понял, спасибо!
jimmm
UNIверсал
 
Сообщения: 417
Зарегистрирован: 23 янв 2013, 22:57

Пред.

Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13