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

时间:2022-09-12 14:24:47

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

Unity的方法的参数

出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别方法的作用吧。既然C#的语法规定方法就应该这么写,肯定是有一定道理的。如果是上升到战略意义的道理,连作者也不是很明白,但是作者知道这对括号里可以添加“参数”。

Unity中参数的作用

要说明参数的作用,就必须从方法说起。方法可以处理变量中的数据,进而影响游戏对象的行为逻辑,这是本章前面一直在强调的。但是就前面脚本中一直在使用的,方法的括号里没有参数的情况而言,方法总是在处理特定变量里的数据。例如,下面是前面一个示例中定义的方法:

  • int AddTwoNumber()
  • {
  • return number1 + number2;
  • }

这个方法的括号里没有参数,它处理的数据总是变量number1和number2里的数据。既然这只是一个用于求和的方法,没有必要指定它只计算变量number1和number2里的数据和。如果有其它变量的数据也要求和的话,就只能再定义一个方法了。为方法引入参数就可以很好的解决这类的问题。

Unity中的方法对于游戏的实际意义

开发者定义了一个方法,可以控制一个游戏对象的逻辑行为。如果其它对象也需要做出与之类似的行为,就没有必要再定义一个方法了。例如下面的游戏示例所做的那样。

(1为游戏场景添加Cube、Cylinder和Directional light,这3个游戏对象。前两者将作为脚本方法控制行为逻辑的游戏对象,最后一个游戏对象负责游戏场景的照明。合理设置它们各自的位置,得到的Scene和Game视图,如图4-8所示。

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

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

(2在Project视图里,新建脚本文件,命名为MyScript,打开此脚本并添加下面的代码:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              public GameObject myCube;
  • 07              public GameObject myCylinder;
  • 08              void OnGUI()
  • 09              {
  • 10                        //当鼠标左键按下的时候
  • 11                       if(Input.GetMouseButton(0))
  • 12                                 RotateObject (myCube);
  • 13                        //当鼠标右键按下的时候
  • 14                       if(Input.GetMouseButton(1))
  • 15                                 RotateObject (myCylinder);
  • 16              }
  • 17              //改变游戏对象朝向的方法
  • 18              void RotateObject(GameObject myObject)
  • 19              {
  • 20                       myObject.transform.Rotate(Vector3.right*100,Space.World);
  • 21              }
  • 22     }
  • q  脚本代码的18~21行,是有参数方法的定义部分。从代码来看,传入的参数是一个游戏对象,而方法中的语句,就是通过修改游戏对象Transform组件下的Rotation属性,实现改变游戏对象朝向的目地的;
  • q  脚本代码的12、15行,调用了两次方法RotateObject(),先后传入的参数也是不一样的;

(3将脚本MyScript赋予Main Camera对象,并在后者的Inspector视图里,设置My Script组件里的My Cube和My Cylinder属性为游戏场景中的Cube和Cylinder对象,属性的设置方法是,直接拖动Hierarchy视图里的Cube和Cylinder对象到对应的属性框中即可,如图4-9所示。

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

 图4-9  设置My Script组件下的属性

(4运行游戏,在Game视图里,一直按下鼠标左键,读者会看到立方体对象在原地滚动。如果一直按下鼠标右键,那么原地滚动的就成了圆柱体。如果同时按住鼠标左键和右键,立方体和圆柱体就会同时滚动了,如图4-10所示。

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

图4-10  游戏效果展示图

(5游戏中,控制游戏对象滚动的方法是RotateObject(),它是一个需要传入参数的方法。正是因为需要传入参数,所以它才能被用于游戏场景中,所有游戏对象滚动的行为逻辑控制中。而不只是单独的控制一个对象的行为逻辑。

Unity中减少代码的重复书写

脚本中的方法,对于游戏对象而言,意义在于它可以控制游戏对象的行为逻辑,这是方法对于游戏效果的意义。方法对于脚本代码的书写,同样具有意义,那就是它可以帮助减少代码的重复书写。

本章在介绍方法时,曾将方法与变量做了简单比较,对比的过程中说过,方法也可以看做是一个存储单元,只不过里面存储的不是数据,而是一条或者多条语句。就这个意义而言,可以认为如果在方法中放入多条会在脚本中被重复使用的语句,并使用方法名作为这些语句的指代。那么,脚本中所有需要书写这多行代码的地方,都可以使用方法名(即方法的调用)来代替。例如,脚本中有下面的代码:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              private int number1;
  • 07              private int number2;
  • 08              private int number3;
  • 09              private int number;
  • 10              void Start()
  • 11              {
  • 12                       number1 = 3;
  • 13                       number2 = 5;
  • 14                       number3 = 4;
  • 15                       number1 *= number1;
  • 16                       number2 *= number2;
  • 17                       number = number1 + number2;
  • 18                       Debug.Log("number1*number1 + number2*number2 = " + number);
  • 19
  • 20                       number1 = 3;
  • 21                       number2 = 5;
  • 22                       number3 = 4;
  • 23                       number1 *= number1;
  • 24                       number3 *= number3;
  • 25                       number = number1 + number3;
  • 26                       Debug.Log("number1*number1 + number3*number3 = " + number);
  • 27              }
  • 28     }

脚本中有3个变量:number1、number2和number3。为了计算number1与number2的平方和,代码中使用了12~18行,一共7行的代码。同样的,为了计算number1与number3的平方和,代码中使用了20~26行,一共7行的代码。如果在脚本中定义方法的话,就不用书写这么多类似的代码了,使用定义了方法的脚本以后,脚本中的代码如下:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              private int number1;
  • 07              private int number2;
  • 08              private int number3;
  • 09              private int number;
  • 10              void Start()
  • 11              {
  • 12                       number1 = 3;
  • 13                       number2 = 5;
  • 14                       number3 = 4;
  • 15                       Debug.Log("number1*number1 + number2*number2 = " + AddTwoNumber(number1,number2));
  • 16                       Debug.Log("number1*number1 + number3*number3 = " + AddTwoNumber(number1,number3));
  • 17              }
  • 18              int AddTwoNumber(int i1,int i2)
  • 19              {
  • 20                       i1 *= i1;
  • 21                       i2 *= i2;
  • 22                       return i1 + i2;
  • 23              }
  • 24     }

相比于之前使用的14行代码,这里只使用了5行代码!但是两个脚本实现的效果是一样的,如图4-11所示。

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

图4-11  Console视图输出了两个数平方和的计算结果

Unity游戏示例

在Unity中编写脚本,读者可以自己编写方法,也可以使用Unity编写的方法。一般情况下,脚本代码中会用到很多Unity编写的方法。而自己编写方法,通常是为了减少代码的重复书写,或者将Unity的方法组织起来,实现新的功能。对于Unity编写的方法,不会使用的时候,读者一定要记得去帮助文档里查阅,查阅的步骤本章前面的部分已经说明了。

本节游戏示例编写的脚本中,完全使用Unity编写的方法,实现玩家通过键盘控制游戏对象上下左右移动的效果,具体的游戏制作过程如下:

(1为游戏场景添加两个游戏对象:Sphere和Directional light。前者就是本游戏要控制的游戏对象,后者负责游戏视图的光照效果。调节游戏视图中各对象的位置,使得Sphere对象位于Game视图的*,如图4-12所示。

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

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

(2为游戏项目导入4个图片,它们将被用于在游戏视图里表示小球的运动方向,本游戏导入的4个图片如图4-13所示。

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

图4-13  为游戏项目导入的4个表示方向的图片

提示:为游戏项目导入图片的方法是:直接拖动。即将图片直接拖动到Unity的Project视图里即可。

(3在Project视图里,新建一个脚本,并命名为MyScript,打开此脚本,并添加下面的代码:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              public Texture texUp,texDown,texLeft,texRight;
  • 07              public GameObject mySphere;
  • 08              public float sphereSpeed = 0.1f;                                             //决定小球的移动速度
  • 09              private float horizontalNum,VerticalNum;
  • 10
  • 11              void Update()
  • 12              {
  • 13                        //检测是否按下了水平方向上的方向键
  • 14                       horizontalNum = Input.GetAxis ("Horizontal");
  • 15                       mySphere.transform.Translate (horizontalNum*Vector3.right*sphereSpeed);
  • 16                        //检测是否按下了垂直方向上的方向键
  • 17                       VerticalNum = Input.GetAxis ("Vertical");
  • 18                       mySphere.transform.Translate (VerticalNum*Vector3.up*sphereSpeed);
  • 19              }
  • 20              void OnGUI()
  • 21              {
  • 22                       GUILayout.BeginHorizontal ();
  • 23                        //绘制左箭头,或者右箭头
  • 24                       if(horizontalNum > 0)
  • 25                                 GUILayout.Label (texRight,GUILayout.Width(100),GUILayout.Height (100));
  • 26                       else if(horizontalNum < 0)
  • 27                                 GUILayout.Label (texLeft,GUILayout.Width(100),GUILayout.Height (100));
  • 28                        //绘制上箭头,或者下箭头
  • 29                       if(VerticalNum > 0)
  • 30                                 GUILayout.Label (texUp,GUILayout.Width(100),GUILayout.Height (100));
  • 31                       else if(VerticalNum < 0)
  • 32                                 GUILayout.Label (texDown,GUILayout.Width(100),GUILayout.Height (100));
  • 33                       GUILayout.EndHorizontal ();
  • 34              }
  • 35     }

将此脚本赋予Main Camera对象,并在后者的Inspector视图里设置My Script组件下的属性,如图4-14所示。

  • q  Tex Up:up;
  • q  Tex Down:down;
  • q  Tex Left:left;
  • q  Tex Right:right;
  • q  My Sphere:Sphere;
  • q  Sphere Speed:0.1;

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

图4-14  设置组件下各属性

(4)脚本中使用的Unity方法,这里会做简要说明,如果读者对各方向的详细使用说明感兴趣,可以自己查阅帮助文档。

  • q  14、17行使用了Input.GetAxis ()方法,用于检测玩家是否按下了键盘上的左,或者右方向键;为方法传入的参数是Horizontal和Vertical,它们是Unity默认定义的输入按键,读者可以在Unity里单击Edit|project Settings|Input命令,然后在弹出的InputManager对话框中看到它们,如图4-15所示。

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

图4-15  InputManager对话框

  • q  15、18行使用了游戏对象的transform.Translate ()方法,用于修改球体对象Transform组件下的Position属性,所以游戏场景中球体对象的位置就发生了改变;
  • q  20行的OnGUI()方法,用于在游戏视图上绘制各种图形,或者控件,这些图形和控件并不存在于游戏场景中。如果非要说出位置的话,作者觉得说它们存在于屏幕上更合适些;
  • q  22、33行的方法GUILayout.BeginHorizontal ()和GUILayout.EndHorizontal ()会迫使图形和控件,在水平方向上,一个挨着一个的绘制;
  • q  25、27、30和32行使用了GUILayout.Label ()方法,作用是在屏幕上绘制标签(Label)控件;

(5运行游戏,小球处于视图的*,按下键盘上的方向键,小球就会朝着指定的方向移动,并且游戏视图的左上角还使用图片显示着小球的移动方向,并且图片的显示与否,与玩家是否按下了方向键有关。如果玩家都没有按下方向键,那么就不会有方向图片显示,游戏的运行效果如图4-16所示。

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

图4-16  处于静止状态和运动状态的小球,以及显示在游戏视图左上角的方向图片

小结

方法,从外在形式上来看,就是由多条语句组成的。考虑到读者对方法的理解,本章将它与变量做了对比,因为它们确实有不少相似的地方。方法对于游戏的真正意义在于,方法会将属性里的数据做特定的处理,并将处理的结果应用到游戏对象上。但是它也有其它用途,例如减少代码的重复书写。在学会了方法的编写以后,又带读者认识了Unity自定义的方法,以及需要传入参数的方法。最后,本章同样以一个游戏示例收尾。因为示例中使用了不少Unity自定义的方法,读者看来不得不去查阅下帮助文档才行,至于查阅的步骤,本章也介绍了。

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

C#开发Unity游戏教程之Unity中方法的参数的更多相关文章

  1. C&num;开发Unity游戏教程之Scene视图与脚本的使用

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

  2. iOS 9应用开发教程之ios9中实现按钮的响应

    iOS 9应用开发教程之ios9中实现按钮的响应 IOS9实现按钮的响应 按钮主要是实现用户交互的,即实现响应.按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应:另一 ...

  3. iOS 9应用开发教程之ios9中实现button的响应

    iOS 9应用开发教程之ios9中实现button的响应 IOS9实现button的响应 button主要是实现用户交互的.即实现响应.button实现响应的方式能够依据加入button的不同分为两种 ...

  4. HealthKit开发快速入门教程之HealthKit开发概述简介

    HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...

  5. HealthKit开发快速入门教程之HealthKit数据的操作

    HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...

  6. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  7. C&num;中方法的参数的四种类型

    C#中方法的参数有四种类型:       1. 值参数类型  (不加任何修饰符,是默认的类型)       2. 引用型参数  (以ref 修饰符声明)       3. 输出型参数  (以out 修 ...

  8. java中方法传入参数时:值传递还是址传递?

    JAVA中的数据类型有两大类型: ① 基本数据类型:逻辑型(boolean).文本型(char).整数型(byte.short.int.long).浮点型(float.double) ② 引用数据类型 ...

  9. Unity教程之-Unity3d中针对Android Apk的签名验证(C&num;实现)

    当Unity开发的游戏以Android Apk的形式发布之后,经常会遇到的一种情况就是别人对我们的游戏进行二次打包,也就是用他们的签名替换掉我们的签名,从而堂而皇之的将胜利果实占为己有.面对这样的情况 ...

随机推荐

  1. 拥抱&period;NET Core,跨平台的轻量级RPC:Rabbit&period;Rpc

    不久前发布了一篇博文".NET轻量级RPC框架:Rabbit.Rpc",当初只实现了非常简单的功能,也罗列了之后的计划,经过几天的不断努力又为Rabbit.Rpc增加了一大波新特性 ...

  2. Linux命令学习总结:cd命令

    命令简介: 该命令用来切换当前目录.cd 是change directory 的缩写 命令语法: cd [-L|-P] [dir] 使用示例 1:切换到当前目录的上一级目录 1: [root@DB-S ...

  3. Java中删除文件、删除目录及目录下所有文件

    转载自:http://www.cnblogs.com/eczhou/archive/2012/01/16/2323431.html 功能:删除某个目录及目录下的所有子目录和文件 知识点:File.de ...

  4. &lbrack;html&rsqb; Quirks Standards

    [产生] Standards : 从IE6开始,引入了Standards模式 Quirks  : 在IE6之前CSS还不够成熟,所以IE5等之前的浏览器对CSS的支持很差,为了兼容ie5之前的页面, ...

  5. Mac下PHP环境的搭建

    Mac下PHP环境的搭建 目录 Mac下PHP环境的搭建(基于XAMPP) phpmyadmin Mac下PHP环境的搭建(基于XAMPP) 下载XAMPP的Mac版 启动Apache Web Ser ...

  6. jQuery 简单滑动轮播图效果

    一般页面简单轮播图效果用jQuery制作更加简单.我们来看看以下效果是如何来进行制作的. 其html结构下所示: <div id="box">         < ...

  7. 豹哥嵌入式讲堂:ARM开发之文件详解(2)- linker文件

    大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的linker文件. 在前一节课source文件详解里,豹哥给大家系统地介绍了source文件,source文件是嵌入式工程里典 ...

  8. Mysql大数据备份和增量备份及还原

    目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup ;ibbackup是需要授权价格昂贵,而xtrabackup功能比ibbackup强大而且是开源的 Xtrabackup提 ...

  9. c&num;静态构造函数 与 构造函数 你是否还记得?(转载)

    构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着.亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧.静态构造函数是在构造函数方法前面添加了stati ...

  10. QT 子窗口退出全屏

    m_pWidget代表子窗口, 子窗口显示全屏: m_pWidget->setWindowFlags(Qt::Dialog); m_pWidget->showFullScreen(); 子 ...