Среда, 18 Декабря 2024, 21:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Сохранение rotatte position совместно с transform position
vova1227Дата: Суббота, 06 Марта 2021, 07:02 | Сообщение # 1
был не раз
Сейчас нет на сайте
Вопрос собственно в чем:
1.Сохранил я треугольник к примеру, по Vector3. Но поворот то треугольника не сохранился в массив, при восстановлении всех треугольников они восстановятся в положении префаба.
А как rotate position сохранить ихние? В Vector 3 только 3 переменные. Если в отдельный массив, то как тогда при восстановлении они выберут координаты?
2. Неужели все так делают и нет способа упростить сохранение, ну это же мракобесие для каждого объекта дописывать код и поиск по тегу.
Код

System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using UnityEngine.UI;

public class SaveGameToM : MonoBehaviour
{

public GameObject Cube1Pref;
public GameObject Triangle1Pref;

[System.Serializable]
public struct myVector3
{
public float x, y, z;
}

[System.Serializable]
public struct myVector4
{
public float j, k, l;
}

[SerializeField] public List<myVector3> ObjectsPositions = new List<myVector3>();

[SerializeField] public List<myVector4> ObjectsPositionsT = new List<myVector4>();

public void Awake()
{
if (!File.Exists(Application.persistentDataPath + "saves"))

{
Directory.CreateDirectory(Application.persistentDataPath + "/saves");
}
}

public void Start()
{

if (File.Exists(Application.persistentDataPath + "/saves/save.sav")& File.Exists(Application.persistentDataPath + "/saves/saveT.sav"))
{
BackMyCubes();
BackMyTriangles();
}

}

public void BackMyCubes()
{
ObjectsPositions = Load();

foreach (var pos in ObjectsPositions)
{
Instantiate(Cube1Pref, new Vector3(pos.x, pos.y, pos.z), Quaternion.identity);
}
ObjectsPositions.Clear();
}

public void BackMyTriangles()
{//n
ObjectsPositionsT = LoadT();

foreach (var posT in ObjectsPositionsT)//n
{//n
Instantiate(Triangle1Pref, new Vector3(posT.j, posT.k, posT.l), Quaternion.Euler(-90f,0.0f,0.0f));//n
}//n
ObjectsPositionsT.Clear();//n
}//n

public void ManualSaving()
{
if (File.Exists(Application.persistentDataPath + "/saves/save.sav"))
{
File.Delete(Application.persistentDataPath + "/saves/save.sav");
}

foreach (var obj in GameObject.FindGameObjectsWithTag("Cube1"))

{
myVector3 i = new myVector3();
i.x = obj.transform.position.x;
i.y = obj.transform.position.y;
i.z = obj.transform.position.z;

ObjectsPositions.Add(i);
}

Save(ObjectsPositions);
}

public void ManualSavingT()//n
{//n
if (File.Exists(Application.persistentDataPath + "/saves/saveT.sav"))//n
{//n
File.Delete(Application.persistentDataPath + "/saves/saveT.sav");//n
}//n

foreach (var objT in GameObject.FindGameObjectsWithTag("Triangle1"))//n

{//n
myVector4 t = new myVector4();//n
t.j = objT.transform.position.x;//n
t.k = objT.transform.position.y;//n
t.l = objT.transform.position.z;//n
ObjectsPositionsT.Add(t);//n
//сюда дописать ротат поз с другими буквами

}//n

Save(ObjectsPositionsT);//n
}//n

public List<myVector3> Load()
{
List<myVector3> objects;
BinaryFormatter formatter = new BinaryFormatter();

using (FileStream stream = new FileStream(Application.persistentDataPath + "/saves/save.sav", FileMode.Open))
{
objects = (List<myVector3>)formatter.Deserialize(stream);
}

return objects;

}

public List<myVector4> LoadT()//n
{//n
List<myVector4> objectsT;//n
BinaryFormatter formatter = new BinaryFormatter();//n

using (FileStream streamT = new FileStream(Application.persistentDataPath + "/saves/saveT.sav", FileMode.Open))//n
{//n
objectsT = (List<myVector4>)formatter.Deserialize(streamT);//n
}//n

return objectsT;//n

}//n

void Save(List<myVector3> positions)
{

BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(Application.persistentDataPath + "/saves/save.sav", FileMode.Create))
{
formatter.Serialize(stream, positions);
stream.Close();
}
positions.Clear();

}

