В вашем скрипте LoadGame() вызывается в Start(), устанавливая позицию персонажа на основе значений, сохранённых в PlayerPrefs. Если PlayerPrefs не содержит ключей "X", "Y" и "Z" (то есть, они не были сохранены ранее), переменные X, Y, и Z останутся равными их значениям по умолчанию, которые являются нулевыми в C#, так как они представляют собой примитивы типа float и они инициализируются нулями.
Чтобы исправить это, нужно убедиться, что при первом запуске скрипта или когда PlayerPrefs ещё не имеет сохранённых позиций, вы инициализируете позицию вашего персонажа с реальными координатами.
Это можно сделать, например, добавив проверку на наличие сохранённых данных перед установкой позиции игрока в LoadGame(). Если данные отсутствуют, то необходимо инициализировать их текущим положением игрока в сцене.
Измените ваш LoadGame() метод следующим образом:
public void LoadGame()
{
if (PlayerPrefs.HasKey("X") && PlayerPrefs.HasKey("Y") && PlayerPrefs.HasKey("Z"))
{
X = PlayerPrefs.GetFloat("X");
Y = PlayerPrefs.GetFloat("Y");
Z = PlayerPrefs.GetFloat("Z");
}
else
{
// Текущие координаты игрока, если значения не были сохранены
X = player.transform.position.x;
Y = player.transform.position.y;
Z = player.transform.position.z;
}
player.transform.position = new Vector3(X, Y, Z);
}
Также возможно, вам нужно будет добавлять SaveGame() в метод, отвечающий за инициализацию игры или после перемещения игрока, чтобы сохранить новые координаты, а не вызывать SaveGame() каждый кадр в Update(). Это будет более эффективно и в случаях, например, когда игрок активно передвигается, его позиция будет сохраняться только тогда, когда вы этого будете желать (например, при завершении уровня или при сохранении игры).
Вот скрипт:
public float X, Y, Z;
public Transform player;
private void Start()
{
player = GetComponent<Transform>();
LoadGame();
}
private void Update()
{
X = player.transform.position.x;
Y = player.transform.position.y;
Z = player.transform.position.z;
SaveGame();
Debug.Log("SAve");
}
public void SaveGame()
{
PlayerPrefs.SetFloat("X", X);
PlayerPrefs.SetFloat("Y", Y);
PlayerPrefs.SetFloat("Z", Z);
PlayerPrefs.Save();
}
public void LoadGame()
{
if (PlayerPrefs.HasKey("X"))
{
X = PlayerPrefs.GetFloat("X");
}
if (PlayerPrefs.HasKey("Y"))
{
Y = PlayerPrefs.GetFloat("Y");
}
if (PlayerPrefs.HasKey("Z"))
{
Z = PlayerPrefs.GetFloat("Z");
}
player.transform.position = new Vector3(X, Y, Z);
}
public void ResetPrefs()
{
PlayerPrefs.DeleteKey("X");
PlayerPrefs.DeleteKey("Y");
PlayerPrefs.DeleteKey("Z");
Debug.Log("delete");
}