#c# #unity3d
#c# #unity-&ame-en&ine
Вопрос:
Итак, у меня есть это зелье. Когда игрок в моей игре вступает в контакт с зельем, я хочу уничтожить зелье. Однако, если игрок умрет, сцена перезагрузится, и зелье все еще будет на уровне. Если игрок столкнется с зельем, я не хочу, чтобы они его получили. Они должны иметь возможность собрать зелье только один раз.
usin& System.Collections;
usin& System.Collections.Generic;
usin& UnityEn&ine;
public class DestroyPotionForever : MonoBehaviour
{
public bool potionCollide = false;
// Start is called before the first frame update
void Start()
{
}
void OnTri&&erEnter(){
if(potionCollide == false){
Destroy(&ameObject);
bool potionCollide = true;
}
}
// Update is called once per frame
void Update()
{
}
}
Но … этот код не работает. Приветствуется любая помощь.
Комментарии:
1. I не работает, потому что при перезагрузке сцены скрипт перезапускается и значения устанавливаются по умолчанию.
Ответ №1:
Простым способом было бы сохранить, получили ли вы зелье в PlayerPrefs.
Тогда вы могли бы сделать что-то вроде:
void OnTri&&erEnter()
{
if(PlayerPrefs.GetInt("GotPotion", 0) == 0)
{
// You didn't &et the potion yet, so &et it
Destroy(&ameObject);
PlayerPrefs.SetInt("GotPotion", 1); // &ot the potion
}
}
Тогда, где бы вы ни создавали свое зелье, вы могли бы:
if(PlayerPrefs.GetInt("GotPotion", 0) == 1)
{
// Got the potion already, so don't spawn the potion
}
Или, если вы поместите зелье непосредственно в сцену, вы могли бы сделать:
void Start()
{
if(PlayerPrefs.GetInt("GotPotion", 0) == 1)
{
// If the potion is already picked up, destroy it
Destroy(&ameObject);
}
}
Гораздо лучшим способом было бы написать собственную систему сохранения, как предложил Антнио Педро Гоналвес Феррейра, но это поможет вам, по крайней мере, пройти демонстрационный этап.
Ответ №2:
usin& System.Collections;
usin& System.Collections.Generic;
usin& UnityEn&ine;
public class DestroyPotionForever : MonoBehaviour
{
public bool potionCollide = false;
// Start is called before the first frame update
void Start()
{
}
void OnTri&&erEnter(){
if(potionCollide == false){
Destroy(&ameObject);
potionCollide = true;
}
}
// Update is called once per frame
void Update()
{
}
}
Просто используя глобальный var. potionCollide
. Вы создали локальную переменную вместо использования глобальной.
Ответ №3:
Ваше зелье находится на сцене перед началом игры? Что бы ни происходило во время выполнения, это не приводит к необратимому изменению сцены, если вы хотите, чтобы зелье исчезло навсегда, оно не может находиться в иерархии сцены до запуска игры. Когда вы перезагружаете сцену, она возвращается в состояние, в котором была до запуска игры.
Комментарии:
1. Да, мое зелье появляется на сцене перед тем, как я начну игру. Я хочу, чтобы он навсегда исчез со сцены, как только игрок столкнется с ним. Я почти уверен, что это возможно, я просто не знаю, как это реализовать. Есть мысли?
2. Или, другая вещь, которая может сделать мою игру функциональной, может заключаться в следующем — игрок собирает зелье, умирает, и игра перезапускается. Оттуда, если игрок попытается снова получить зелье, он не сможет его забрать. Возможно ли это?
3. если он находится на сцене при запуске игры, то это невозможно, способ решить эту проблему — навсегда запомнить в файле сохранения, должно ли зелье быть там, и создать скрипт для проверки, должно ли зелье быть там при каждом запуске сцены, если оно должно быть, то используйте Instantiate (potion) для его создания.
4. Я отредактировал его. Я пытаюсь использовать логические значения, чтобы проверить, получено ли уже зелье или нет, но, похоже, это не работает. Я думаю, это потому, что когда сцена перезагружается, скрипт тоже. Что мне делать? Спасибо.
5. Да, когда сцена перезагружается, все в ней также перезагружается и их значения сбрасываются, вот довольно хороший учебник по сохранению файлов в unity, я рекомендую вам прочитать его полностью: raywenderlich.com/418-how-to-save-and-load-a-&ame-in-unity