void Save(List<myVector4> positionsT)//n
{//n

BinaryFormatter formatter = new BinaryFormatter();//n
using (FileStream streamT = new FileStream(Application.persistentDataPath + "/saves/saveT.sav", FileMode.Create))//n
{
formatter.Serialize(streamT, positionsT);//n
streamT.Close();//n
}
positionsT.Clear();//n

}//

}


Сообщение отредактировал vova1227 - Суббота, 06 Марта 2021, 14:22
drcrackДата: Суббота, 06 Марта 2021, 09:47 | Сообщение # 2
старожил
Сейчас нет на сайте
Если поворот только по одной оси, его можно хранить в четвертой компоненте Vector4 (w)
Sanchez06Дата: Суббота, 06 Марта 2021, 10:04 | Сообщение # 3
участник
Сейчас нет на сайте
Можно в ту же структуру добавлять
Код

public struct myVector3
{
public float x, y, z;
public float rot_x, rot_y, rot_z;
}


Код

foreach (var obj in GameObject.FindGameObjectsWithTag("Cube1"))

{
myVector3 i = new myVector3();

i.x = obj.transform.position.x;
i.y = obj.transform.position.y;
i.z = obj.transform.position.z;

i.rot_x = obj.transform.eulerAngles.x;
i.rot_y = obj.transform.eulerAngles.y;
i.rot_z = obj.transform.eulerAngles.z;

ObjectsPositions.Add(i);
}


Ну и загрузка:

Код

public void BackMyCubes()
{
ObjectsPositions = Load();

foreach (var obj in ObjectsPositions)
{
GameObject i = Instantiate(Cube1Pref, new Vector3(obj.x, obj.y, obj.z), Quaternion.identity);
i.transform.Rotate(obj.rot_x, obj.rot_y, obj.rot_z, Space.World)
}
ObjectsPositions.Clear();
}


vova1227Дата: Суббота, 06 Марта 2021, 13:19 | Сообщение # 4
был не раз
Сейчас нет на сайте
Цитата Sanchez06 ()
Да и код в теги code добавить


За это прошу прощение, я ночью писал, уже голова не варила просто.

Спасибо за помощь, интересно о чем человек вот еще написал, что такое Vector4 (w), сейчас пойду рыть, так как поворот именно треугольника реально одной оси.

Добавлено (06 Марта 2021, 13:44)
---------------------------------------------
PS/
Пробовал отредактировать сообщение, что то не врубаю как теги [/code][code] работают
Вроде добавил и так и ся ниче не поменялось

Sanchez06Дата: Суббота, 06 Марта 2021, 13:50 | Сообщение # 5
участник
Сейчас нет на сайте
Это скорее всего он описывал кватернионы, там 4 параметра, я написал вариант поворота по углам Эйлера.
По тегам -
[cоde]
твой код
[/cоde]
vova1227Дата: Суббота, 06 Марта 2021, 14:25 | Сообщение # 6
был не раз
Сейчас нет на сайте
Спасибо, все заработало на ура, все восстановилось с поворотами.
Я вот только думаю, а правильно ли я делаю что для каждого объекта создаю отдельный save.sav файл. Они как то совмещаются или лучше не надо?
Дело в том что обектов будет много, не только там кубики и треугольники.
Sanchez06Дата: Суббота, 06 Марта 2021, 14:41 | Сообщение # 7
участник
Сейчас нет на сайте
Я тебе еще в той теме расписывал, как можно сделать структуру в структуре (в структуре, лол), и там можно сохранить вообще все обьекты и переменные. У меня в одном файле вся игра сохраняется (наверное это неправильно, и загрузка с парсингом будет слишком долгой при увеличении этого файла). Тебе лучше понять принцип, по которому эта вся конструкция работает, и тогда подберешь оптимальный вариант для себя.
vova1227Дата: Суббота, 06 Марта 2021, 14:57 | Сообщение # 8
был не раз
Сейчас нет на сайте
Код

