你是否曾经在Unity游戏中工作过,想知道如何为你正在开发的系统创建一个自定义类型?好吧,在这个博客中,我们将回顾什么是枚举,以及如何使用它们。然后我们将使用enums来指定一些UI输入。

Enum是什么?

简单地说,enum是您可以在脚本中创建的自定义类型。微软在他们的文档中使用的例子是在一周内创建一个枚举。所以,你创建了一个叫做天数的enum,你可以在你的程序中使用7个不同的日子:Sat,Sun,Mon,Tue,结婚,图,星期五,你可以通过这些日子来调用这些。坐或Days.Mon。

要声明上面提到的枚举,你可以这样做:

  1. enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

复制代码

每个枚举类型(E。G:Sat,Sun,Mon)有它自己的底层类型,默认情况下是int类型。所以,从技术上讲,Sat,Sun和Mon都是0 1 2。可以指定枚举类型的底层类型,但我不会详细说明。如果您感兴趣的话,请参阅“微软文档”。

为什么使用Enum ?

这似乎没有必要,为什么我要使用枚举呢?我承认,在他们的使用中,枚举似乎是相当具体的。很难看出枚举在您的游戏中是有用的。直到最近,我才发现自己使用枚举来克服Unity的问题。对于我来说,当我意识到我想要创建的系统需要我创建5个独立的bools来跟踪我脚本的状态时,我就决定使用enum。很明显,在我的脚本中,有5个bools指示某种东西的状态,我的if-语句可能会导致一些奇怪的bug和行为,而这需要更多的时间来进行故障排除。我意识到,我可以通过使用enum来跟踪脚本中的状态,从而纠正这种情况。

让我们用枚举来做些什么吧!

我尝试创建的上述系统实际上非常简单;用户可以使用键盘上的箭头键选择4个项目的UI。每个项目都是向上、向下、左或右在UI面板上。我想要它,所以如果用户按下,向上的项目就被选中了。这个选择将在向上的方向上显示一个逐渐消失的图标。

例如,在上面的截图中,如果用户按下向上的箭头,剑图标就会淡入淡出,显示它被选中。此时,如果用户再次按下按钮,将执行与up按钮相关的命令。否则,如果用户按下其他箭头键,那么这些图标就会高亮显示,并被认为是活动的选择。

现在让我们重新创建这个系统,这样你就可以理解使用枚举了。首先,创建一个新的unity项目。为了简单起见,我们把它变成2D。我假设你们对统一有一个普遍的认识,所以我不会解释某些步骤。

·创建一个新的画布对象并在其中添加一个面板。

·不管你想要怎样调整面板的大小,我的是这样的:

·向UI面板添加4个按钮。将对象重命名为向上、向下、左和右。将每个文本子的文本更改为与父对象的名称相同。E。G,Up按钮的文本应该读取“向上”。

·在你的面板上按这样的方式组织按钮,每个对象都相对于它的名字。例如,Up按钮应该位于面板的上部。

·在创建脚本之前,我们需要设置输入。去编辑项目设置输入。

·在输入管理器中,展开“轴”部分,并将“大小”从18增加到22。在创建的每个新按钮上,将它们的名称更改为上、下、左和右。对于每个按钮,根据所修改的输入,将“正按钮”更改为上、下、左或右。

每个按钮都需要这样做。到最后,你应该有一个上,下,左,右的输入。每个都应该有一个对应其名字的正按钮。这将使我们的输入检测到键盘上的箭头键输入。

现在,单击您的层次结构中的Panel条目,并添加一个组件。添加一个cscript,并调用它。在您选择的IDE中打开这个脚本。

·将以下代码复制到脚本中:

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.UI;
  4. public class SkillInput : MonoBehaviour
  5. {
  6. [SerializeField]
  7. float fadeRate = 4f; //Used to adjust image fade speed
  8. enum Selection { None, Up, Down, Left, Right }; //Will be used to keep track of what's selected
  9. Selection currentSel; // Create a Selection object that will be used throughout script
  10. Image imgUp, imgDown, imgLeft, imgRight; //These variables will be used for fading the buttons when selected
  11. Button buttonUp, buttonDown, buttonLeft, buttonRight; //Will be used to invoke Button functions
  12. void Start()
  13. {
  14. currentSel = Selection.None; //assign currentSel to None.
  15. //Grab the Image components of all our buttons
  16. imgUp = transform.FindChild("Up").GetComponent<Image>();
  17. imgDown = transform.FindChild("Down").GetComponent<Image>();
  18. imgLeft = transform.FindChild("Left").GetComponent<Image>();
  19. imgRight = transform.FindChild("Right").GetComponent<Image>();
  20. //Grab the Button components of all our buttons
  21. buttonUp = transform.FindChild("Up").GetComponent<Button>();
  22. buttonDown = transform.FindChild("Down").GetComponent<Button>();
  23. buttonLeft = transform.FindChild("Left").GetComponent<Button>();
  24. buttonRight = transform.FindChild("Right").GetComponent<Button>();
  25. }
  26. void Update()
  27. {
  28. //Standard input calls.
  29. if (Input.GetButtonDown("Up"))
  30. {
  31. if (currentSel == Selection.Up)
  32. {
  33. //Executes if we already have up selected and user presses up again
  34. buttonUp.onClick.Invoke(); //Call up button's OnClick() function
  35. currentSel = Selection.None; //set currentSel back to None
  36. }
  37. else
  38. {
  39. currentSel = Selection.Up; // changes currentSel to Up.
  40. StartCoroutine(FadeIcon(imgUp, currentSel)); //Begins fading the icon
  41. }
  42. }
  43. //The same code pattern from above is repeated for the rest of the inputs
  44. else if (Input.GetButtonDown("Down"))
  45. {
  46. if (currentSel == Selection.Down)
  47. {
  48. buttonDown.onClick.Invoke();
  49. currentSel = Selection.None;
  50. }
  51. else
  52. {
  53. currentSel = Selection.Down;
  54. StartCoroutine(FadeIcon(imgDown, currentSel));
  55. }
  56. }
  57. else if (Input.GetButtonDown("Left"))
  58. {
  59. if (currentSel == Selection.Left)
  60. {
  61. buttonLeft.onClick.Invoke();
  62. currentSel = Selection.None;
  63. }
  64. else
  65. {
  66. currentSel = Selection.Left;
  67. StartCoroutine(FadeIcon(imgLeft, currentSel));
  68. }
  69. }
  70. else if (Input.GetButtonDown("Right"))
  71. {
  72. if (currentSel == Selection.Right)
  73. {
  74. buttonRight.onClick.Invoke();
  75. currentSel = Selection.None;
  76. }
  77. else
  78. {
  79. currentSel = Selection.Right;
  80. StartCoroutine(FadeIcon(imgRight, currentSel));
  81. }
  82. }
  83. }
  84. IEnumerator FadeIcon(Image img, Selection sel)
  85. {
  86. //basic Fade Coroutine. For more Information:
  87. //https://www.studica.com/blog/create-a-fading-splash-screen-using-coroutines-in-unity-3d
  88. float alpha = 1f;
  89. while (currentSel == sel)
  90. {
  91. while (img.color.a > 0)
  92. {
  93. alpha -= Time.deltaTime * fadeRate;
  94. img.color = new Color(img.color.r, img.color.g, img.color.b, alpha);
  95. yield return null;
  96. }
  97. while (img.color.a < 1)
  98. {
  99. alpha += Time.deltaTime * fadeRate;
  100. img.color = new Color(img.color.r, img.color.g, img.color.b, alpha);
  101. yield return null;
  102. }
  103. yield return null;
  104. }
  105. img.color = new Color(img.color.r, img.color.g, img.color.b, 1f);
  106. }
  107. }
  108. Now, we need to setup some OnClick functionality for our buttons. First thing’s first, create a new C# Script called “TestMessage”. Open up the script and copy this code into it:
  109. using UnityEngine;
  110. using System.Collections;
  111. public class TestMessage : MonoBehaviour {
  112. void Start ()
  113. {
  114. }
  115. void Update ()
  116. {
  117. }
  118. public void Testing()
  119. {
  120. Debug.Log("Test Succeeded!");
  121. }
  122. }
  123. //Now, we need to setup some OnClick functionality for our buttons. First thing’s first, create a new C# Script called “TestMessage”. Open up the script and copy this code //into it:
  124. using UnityEngine;
  125. using System.Collections;
  126. public class TestMessage : MonoBehaviour {
  127. void Start ()
  128. {
  129. }
  130. void Update ()
  131. {
  132. }
  133. public void Testing()
  134. {
  135. Debug.Log("Test Succeeded!");
  136. }
  137. }

复制代码

·现在,在您的场景中创建一个空的配子,并将TestMessage脚本附加到它。

·转到每个按钮,在OnClick部分中,单击+图标添加一个新的OnClick功能。QQ号出售平台在OnClick()列表中,将新的GameObject拖放到一个没有(Object)的部分中

·然后,点击“No函数”,选择TestMessage测试()

这确保在调用时按钮将调用我们的“测试”函数。

每个按钮都要这样做。

现在,试着运行你的场景,按下你的箭头键。当你按下相应的箭头键时,你应该注意到图像的消失。如果您有一个被选中的图像,例如向上的图像,并且您再次按下箭头,测试函数应该运行,您会注意到在您的控制台中有一条消息说“测试成功了!”

结论

希望这个练习演示了枚举是如何有用的。想象一下,如果您使用了bools而不是enum来尝试指定在任何给定时间选择对象,该系统将会是什么样子。它会很快变得难看。if语句会变得非常冗长和混乱。你会把所有的bools设置为真和假。通过这样做,你就能够以一种清晰而简明的方式记录你的选择。枚举的命名很简单,您用一个变量来控制您的选择。

