Вставить имя игрока с новым рекордом

#c# #unity3d #user-input

#c# #unity3d #пользовательский ввод

Вопрос:

Я создаю игру с системой подсчета очков, но на данный момент имена игроков не включены в их рекорд. Идея заключается в том, что игрок может добавить свое имя после появления экрана game over и при условии, что он набрал новый рекорд.

Изначально система сохраняла только один рекорд, но теперь сохраняются 5 рекордов, которые будут вызываться в таблице в другом месте, где я бы также хотел, чтобы отображалось имя игрока.

Я не очень хорошо знаком с C #, поэтому не знаю, как включить такой пользовательский ввод, поэтому я рад услышать доступные варианты.

Это мой код для системы подсчета очков:

 public class ScoreManager : MonoBehaviour
{
public Text scoreText;
public Text hiScoreText;
public Text gameOverScoreText;

public float scoreCount;
public float hiScoreCount;

public float distance;

public float pointsPerSecond;

public bool scoreIncreasing;

//create array for last 5 high scores
float[] highScores = new float[5];

//create list for scores
public List<float> ScoreHistory;


// Start is called before the first frame update
void Start()
{
    //if there is a high score, the game will register it, otherwise it will be 0 - this is for one score
    /*if (PlayerPrefs.HasKey("HighScore"))
    {
        hiScoreCount = PlayerPrefs.GetFloat("HighScore");
    }*/

    //obtain last 5 scores
    ScoreHistory = LoadScoresFromPlayerPrefs(5);

    // Set the current high score to be the highest score in the player history - if there is no high score saved, high score will be 0
    if (ScoreHistory.Count > 0)
    {
        hiScoreCount = ScoreHistory[0];
    }
    else
    {
        hiScoreCount = 0;
    }

}

// Update is called once per frame
void Update()
{
    if (scoreIncreasing)
    {
        //adding points every frame/update => but shows decimals
        scoreCount  = pointsPerSecond * Time.deltaTime;
        //scoreCount  = Vector3.Distance(transform.position, camera.position);
      
    }

    if(scoreCount > hiScoreCount)
    {
        hiScoreCount = scoreCount;           

        //saves value called high score and the hiScoreCount value - not used if saving more than one score
        //PlayerPrefs.SetFloat("HighScore", hiScoreCount);
    }

    //adding text to score
    //Mathf.Round rounds scoreCount and hiScoreCount to nearest whole
    scoreText.text = "Score: "   Mathf.Round(scoreCount);

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

    gameOverScoreText.text = "Your Score: "   Mathf.Round(scoreCount);

}

//function which needs a number value to take in - can be used more than once
public void AddScore(int pointsToAdd)
{
    //adding points to score
    scoreCount  = pointsToAdd;

}

// Save the current score to the list of scores, and then write them to the player prefs
public void SaveCurrentScore()
{
    ScoreHistory.Add(scoreCount);
    //put scores in order
    ScoreHistory.Sort();

    
    for (int i = 0; i< ScoreHistory.Count; i  )
    {

        //key is the name of the value being stored
        var key = "High Score "   i;

        //value is what is being stored (i.e. the high scores) => ScoreHistory is being used as each score is being saved
        var value = ScoreHistory[i];

        //high scores are being saved using PlayerPrefs
        PlayerPrefs.SetFloat(key, value);
      
    }
    
}

// Loads the scores from the player prefs and returns them in a list of floats
private List<float> LoadScoresFromPlayerPrefs(int maximumNumberOfScoresToLoad)
{
    //no visibility modifiers - this is a local variable
    List<float> LoadScores = new List<float>();

    //loop will run once per score
    for (int i = 0; i < maximumNumberOfScoresToLoad; i  )
    {

        //key is the name of the value being stored
        var key = "High Scores "   i;

        //will return value of the key if there is one, otherwise will return default value of 0.0
        //PlayerPrefs.GetFloat(key);

        var score = PlayerPrefs.GetFloat(key);
        LoadScores.Add(score);
    }

    return LoadScores;
 }
}
  

Комментарии:

1. Вам нужен класс игрока, чтобы вы могли хранить каждого игрока отдельно. Классу player требуется имя и список результатов. Затем вам нужен список <Игрок> и добавьте всех игроков в список.

Ответ №1:

Если вы хотите, чтобы пользователь вводил имя, вам придется либо использовать

  1. Система пользовательского интерфейса Unity (например, поле ввода) или
  2. закодируйте что-нибудь самостоятельно (например, соблюдая Input.inputString после завершения), что я бы рекомендовал только в том случае, если у вас есть что-то вроде старых аркад, разрешающих только 3 символа.

В обоих случаях вы должны иметь возможность определять конец ввода вашего пользователя с помощью обнаруживаемой отправки (например, клавиши возврата или специальной кнопки пользовательского интерфейса). После этого вы можете просто сохранить его с соответствующими точками.

Чтобы связать точки и имя вместе, просто добавьте структуру, содержащую оба

 public struct ScoreData {
    public float Score { get; set; }
    public string Name { get; set; }
}
  

и используйте его для своего ScoreHistory

 public List<ScoreData> ScoreHistory;
private string playerName; // store the name input by player here
...
public void SaveCurrentScore()
{
    ScoreHistory.Add(new ScoreData { Score = scoreCount, Name = playerName });
    //put scores in order
    ScoreHistory = ScoreHistory.OrderBy(s => s.Score).ToList();


    for (int i = 0; i < ScoreHistory.Count; i  )
    {

        //key is the name of the value being stored
        var scoreKey = "High Score "   i;
        var nameKey = "High Score Playername "   i;

        //value is what is being stored (i.e. the high scores) => ScoreHistory is being used as each score is being saved
        var value = ScoreHistory[i];

        //high scores are being saved using PlayerPrefs
        PlayerPrefs.SetFloat(scoreKey, value.Score);
        PlayerPrefs.SetString(nameKey, value.Name);

    }

}
  

Комментарии:

1. Почему бы просто не добавить их в PlayerPrefs с помощью PlayerPrefs. setString(…) , так же, как вы делаете со счетом?

2. Хорошо, теперь у меня есть кое-что, где счет может быть сохранен, только если игрок отправит свой счет, введя свое имя. Однако новое имя заменяет предыдущее имя в таблице результатов. Есть ли способ предотвратить перезапись предыдущих данных, или мне нужно указать счет и имя по-другому?

3. Поскольку вы хотите сохранить только 5 лучших результатов, почему перезапись предыдущих данных вас беспокоит?

4. Меня беспокоит не это, а имя перезаписываемого игрока. Допустим, первый игрок отправляет счет, затем второй игрок играет в игру на том же устройстве и отправляет свой счет; даже если первый игрок отправил свое имя и счет, имя второго игрока будет перезаписывать их, создавая впечатление, что они также достигли результата первого игрока. Это то, чего я хочу избежать.

5. Вы хотите сохранить 5 баллов для каждого игрока (чтобы каждый игрок мог отслеживать улучшение своих навыков)? Или вы хотите сохранить список из 5 баллов с возможностью их достижения 5 разными игроками (чтобы текущий игрок сравнивал свое мастерство с другими игроками)?