Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вопрос про Unity C#

Shnuk Ученик (182), закрыт 1 неделю назад
Почему у меня выставляются только нулёвые координаты, если мой персонаж стоит без скрипта по координатам -211, 0, 34 ?

Вот скрипт:

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");
}
Лучший ответ
⭐Человек с Земли Оракул (56137) 1 месяц назад
В вашем скрипте 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(). Это будет более эффективно и в случаях, например, когда игрок активно передвигается, его позиция будет сохраняться только тогда, когда вы этого будете желать (например, при завершении уровня или при сохранении игры).
ShnukУченик (182) 1 месяц назад
Спасибо, помогло
Остальные ответы
Чёрный Император акчоТ Ученик (165) 3 недели назад
Проблема заключается в том, что вы пытаетесь получить компонент Transform для передачи его в переменную player, в то время как player уже является типом Transform. Это приводит к тому, что player присваивается значение null, и ваши координаты X, Y и Z остаются нулевыми.

Чтобы исправить это, вам нужно удалить строку, где вы пытаетесь получить компонент Transform и просто инициализировать player с помощью GetComponent<Transform>():

```csharp
public float X, Y, Z;
public Transform player;

private void Start()
{
// Удалите эту строку:
// player = GetComponent<Transform>();

LoadGame();
}

private void Update()
{
X = player.position.x;
Y = player.position.y;
Z = player.position.z;
SaveGame();
Debug.Log("Save");
}
```

Теперь player будет ссылаться на компонент Transform вашего объекта, и координаты должны правильно сохраняться и загружаться. Попробуйте внести эту корректировку и проверить работу скрипта. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться.
Похожие вопросы