c# - 发行版中的键盘控件问题 - 在统一编辑器中未发生
问题描述
我正在制作一个需要您按 Enter 键才能开始游戏的游戏,我已经对其进行了设置,以便如果检测到主菜单对象,则会将 bool 设置为 true,这允许您在按 Enter 时开始游戏(删除菜单游戏对象)
bool menushow = false;
void Update () {
if(GameObject.Find("Menu1 1(Clone)") | GameObject.Find("Menu1 1 (1)"))
{
menushow = true;
}
if (Input.GetKeyDown(KeyCode.Return))
{
if (menushow)
{
Destroy(menu1);
GlobalVars.G_INGAME = true;
GlobalVars.G_START = true;
}
}
我还有一些代码可以在用户按下退出键时暂停游戏并打开 menu1。
if(Input.GetKeyDown("escape") && GlobalVars.G_START == true)
{
Instantiate(Menu_1, new Vector3(0, 0, -8), Quaternion.identity);
if(GameObject.Find("Menu1 1(Clone)"))
{
GlobalVars.G_START = false;
}
}
G_START 是指游戏的暂停/播放状态,G_INGAME 是指用户是否处于游戏中间或已结束游戏(例如:死亡或刚刚加载)
我的困境是: 当我导出游戏并运行 exe 时,按 Enter 键开始游戏,它开始了,但是我不再能够按 Escape 来恢复菜单。然而,这不会发生在统一编辑器中,在那里我可以垃圾邮件进入和逃脱,菜单将出现并被完美地销毁。
我希望对此事有一些见解,因为我不确定在遇到统一编辑器中没有出现的问题时如何继续,因此我无法调试。
感谢您的时间。
解决方案
这不是您应该在 Unity 中实现菜单的方式。创建和销毁游戏对象是 CPU 密集型的,当您在重复出现的菜单或对象上进行跟踪时变得难以跟踪,尤其是当您的项目扩展时。
相反,有一个名为“主菜单画布”的主菜单游戏对象并将你的画布附加到该对象上,然后附加以下脚本:
... // Standard Unity Namespaces can go here .
using UnityEngine.UI;
public class MainMenuController : MonoBehaviour
{
private Canvas mainMenuCanvas;
private bool showMenu; // Set this to true if it should be implemented at game open
void Awake(){
mainMenuCanvas = gameObject.GetComponent<Canvas>();
}
void Update(){
if(Input.GetKeyDown(KeyCode.Return))
{
mainMenuCanvas.enabled = false;
GlobalVars.G_START = true;
}
if(Input.GeKeyDown(KeyCode.Escape))
{
mainMenuCanvas.enabled = true;
GlobalVars.G_START = false;
}
}
推荐阅读
- slickgrid - 在运行时添加单元格格式
- ios - 如何从 Objective-C 类访问 Swift 类?
- node.js - 解决 mongoose 中的 OverwriteModelError
- python - 尝试使用 python 从 azure 函数触发 url,错误地说“没有 $return 绑定返回非无值”
- excel - 如何比较两个excel表格列表?
- javascript - 如何计算Jquery中孩子的水平
- javascript - 使用角度或javascript附加零的逗号分隔数字
- azure - Why azure-active-directory-spring-boot-starter needs access to Microsoft?
- c# - 强制 .NET UTF-8 编码器输出 3 字节编码字符
- r - 拆分后如何重新排序列?