C#开发Unity游戏教程之判断语句

游戏执行路径的选择——判断

玩家在游戏时,无时无刻不在通过判断做出选择。例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏百玩不厌!既然提到了这一点,借此机会本章就来说明,在脚本中实现游戏为玩家提供更多选择的方法。

Unity游戏的执行路径

游戏如此受玩家欢迎的原因,除了优质的画面效果以外,就是游戏的可交互性。也就是说,游戏是可以与玩家互动的,这也是游戏与视频的不同之处。游戏允许玩家在一定程度上控制游戏的执行路径,虽然这些路径都是游戏预先设定好的。例如,《仙剑奇侠传》这款游戏中,往大了说玩家可以决定触发哪个剧情去完成哪个任务,往小了说玩家可以决定战斗时,使用法力还是武器,以及使用什么招式,如图5-1所示。


图5-1  《仙剑奇侠传》游戏的剧情与攻击方式的选择

玩家在玩游戏的过程中,总是在做出一些选择,而这些选择直接影响了游戏的执行路径。玩家的选择效果是游戏体现出来的,但是游戏实现这一效果的内在原因是,游戏代码脚本中添加了允许玩家进行选择的判断语句。

Unity中判断玩家的选择

上一节说明了,脚本中的判断语句对于游戏的重要性,但是列举的例子还是太抽象了。读者无需为此感到困惑,作者可以在此处列举些更实际的例子:玩家是否按下了游戏视图中的特定按钮,或者键盘上的特定按键,玩家是否击败了小怪等等。这些都是游戏脚本中需要使用判断语句的地方。

Unity中最常用的判断语句——if

在生活中,人类习惯使用“是”和“否”做出判断,但在游戏的脚本中,通常是使用“真”和“假”来做出判断的。本小节将以脚本中最常用的if语句来说明,在脚本中做出判断的方法。

1.if语句

在脚本中,if语句的书写格式如下,表示的游戏执行流程如图5-2所示。

  • if(需要判断的部分)

  • {

  • //语句或者语句块;

  • }

  • q  if及其后面的括号“( )”是必不可少的;

  • q  大括号“{ }”里包含的是语句块,即多条语句,如果语句块里只有一条语句,那么大括号“{ }”就可以省略;

  • q  当从判断部分得出的结论是true时,就执行大括号里面的语句,否则就直接跳过大括号里的语句;


图5-2  if语句表示的游戏执行流程图

2.需要判断的部分

这部分代码可以是表达式,也可以是方法。但是无论如何,这个部分应该可以明确的给出true或者false。true和false实际上是布尔类型的数据(在第2章中曾以表格的形式列出)。也就是说,从需要判断的部分里,可以得到一个数据,而这个数据是布尔类型的。至于表达式,它既可以是逻辑表达式,又可以是关系表达式,如图5-3所示。


图5-3  判断部分的构成和结果

3.逻辑表达式

构成逻辑表达式的逻辑运算符有3种:!(非)、&&(与)和||(或),这种表达式的运算结果如表5.1所示。

表5.1  逻辑表达式的运算结果

注释:a和b是参与逻辑运算的两个数据。

4.关系表达式

构成关系表达式的关系运算符有6种,它们的名称、使用示例及功能如表5.2所示。

表5.2  关系运算符、使用示例及功能

Unity游戏中的if语句游戏示例

请按照下面的步骤,完成游戏示例的制作:

