Unity简单密码锁小程序设计
阿拉丁programmer
编辑于 2024年03月07日 02:50

    最近在忙活吉比特的未来制作人大赛,项目当中有需求是设计密码类型的解谜;这里分享一下我的设计思路与代码;

    开始前先讲点前情提要,因为我的这个项目后面不仅有这种密码类型的解谜小游戏,还有其它类型的,因此需要对不同类型的小游戏进行管理,我这里面把每一个解谜小游戏都放在一个单独的场景进行管理,下期我会具体讲加载与卸载的问题,本期先不讨论

Unity的多场景

涉及到三个类:PuzzleGameManager,XXXPuzzleGameController,XXXPuzzleGame

三个类的关系,管理类后续单独讨论,这篇文章先不讲

触发解谜小游戏的程序流程图(有点忘了是不是这么画流程图了.....)

前情提要说完,本篇的重点内容为解谜模板类和解谜实现类,实现类继承自模板类,模板类中通常为一些公共的方法与字段,拿本篇的密码锁小程序为例,直接看代码:

代码块
C#
自动换行
复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StringPuzzleGameControler : MonoBehaviour
{
    [SerializeField]
    protected string prefabString;//预设的答案
    public string inputString;//玩家输入的串
    /// <summary>
    /// 设置答案
    /// </summary>
    public virtual void SetPrefabString(string _pre)
    {
        prefabString=_pre;
    }
    /// <summary>
    /// 获取玩家输入串
    /// </summary>
    /// <param name="_inputString"></param>
    public virtual void GetInputString(string _inputString)
    {
        inputString=_inputString;
    }
    /// <summary>
    /// 检查输入与预设是否相同
    /// </summary>
    public virtual void CheckString()
    {
        if(prefabString==""||inputString=="")return;
        if(prefabString==inputString)
        {
            Debug.Log("你答对了");
        }
        else Debug.Log("你答错了");
    }
    /// <summary>
    /// 清除玩家的输入
    /// </summary> <summary>
    /// 
    /// </summary>
    public virtual void CleanInputString()
    {
        inputString="";
        Debug.Log("你移除了整个串");
    }
    /// <summary>
    /// 移除玩家最近一次输入的字符
    /// </summary>
    public virtual void RemoveInputChar()
    {
        inputString=inputString.Substring(0,inputString.Length-1);
        Debug.Log("你移除了一个字符,当前输入串为:"+inputString);
    }
}
复制成功

这些公有的虚函数供给实现类进行重写操作,已达到扩展功能的特点,下面就很简单了,只需要根据策划给出的逻辑来进行设计,下面只是我的一个测试案例,非最终项目要求:

场景结构

实现类代码如下:

代码块
C#
自动换行
复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class StringPuzzleTest : StringPuzzleGameControler
{
    public Text prefabStrText;
    public Text inputText;
    public GameObject keyBoard;
    private string testString;//测试键盘是否正确初始化的String
    #region 生命周期函数
    void Start()
    {
        SetPrefabString("114514");
        InitKeyBoard();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    #endregion
    /// <summary>
    /// 初始化玩家键盘
    /// </summary> <summary>
    /// 
    /// </summary>
public void InitKeyBoard()
{
    int index = 0;

    for (int i = 0; i < keyBoard.transform.childCount; i++)
    {
        // 给按键的输出进行初始化
        if (i == 9)
        {
            index = 0;
            int currentIndex = index; // 创建一个新变量保存当前循环变量的值
            keyBoard.transform.GetChild(i).GetComponent<Button>().onClick.AddListener(
                () => GetInputString(currentIndex.ToString())
            );
            testString += currentIndex;
        }
        else if (i == 10)
        {
            keyBoard.transform.GetChild(i).GetComponent<Button>().onClick.AddListener(
                () => {GetInputString("#");CheckString();CleanInputString();}
            );
            testString += "#";
        }
        else
        {
            index = i + 1;
            int currentIndex = index; // 创建一个新变量保存当前循环变量的值
            keyBoard.transform.GetChild(i).GetComponent<Button>().onClick.AddListener(
                () => GetInputString(currentIndex.ToString())
            );
            testString += currentIndex;
        }
    }

    // 检测是否正常初始化
    Debug.Log("TestString:" + testString);
}

    #region 设置答案,获取玩家输入
    public override void SetPrefabString(string _pre)
    {
        base.SetPrefabString(_pre);
        prefabStrText.text+=_pre;
    }
    public override void GetInputString(string _inputString)
    {
        //base.GetInputString(_inputString);
        inputString+=_inputString;
        inputText.text="你输入的数字串为:"+inputString;
    }
    #endregion
    #region 检查答案,修改输入串
    public override void CheckString()
    {
        inputString=inputString.Substring(0,inputString.Length-1);
        base.CheckString();
    }
    public override void CleanInputString()
    {
        base.CleanInputString();
        inputText.text="你输入的数字串为:";
    }
    public override void RemoveInputChar()
    {
        base.RemoveInputChar();
        
    }
    #endregion
}
复制成功