public Dictionary<string, Level> levels = new Dictionary<string, Level>();
public struct Corpse
{
    public string type;
    public int x;
    public int y;
}

[System.Serializable]
public struct Point
{
    public float X;
    public float Y;
    public float Z;
    public Point(float x, float y, float z)
    {
        X = x;
        Y = y;
        Z = z;
    }
}
[System.Serializable]
public struct Enemy
{
    public string type;
    public Point pos;
    public Point rot;
    public int hp;
    public AI_cult_1.State state;
    public int ammo;
    public bool vis;
}

[System.Serializable]
public struct Decoration
{
    public string type;
    public Point pos;
    public Point rot;
}

[System.Serializable]
public struct Level
{
    public List<Corpse> corpses;
    public List<Enemy> enemies;
    public List<Decoration> decorations;


Это структуры в массиве если я правильно понял.

Код

Level lvl = new Level();

        lvl.decorations = GetAllDecor();//берем все декорации на сцене
        lvl.enemies = GetAllEnemies();//находим всех противников на сцене
        
        if (!levels.ContainsKey(SceneManager.GetActiveScene().name)) //если нет уровня в дикте
        {levels.Add(SceneManager.GetActiveScene().name,lvl);}        //то создадим его
        else
        {levels[SceneManager.GetActiveScene().name]=lvl;} //а если есть - перезапишем

    public List<Decoration> GetAllDecor()
    {
        List<Decoration> lol = new List<Decoration>();
        GameObject[] decors = GameObject.FindGameObjectsWithTag("Decoration");
        foreach (GameObject decor in decors)
        {
            Decoration a = new Decoration();
            a.type = decor.name;
            a.pos = new Point(decor.transform.position.x,decor.transform.position.y,decor.transform.position.z);
            a.rot = new Point(decor.transform.eulerAngles.x,decor.transform.eulerAngles.y,decor.transform.eulerAngles.z);
            lol.Add(a);
        }
        
        return lol;

    }