Unity教程:如何使用枚举来帮助简化游戏开发相关推荐

  1. 【Unity教程】创建一个完整的驾驶游戏

    专业游戏设计 你会学到什么 在unity HDRP创建一个完整的驾驶游戏 定制不同类型的汽车 将人工智能汽车和人工智能航路点系统添加到你的赛道上 添加汽车展厅菜单以解锁和购买新车 在Blender中设 ...

  2. 【Unity】MineCraft我的世界沙盒游戏开发流程

    一.插件介绍(必看) 核心插件:Uniblocks Voxel Terrain v1.4.1 将插件导入工程后,Uniblocks文件夹是关键,在文件夹中有材质.贴图.预制体.核心脚本等等. 1.&q ...

  3. 云服务器怎样帮助简化游戏开发

    根据 Newzoo 分析公司的数据,2019年,全球游戏开发市场增长 9.6%,达到1520 亿美元,超过了音乐和电影制作行业的总和.为了在快速增长的市场中保持竞争力并保持领先,游戏工作室需要高质量的 ...

  4. unity2d游戏开发系列教程:三、场景布置,增加怪物和机关

    目录 unity2d游戏开发系列教程:一.环境安装 unity2d游戏开发系列教程:二.新建工程并熟悉Unity编辑器常用功能 第一节.场景草地布置 先查看一下资源文件里都有什么,一会就要用到的 打开 ...

  5. unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架)

    目录 unity2d游戏开发系列教程:一.环境安装 unity2d游戏开发系列教程:二.新建工程并熟悉Unity编辑器常用功能 unity2d游戏开发系列教程:三.场景布置,增加怪物和机关 原文下载 ...

  6. 高端游戏开发工具:Unity Pro 2019 Mac版

    Unity Pro 2019 for Mac是专业的游戏开发工具,unity pro 2019 mac版具备最先进的游戏引擎之一,新版本提供了模块化组件系统.着色器可视化编程工具.可视乎开发环境.渲染 ...

  7. Unity手机游戏开发:从搭建到发布上线全流程实战

    前言: 技术书籍是学习技术知识的重要资源之一.读技术书可以帮助我们学习新技能和知识,技术书籍提供了可靠的.全面的信息,帮助我们快速学习新技能和知识.同时技术书籍有助于保持你的竞争力,因为它们提供了最新 ...

  8. 浪人棋牌游戏开发教程

    浪人棋牌游戏开发教程 www.langren.net 简单的程序框架. webgame程序构成: 三大部分. 第一是数据流程.第二是程序.第三是美术. 其中,数据流程包括了功能.也只有在功能中才能体现 ...

  9. HTML5游戏开发案例教程

    学习本套HTML5游戏案例开发教程需要您有一定的HTML5.JS基础,如果您还没有学过HTML5和JS请您查看本店相关教程.如果您已经具备一定的开发基础,这些教程将有助于您快速入门HTML5游戏开发. ...

最新文章

  1. LeetCode简单题之旋转字符串
  2. Windows核心编程 第四章 进程(下)
  3. 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )
  4. 关于IB_DESIGNABLE / IBInspectable的那些事
  5. 如何用Python批量修改文件名?
  6. LIS最长上升子序列
  7. axios vue 回调函数_vue中的ajax请求和axios包详解
  8. bzoj 3504: [Cqoi2014]危桥(最大流)
  9. k8s springboot 文件_用Kubernetes部署Springboot或Nginx,也就一个文件的事
  10. 【图像去噪】基于matlab GUI空域+频域滤波图像去噪【含Matlab源码 914期】
  11. UI设计课EDC研究所1期 Part 9 -“特殊的字体”
  12. HTML文件如何静态引入scss文件
  13. php ueditor mysql_PHP Ueditor 富文本编辑器
  14. python实现图片拼接长图_python 多张图片拼接为一张长图
  15. 〖Python零基础入门篇㊿〗- Python中的 sys 模块
  16. sql end关键字
  17. 云原生安全之容器级网站防篡改
  18. 机器学习实战(三)——决策树
  19. 计算机二级系统班C语言讲义,计算机二级C语言2017辅导讲义:C语言基本知识
  20. lua/luci入门

热门文章

  1. 阿里算法工程师公开机器学习路线,你的路走对了吗?
  2. 一键拼出你的微信好友图片墙!
  3. combobox 怎么实现对listview的类别查询_Flutter实战之独立实现官网Demo单词收藏Demo
  4. ae 创建图像等高线 蒙版_如何用AE创建简单的UI动效
  5. java 对比度,java批改图片亮度对比度
  6. 10-异步爬虫(线程池/asyncio协程)实战案例
  7. ebs和java哪个前景好_EBS与实例存储的好处(反之亦然)[关闭]
  8. python之函数名称空间,作用域,嵌套函数
  9. __getattr__在python2.x与python3.x中的区别及其对属性截取与代理类的影响
  10. python使用urllib模块开发的多线程豆瓣小站mp3下载器