参考金山打字通的生死时速打字小游戏,非常基础的功能。
直接上代码,实现了输入正确的字母文本变色,连续输入,分数,输入正确、输入错误的事件触发。
代码中都标明了注释,非常简单的入门练手功能。
using TMPro;
using UnityEngine;
using UnityEngine.Events;
public class TypingGame : MonoBehaviour
{
public TMP_Text defaultText; // 显示默认文本
public TMP_Text scoreText; // 显示分数
public TMP_Text streakText; // 显示连击数
private string targetText = "The quick brown fox jumps over the lazy dog."; // 默认文本
private int score = 0; // 当前分数
private int streak = 0; // 连击数
private int maxStreak = 0; // 最大连击数
private float streakTime = 0f; // 连击计时器
private float streakCooldown = 1f; // 连击冷却时间,单位秒
private string playerInput = ""; // 玩家输入的字符串
private int currentCharIndex = 0; // 当前正在输入的字符索引
public UnityEvent inputIsCorrect, inputIsWrong; // 输入正确或错误事件
public UnityEvent onGameOver; // 游戏结束事件
void Start()
{
defaultText.text = targetText;
}
void Update()
{
// 检查连击的时间,若超过冷却时间则重置连击
streakTime += Time.deltaTime;
if (streakTime >= streakCooldown)
{
streak = 0; // 超过时间没有正确输入,连击数重置
}
streakText.text = "Streak: " + streak;
scoreText.text = "Score: " + score;
// 监听键盘输入
HandleKeyboardInput();
// 更新目标文本的颜色
UpdateTextColor();
// 检查是否完成输入并且全部正确
CheckGameOver();
}
// 监听键盘输入
void HandleKeyboardInput()
{
if (currentCharIndex >= targetText.Length)
return; // 如果已经完成所有字符的输入,直接返回
// 获取玩家按下的键
string inputString = Input.inputString;
// 如果有输入并且当前输入字符与目标文本匹配
if (inputString.Length > 0)
{
char pressedChar = inputString[0]; // 获取第一个按键输入字符
// 校验当前输入是否与目标文本一致
if (pressedChar == targetText[currentCharIndex])
{
// 输入正确
score += 10 + streak * 10; // 分数增加
streakTime = 0f; // 重置连击计时器
streak++; // 增加连击
currentCharIndex++; // 进入下一个字符
inputIsCorrect.Invoke();
}
else
{
// 输入错误,重置连击数
streak = 0;
inputIsWrong.Invoke();
}
}
}
// 更新目标文本的颜色:已正确输入的字符变为黄色
void UpdateTextColor()
{
string displayedText = "";
for (int i = 0; i < targetText.Length; i++)
{
if (i < currentCharIndex)
{
// 正确输入的字符变为黄色
displayedText += $"<color=yellow>{targetText[i]}</color>";
}
else
{
// 未输入或输入错误的字符保持白色
displayedText += $"<color=white>{targetText[i]}</color>";
}
}
defaultText.text = displayedText; // 更新目标文本的显示
}
// 检查是否完成输入并打印结束日志
void CheckGameOver()
{
if (currentCharIndex >= targetText.Length)
{
onGameOver.Invoke();
// 游戏完成,打印结束日志
Debug.Log("Congratulations! You've typed the entire text correctly!");
}
}
}