Рекорд Unity сбрасывается при возрождении

Я пытаюсь иметь возможность возродиться, а также сбросить подсчет очков, как только я войду в свой «Золотой» объект. На данный момент я даже не могу возродиться, что было возможно раньше, до попытки реализовать «Score-Stuff» (сначала скрипт «FoundGold» использовался только для возможности возрождения). Также я пытаюсь сделать самый низкий балл High-Score. Обратите внимание, что я новичок в C #, и я как бы собрал все из учебников, которые мне нужны, поэтому ответ с некоторым фактическим кодом / указанием, где что-то пошло не так, был бы очень признателен.

//GoldFound Code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;



public class GoldFound : MonoBehaviour
{
private ScoreManager theScoreManager;
public Transform target;

[SerializeField] private Transform player;
[SerializeField] private Transform respawnpoint;

private void Start()
{
    theScoreManager = FindObjectOfType<ScoreManager>();
}


private void OnTriggerEnter(Collider other)
{
    theScoreManager.scoreIncreasing = false;
    player.transform.position = respawnpoint.transform.position;
    theScoreManager.scoreCount = 0;
    theScoreManager.scoreIncreasing = true;

}


}

другой код

//ScoreManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class ScoreManager : MonoBehaviour
{

public Text scoreText;
public Text hiScoreText;

public float scoreCount;
public float hiScoreCount;

public float pointPerSecond;

public bool scoreIncreasing; 


// Use this for initialization
void Start()
{

}

// Update is called once per frame
void Update()
{
    if (scoreIncreasing)
    {
        scoreCount += pointPerSecond * Time.deltaTime;
    }

    if(scoreCount > hiScoreCount)
    {
        hiScoreCount = scoreCount;
    }


    scoreText.text = "Score: " + Mathf.Round (scoreCount);
    hiScoreText.text = "High Score: " + Mathf.Round (hiScoreCount);

}
}

person Jebr    schedule 26.03.2018    source источник
comment
Я чувствую, что первое, что вы должны сделать, это разделить свои задачи. Создайте методы для сброса очков, некоторые для сброса позиции игрока и т. д., затем создайте поведение, которое использует их надлежащим образом, пытаясь сделать все, что жестко запрограммировано, получается большая чаша спагетти-кода. Разделяя их, вы сначала гарантируете, что они работают, а затем используете их по своему усмотрению, не изменяя исходный код.   -  person Antry    schedule 26.03.2018
comment
Кроме того, изменение текста при каждом обновлении на одно и то же значение действительно избыточно, вы, вероятно, изменяете элементы пользовательского интерфейса, на что я спрашиваю, где OnGUI()? Во-вторых, вы должны обновлять счет только в случае его изменения, а не каждый кадр.   -  person Antry    schedule 26.03.2018
comment
В-третьих, я не понимаю, почему вы устанавливаете theScoreManager.scoreIncreasing в true и false в одном вызове, видя, что он никогда не используется между ними, в основном это всегда true, что заставляет меня не понимать его цель.   -  person Antry    schedule 26.03.2018
comment
Если вы хотите, чтобы самый низкий балл был вашим лучшим, просто измените условие вашего оператора if: if(scoreCount < hiScoreCount) { hiScoreCount = scoreCount; }   -  person Antry    schedule 26.03.2018
comment
Итак, было бы здорово, если бы вы могли оставить отзыв, но я попытаюсь понять, что вы хотите сделать, вы, кажется, хотите сделать своего рода беговую игру, где чем быстрее вы идти, чем ниже ваш счет, и тем лучше. Может быть, это прохождение лабиринта или что-то в этом роде. Насколько я понимаю, то, что ты делаешь со своим bool theScoreManager.scoreIncreasing, бесполезно. Это всегда верно, по крайней мере, после того, как вы прикоснулись к материалам GoldFound. Я тоже не вижу необходимости в этой системе. вы могли бы сделать то же самое без.   -  person Antry    schedule 26.03.2018
comment
Еще одна вещь, с которой вы должны быть осторожны, это то, что вы будете заблокированы в своем TriggerEnter, когда вы сбрасываете счет, который мог / мог измениться с помощью логики, которую вы хотите, но вы не проверяете это, так что люди могут потерять немного очков и т. д. Кроме того, поскольку вы, кажется, основаны на времени, было бы хорошо сделать CoRoutine для вашего счетчика очков вместо того, чтобы быть в основном потоке единства, который менее зависит от событий, основанных на времени, поскольку вы зависите от ваша скорость обработки, что означает, что время между обновлениями результатов не всегда будет одинаковым. И для ваших игроков тоже, в зависимости от их оборудования.   -  person Antry    schedule 26.03.2018
comment
@Antry Привет, спасибо, что нашли время. Да, игра должна быть лабиринтом. Дело в том, что я абсолютно ничего не знаю о C#, потому что для определенного предмета в школе у ​​нас есть только 3x8 часов. вот почему код на самом деле не структурирован. То, что я пытался сделать с scoreIncreasing, это: остановить его прямо перед смертью, потому что он работает по умолчанию, а затем сразу после возрождения запустить его снова. Постараюсь учесть ваше мнение, спасибо.   -  person Jebr    schedule 26.03.2018
comment
Круто, хорошо! Помните, что ваш код выполняется построчно, вам нужно так думать. Детализируйте каждый шаг. Попробуйте создать простые системы вместо того, чтобы пытаться делать все вручную на каждом углу, который вам нужен, это лучший способ заставить все работать и иметь масштабируемый проект.   -  person Antry    schedule 26.03.2018


Ответы (1)


Если вы хотите сохранить свой рекорд в промежутках между игровыми сессиями, то самый простой способ сделать это — сохранить значение в PlayerPrefs. Если вы хотите начать сохранять более / более сложные вещи, вам действительно следует сохранить их в файле, который вы создаете сами. Но в вашем случае с PlayerPrefs все в порядке.

Вот руководство по Unity на эту тему: https://unity3d.com/learn/tutorials/topics/scripting/high-score-playerprefs

В противном случае вы можете просто сделать это следующим образом:

public void SetHighscore (float currentScore)
{
    if (PlayerPrefs.HasKey("highscore"))
    {
        float highscore = PlayerPrefs.GetFloat("highscore");
        if (highscore > currentScore)
        {
            PlayerPrefs.SetFloat("highscore", currentScore);
            PlayerPrefs.Save();
        }
    }
    else
    {
        PlayerPrefs.SetFloat("highscore", currentScore);
        PlayerPrefs.Save();
    }
}

Затем просто напишите PlayerPrefs.GetKey("highscore") всякий раз, когда вам это нужно. (Хотя я также рекомендую вам проверить, существует ли он, используя PlayerPrefs.HasKey("highscore")) https://docs.unity3d.com/ScriptReference/PlayerPrefs.html

person basklein    schedule 27.03.2018
comment
О, и там, где вы пишете player.transform.position и respawnPoint.target.position, вы можете отказаться от дополнительной трансформации между ними. Вы уже имеете в виду компонент Transform, поэтому можете просто написать player.position. В остальном ваш код выглядит так, как будто он должен работать нормально. (Кроме пунктов, сделанных в комментариях) - person basklein; 27.03.2018
comment
@Jebr Если этот комментарий ответил на ваш вопрос, примите его. Если нет, пожалуйста, дайте дополнительную информацию о том, что все еще не работает. - person basklein; 03.04.2018