Unity 实现一个打字小游戏功能

参考金山打字通的生死时速打字小游戏,非常基础的功能。

直接上代码,实现了输入正确的字母文本变色,连续输入,分数,输入正确、输入错误的事件触发。

代码中都标明了注释,非常简单的入门练手功能。

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!");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值