    public List<Enemy> GetAllEnemies()
    {
        List<Enemy> lol = new List<Enemy>();
        AI_cult_1[] enemies_on_scene = Object.FindObjectsOfType<AI_cult_1>();
        foreach (AI_cult_1 enemy in enemies_on_scene)
        {
            Enemy a = new Enemy();
            a.type = enemy.name;
            a.pos = new Point(enemy.transform.position.x,enemy.transform.position.y,enemy.transform.position.z);
            a.rot = new Point(enemy.transform.eulerAngles.x,enemy.transform.eulerAngles.y,enemy.transform.eulerAngles.z);
            a.ammo = enemy.countAmmo;
            a.hp = enemy.hp;
            a.state = enemy.state;
            a.vis = enemy.vis;
            lol.Add(a);
        }


левел это 2я сцена в юнити?

Ты говоришь о структурах сложенных в массив или?
Sanchez06Дата: Суббота, 06 Марта 2021, 18:59 | Сообщение # 9
участник
Сейчас нет на сайте
Ну смотри, в структуру Level можно запихнуть хоть структуры трупов, хоть врагов, хоть кого. Так и ты можешь запихнуть и треугольники, и кубы, и что у тебя там еще будет.
drcrackДата: Суббота, 06 Марта 2021, 20:41 | Сообщение # 10
старожил
Сейчас нет на сайте
Цитата
Это скорее всего он описывал кватернионы, там 4 параметра, я написал вариант поворота по углам Эйлера.

Vector4
xyz — позиция
w — поворот по нужной оси


Сообщение отредактировал drcrack - Суббота, 06 Марта 2021, 20:41
vova1227Дата: Четверг, 01 Апреля 2021, 15:31 | Сообщение # 11
был не раз
Сейчас нет на сайте
Цитата Sanchez06 ()
Ну смотри, в структуру Level можно запихнуть хоть структуры трупов, хоть врагов, хоть кого. Так и ты можешь запихнуть и треугольники, и кубы, и что у тебя там еще будет.

В структурах я так и не разобрался, в данном случае это еще солоновато для меня. Но я читал что можно дописывать данные в файл путем FileMode.Append.
Дописать в файл удалось, файл открыл блокнотом и Vector4 там значился, значит данные все таки в файле.

Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using UnityEngine.UI;

public class SaveGameToM : MonoBehaviour
{
    public GameObject Cube1Pref;
    public GameObject Triangle1Pref;

    [System.Serializable]
    public struct myVector3
    {
        public float x, y, z;
    }

    [System.Serializable]
    public struct myVector4
    {
        public float j, k, l;
    }

    [SerializeField] public List<myVector3> ObjectsPositions = new List<myVector3>();
    [SerializeField] public List<myVector4> ObjectsPositionsT = new List<myVector4>();
    

    public void Start()
    {
        if (File.Exists(Application.persistentDataPath + "/saves/save.sav"))
        {
            BackMyCubes();
            BackMyTriangles();
        }
    }

    public void BackMyCubes()
    {
        ObjectsPositions = Load();

        foreach (var pos in ObjectsPositions)
        {
            GameObject i = Instantiate(Cube1Pref, new Vector3(pos.x, pos.y, pos.z), Quaternion.identity);
        }
        ObjectsPositions.Clear();
    }

    public void BackMyTriangles()
    {
        ObjectsPositionsT = LoadT();

        foreach (var posT in ObjectsPositionsT)
        {
            GameObject t = Instantiate(Triangle1Pref, new Vector4(posT.j, posT.k, posT.l), Quaternion.identity);
        }
        ObjectsPositionsT.Clear();
    }

    public void ManualSaving()
    {
        foreach (var obj in GameObject.FindGameObjectsWithTag("Cube1"))
        {
            myVector3 i = new myVector3();
            i.x = obj.transform.position.x;
            i.y = obj.transform.position.y;
            i.z = obj.transform.position.z;
           
            ObjectsPositions.Add(i);
        }
        SaveCu(ObjectsPositions);
    }

    public void ManualSavingT()
    {
        foreach (var objT in GameObject.FindGameObjectsWithTag("Triangle1"))
        {
            myVector4 t = new myVector4();
            t.j = objT.transform.position.x;
            t.k = objT.transform.position.y;
            t.l = objT.transform.position.z;

            ObjectsPositionsT.Add(t);
        }
        SaveT(ObjectsPositionsT);
    }

    public List<myVector3> Load()
    {
        List<myVector3> objects;
        
        BinaryFormatter formatter = new BinaryFormatter();
        using (FileStream stream = new FileStream(Application.persistentDataPath + "/saves/save.sav", FileMode.Open))
        {
            objects = (List<myVector3>)formatter.Deserialize(stream);
        }
        return objects;
    }

    public List<myVector4> LoadT()
    {
        List<myVector4> objectsT;
        BinaryFormatter formatter = new BinaryFormatter();
        using (FileStream streamT = new FileStream(Application.persistentDataPath + "/saves/save.sav", FileMode.Open))
        {
            objectsT = (List<myVector4>)formatter.Deserialize(streamT);
        }
        return objectsT;
    }

    void SaveCu(List<myVector3> positions)
    {

        BinaryFormatter formatter = new BinaryFormatter();
        using (FileStream stream = new FileStream(Application.persistentDataPath + "/saves/save.sav", FileMode.Create))
        {
            formatter.Serialize(stream, positions);
            stream.Close();
        }
        positions.Clear();
    }

    void SaveT(List<myVector4> positionsT)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        using (FileStream streamT = new FileStream(Application.persistentDataPath + "/saves/save.sav", FileMode.Append))
        {
            formatter.Serialize(streamT, positionsT);
            streamT.Close();
        }
        positionsT.Clear();

    }
}



Сделал во так и получил ошибку в Unity
Код
InvalidCastException: Specified cast is not valid. SaveGameToM.LoadT () (at Assets / Script / SaveGameToM.cs: 111)


Ошибка при десериализации? Что я упустил?


Сообщение отредактировал vova1227 - Четверг, 01 Апреля 2021, 17:12
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг