#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:
Если вы хотите, чтобы пользователь вводил имя, вам придется либо использовать
- Система пользовательского интерфейса Unity (например, поле ввода) или
- закодируйте что-нибудь самостоятельно (например, соблюдая 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 разными игроками (чтобы текущий игрок сравнивал свое мастерство с другими игроками)?