Не могу разобраться с положением объекта Unity 3d
В общем, есть один объект (базовый fps-контроллер от первого лица) на маленькой карте. Я пытаюсь сохранить положение координат (XYZ), чтобы в будущем можно было сохраняться и загружаться с текущего места с которого вышел из игры или сохранился. Ну как во многих играх.
Как вытаскивать значения XYZ понял, как их сохранять вроде тоже. А вот как правильно загружать - нет...
Вроде бы значения загружаются, но неизвестно куда и значения объекта не меняются.
Единственное, при загрузке, на долю секунды будто переносит на эти самые координаты...
На скрине (желтым - текущие координаты; красным - сохранено\загружено)
Уже часа 4 мучаюсь... Буду очень благодарен за подсказку или разъяснение вопроса...

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class Player : MonoBehaviour
{
float PosX;
float PosY;
float PosZ;
public Transform CurrentPlayerPosition;
public GameObject player;
void Update ()
{
if (Input.GetKeyDown(KeyCode.R))
savePosition();
if (Input.GetKeyDown(KeyCode.L))
loadPosition();
if (Input.GetKeyDown(KeyCode.D))
ResetData();
}
void savePosition()
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(Application.persistentDataPath
+ "/MySaveData.dat");
SaveData data = new SaveData();
Transform CurrentPlayerPosition = this.gameObject.transform;
Debug.Log("SAVE" + CurrentPlayerPosition.position);
data.PosX = CurrentPlayerPosition.position.x;
data.PosY = CurrentPlayerPosition.position.y;
data.PosZ = CurrentPlayerPosition.position.z;
bf.Serialize(file, data);
file.Close();
Debug.Log("Game data saved!");
}
void loadPosition()
{
if (File.Exists(Application.persistentDataPath
+ "/MySaveData.dat"))
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file =
File.Open(Application.persistentDataPath
+ "/MySaveData.dat", FileMode.Open);
SaveData data = (SaveData)bf.Deserialize(file);
file.Close();
PosX = data.PosX;
PosY = data.PosY;
PosZ = data.PosZ;
CurrentPlayerPosition.position = new Vector3(PosX, PosY, PosZ);
player = GameObject.Find("Player").gameObject;
player.transform.position = CurrentPlayerPosition.position;
Debug.Log("LOAD" + CurrentPlayerPosition.position);
Debug.Log("LOAD player" + player.transform.position);
Debug.Log("Game data loaded!");
}
else
Debug.LogError("There is no save data!");
}
void ResetData()
{
if (File.Exists(Application.persistentDataPath
+ "/MySaveData.dat"))
{
File.Delete(Application.persistentDataPath
+ "/MySaveData.dat");
PosX = 0.0f;
PosY = 0.0f;
PosZ = 0.0f;
Debug.Log("Data reset complete!");
}
else
Debug.LogError("No save data to delete.");
}
}
[Serializable]
class SaveData
{
public float PosX;
public float PosY;
public float PosZ;
}
Ответы (1 шт):
Вероятнее всего проблема кроется в иерархии обьектов. В юнити есть локальная и глобальная системы координат.
Представим себе что твой плеер находится в мировой системе координат с положением x, y, z. Но в иерархии находится внутри другого обьекта и его координаты будут x1, y1, z1. И ты по незнанию обращаешся к последним. т.е. вполне возможен вариант что ты обращаешся к локальным координатам вместо глобальных.
Что до сохранять и загружать - я настоятельно советую использовать PlayerPrefs.