(1为游戏场景添加3个游戏对象:Directional light、Sphere和Plane。调节各游戏对象在游戏场景中的位置、朝向和大小,如图5-4所示。得到的游戏场景和游戏视图,如图5-5所示。


图5-4  设置各游戏对象Transform组件下的属性


图5-5  在Scene和Game视图里,查看各游戏对象的相对位置,以及游戏视图效果

Sphere是玩家在游戏中需要操作的游戏对象,而Plane则是为了模拟游戏中的“地面”而存在。

(2在Hierarchy视图里选中Sphere对象,然后单击Component|Physics|Rigidbody命令,即可为Sphere对象添加刚体(Rigidbody)组件,如图5-6所示,此组件将使得Sphere对象如现实世界一般,会受到重力的影响。如果Sphere在空中的话,那么它就会因为收到重力的影响而下坠。


图5-6  为Sphere对象添加的刚体组件

(3打开脚本MyScript,并添加下面的代码:

  • 01     using UnityEngine;

  • 02     using System.Collections;

  • 03

  • 04     public class MyScript : MonoBehaviour

  • 05     {

  • 06              private GameObject mySphere;

  • 07              private Vector3 myVec;

  • 08              void Start()

  • 09              {

  • 10                       mySphere = GameObject.Find ("Sphere");

  • 11              }

  • 12              void Update()

  • 13              {

  • 14                       myVec = mySphere.transform.position;

  • 15                        //判断小球是否在Y轴方向上,超过了一定的范围,简单来说就是是否达到了一定的高度

  • 16                       if(myVec.y > 4)

  • 17                                 myVec.y = 4;

  • 18                       mySphere.transform.position = myVec;

  • 19              }

  • 20              void FixedUpdate()

  • 21              {

  • 22                        //判断玩家是否按下了鼠标的左键

  • 23                       if(Input.GetMouseButton(0))

  • 24                                 mySphere.rigidbody.AddForce (Vector3.up*20);

  • 25              }

  • 26     }

将此脚本赋予Main Camera对象。

  • q  代码16、17行是if语句,括号里表示判断的部分是一个关系表达式。因为只有17行一条语句,所以没有使用大括号“{ }”,当关系表达式的值为true时,执行此语句;

  • q  代码23、24行是if语句,括号里表示判断的部分是一个方法,即Input.GetMouseButton(),作用是检测玩家是否按下了鼠标的左键。同样只有24行一条语句,所以也省略了大括号“{ }”,当方法返回的值是true时,执行此语句;

提示:Input.GetMouseButton()帮助文档的文字描述如图5-7所示,从中可以看出方法会返回bool类型的数据,而且判断的标准就是玩家是否持续按下了指定的鼠标按键。


图5-7  Input.GetMouseButton()的帮助信息

(4运行游戏,由于球体最初在空中,此时球体只是受到了重力的影响,因此会向下坠落,直到降落到“地面”上为止。如果玩家此时按下鼠标左键的话,就会给球体施加一个向上的力,这个力比重力大,因此小球会向上运动。也就是说,当玩家按下鼠标左键以后,小球会向上运动。但是小球向上运动的范围是有限的,达到了这个限度以后,就不会再继续上升了,如图5-8所示。


图5-8  游戏示例运行效果

Unity开发中的其它判断语句

除了if语句以外,C#还提供了一些其它的判断语句,本小节会做简要介绍。如果需要的话,读者可以查阅专门讲解C#语法的书籍,然后将它们灵活的运用在游戏脚本的编写当中。

1.if-else语句

此种类型的语句与if语句的区别是,当判断部分的结果为false时,会执行另一个语句。此种语句表示的游戏执行流程如图5-9所示。


图5-9  if-else语句表示的游戏执行流程图

2.if-else-if语句

此种类型的语句,属于多重判断语句,也就是说,需要判断的部分不止一处,且每处的判断都会导致不同的执行流程,如图5-10所示。


图5-10  if-else-if语句表示的游戏执行流程图

3.swtich语句

此种类型的语句,所表示的游戏执行流程,与if-else-if语句类似,它们二者可以互换。尽管流程是类似,但是给代码阅读者的直观感受却是不同的,如图5-11所示。


图5-11  switch语句表示的游戏执行流程图

本文选自:C#游戏开发快速入门大学霸内部资料,转载请注明出处,尊重技术尊重IT人!

C#开发Unity游戏教程之判断语句相关推荐

  1. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

  2. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑--方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  3. C#开发Unity游戏教程之使用脚本变量

    C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...

  4. C#开发Unity游戏教程之Unity中方法的参数

    C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号"( )",有意义吗?看起来最 ...

  5. C#开发Unity游戏教程之Scene视图与脚本的使用

    C#开发Unity游戏教程之Scene视图与脚本的使用 Unity中Scene视图的快捷操作 Scene视图是开发者开发游戏时,操作最频繁的视图.因为一旦一个游戏对象被添加到游戏的场景中,就需要首先使 ...

  6. Excel_VBA开发2048游戏教程——Einsphoton

    VBA对游戏开发的流程帮助甚微,甚至影响游戏开发效率,本应用实例仅为消遣,切勿过分关注! 前言 抱歉,这可能是我最后的几篇文章之一了. 由于最近工作中遇到很多问题,作者现在处于自我检讨中,恐怕以后将要 ...

  7. 2D中小游戏开发C++游戏教程

    初探Windows窗体程序(上)2D游戏制作从入门到入土. 这个相对于我那个小游戏入门就显得比较专业了,但是仍然会给源码,关注可以下载相应的模板,模板是给全的.###感谢老司机(一个人)### Fir ...

  8. Unity游戏教程初步(五):Resources与UI

    目录 前言 项目需求 增加音效 增加UI # TextMeshPro-Text 增加得分点 前言 在上一节中我们给球体添加了纹理,并且为场景设置了一个目的区域.当球体处于目的区域内时,其将变色.在这一 ...

  9. Unity游戏教程初步(六):迷宫算法与预制体

    目录 前言 项目需求 Prim算法生成迷宫 1 算法思路介绍 2 代码示例 3 用于测试的代码 预制体(预制件) 1 定义 2 构建迷宫墙体预制体 完善工程 前言 本节我们来做迷宫生成.生成迷宫的算法 ...

最新文章

  1. IntelliJ IDEA 前端调试(Js Debug)
  2. mysql5.7.10 二进制包_MYSQL5.7二进制包的安装
  3. Java基础---API概述---常用类(Object类/String类)---equals和==
  4. linq 动态拼接where条件 类似 T_SQL And Or
  5. 嘘!你与谷歌语音助手的对话,可能已经泄露……
  6. vSAN 监测失败并显示错误:“未能生成 HTML 包:Gem::Package::TooLongFileName: (Failed to generate HTML bundle: Gem::Pac
  7. 前端基础知识(持续更新中)
  8. ASP.NET MVC2之Model Binder
  9. Spring Boot入门篇-@RequestParam/@RequestBody配置
  10. 高速路上车辆组队链接的想法
  11. adb shell top 命令详解
  12. android模拟器对比,哪个安卓模拟器好用 电脑玩手游助手模拟器权威对比
  13. 批量生成10位数手机号,用作账号注册
  14. Metric study
  15. 计算机通信与网络安全国际会议,第一届计算机通信与网络安全国际学术会议(CCNS2020)...
  16. java model 原则_java内存模型(Java Memeory Model)
  17. ElasticSearch的基本操作第三章
  18. python怎么导入sql数据库,##使用python将excel表中数据导入sql server数据库
  19. 用C++实现简易的文本编辑器
  20. eclipse版本说明及下载地址

热门文章

  1. The import java.util cannot be resolved The import javax.servlet cannot be resolved
  2. 我是一个机箱 《转载》
  3. 旅游自助系统可行性分析
  4. realloc,malloc,calloc的区别
  5. Http Module 介绍(转)
  6. VC.NET扩展Windows磁盘清理工具的功能
  7. 使用Fastjson解析List对象时出现:{“$ref“:“$.data[0].task.OBJECTS[0]“}的问题原因及解决方法
  8. git解决pre-commit hook failed的问题
  9. 我为什么要使用IDE? [关闭]
  10. 如何在Java中解析命令行参数?