最近在忙活吉比特的未来制作人大赛,项目当中有需求是设计密码类型的解谜;这里分享一下我的设计思路与代码;
开始前先讲点前情提要,因为我的这个项目后面不仅有这种密码类型的解谜小游戏,还有其它类型的,因此需要对不同类型的小游戏进行管理,我这里面把每一个解谜小游戏都放在一个单独的场景进行管理,下期我会具体讲加载与卸载的问题,本期先不讨论

Unity的多场景
涉及到三个类:PuzzleGameManager,XXXPuzzleGameController,XXXPuzzleGame

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

触发解谜小游戏的程序流程图(有点忘了是不是这么画流程图了.....)
前情提要说完,本篇的重点内容为解谜模板类和解谜实现类,实现类继承自模板类,模板类中通常为一些公共的方法与字段,拿本篇的密码锁小程序为例,直接看代码:
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);
}
} 这些公有的虚函数供给实现类进行重写操作,已达到扩展功能的特点,下面就很简单了,只需要根据策划给出的逻辑来进行设计,下面只是我的一个测试案例,非最终项目要求:

场景结构
实现类代码如下:
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
} 完