Сохранение 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 |
|
| |
|