unity3d脚本(3)

2018-12-29 22:03

- 向场景中添加另外一个立方体,在 Hierarchy View 中将其命名为 PhysicsCube 。

现在给这个立方体增加 Rigidbody (刚体)成份。 Rigidbody (刚体)成份可以使游戏物体如同在真实的世界中具有重力。该物体将一直下落,直到碰到一个具有 Collider (碰撞)成份的表面。

- 确认 PhysicsCube 处于选择状态,选择 Component->Physics->Rigidbody 。这将Rigidbody 成份附着给当前选择的物体。注意:在 Inspector View 中 Rigidbody成份被添加。

- 移动 PhysicsCube 到 Pillar 上面,稍微有点错开。当开始运行是, Physicscube 将碰撞 Pillar ,然后掉到地上。 - 运行。 11 、复制

复制游戏物体是 Unity 强大功能之一。当复制某个物体时,该物体所具备的功能和行为也都将被复制。这可以快速的创建复杂的场景。下面将添加更多的 PhysicsCube 到场景中。 - 单击 Physicscube ,然后按 Command+D 键(或者选择 Edit 菜单)。在 Hierarchy 中可以看到增加的 PhysicsCube ,但是在场景中看不到,因为它与源的位置相同。

- 使用移动工具向上(沿 Y 轴)移动 PhysicsCube 。

- 重复上面的操作。现在具有 3 个 PhysicsCube 游戏物体。

- 运行游戏。 3 个 PhysicsCube 游戏物体将自然的交互和发生行为。 Script 教程 命名规范

变量——以小写字母开头。变量用于存贮游戏的信息等。

函数——以大写字母开头,函数是语句组成的程序块,可以在需要的时候重复调用。 类——以大写字母开头。类可以被认为是函数的集合体。

注意:在阅读代码实例或者 Unity API 时,密切关注单词的首字母,这将有助于了解物体之间的关系。 脚本教程——场景浏览和克隆物体 1 、设置场景 - 启动 Unity 。

- 创建一个立方体,缩放 X/y/z 轴到 5/0.1/5 ,在 Hierarchy 视图中将其命名为“ Plane ”, 作为一个大的平台用。

- 创建第 2 个立方体,放置在平台的中央位置。如果在 Game View 中看不到物体,则调 整主摄像机使其可见。重命名此物体为 Cube1.

- 还可以再创建一个点光源,将其放置在立方体的上面,这样可以更容易看到。 - 选择 File>Save As 命令保存当前的场景,并命名该场景。 2 、第一个脚本

现在开始编写游戏程序,检测键盘的输入控制主摄像机的位置。将编写一个脚本,并将 它关联到主摄像机上。

- 创建一个空脚本,选择 Assets->Create->Javascript 命令,在 Project 面板中重命名脚本为 Move1 。 - 在 Move1 脚本上双击,打开脚本的同时 Update() 函数就已经被写入(这是 默认的行为),将在该函数中插入语句。任何插入到 Update ()函数中的语

句在每一帧中都将被执行。在 Unity 中要移动游戏物体,需要修改游戏物体 transform (转换)中的位置属性, Translate函数属于 transform 可以用于修改位置参数。 Translate 函数需要 3 个参数, x 、 y 和 z 数值。因为要使用光标键控制主摄像机,因此要添加语句监控光标键是否按下,然后为各个参数赋值。 function Update () {

transform.Translate(Input.GetAxis(\Input.GetAxis(\}

Input.GetAxis() 函数将在 -1 和 1 之中返回一个数值。在水平轴向上,向左的光标 键返回 -1 ,向右的光标键返回 1.

11

注意:将 Y 轴设为 0 ,是因为不需要控制摄像机上下移动。 Horizontal (水平)和 Vertical

(垂直)轴是在 Input Settings 中预先设置的,名称和键的对应关系可以很容易的修改,执行 Edit->Project Settings->Input 命令即可。

- 打开 Move1 脚本,输入以上语句。注意首字母的大小写。 3 、附上脚本

将脚本附在要执行此行为的游戏物体上。

- 要给物体附上脚本,点击要附脚本的游戏物体。本例为主摄像机,可以在 Hierarchy View 或者 Scene View 中选择它。

- 在主菜单中选择 Components->Scripts->Move1 命令,将把脚本附在摄像机 上。注意,在主摄像机的 Inspector View 中, Move1 成份将显示出来。

注意:在 Project View 中拖动脚本到 Scene View 中的物体上,也可以将脚本附在物体上。 - 运行游戏(点击左边的播放图标),可以使用光标键或者 WSAD 键控制主

摄像机的移动。有可能已经注意到摄像机移动的过快了,下面看看如何有效的控制摄像机移动速度。 4 、时间增量

上文中在 Update ()函数中的语句将导致摄像机在每帧中移动非常的快。在游戏中,最好

使物体的每秒钟的移动在预期范围之内。要达到这样的目的,将通过 Time.deltaTime 和每秒中移动的速度使 Input.GetAxis() 返回的值增大。 var speed = 5.0; function Update () {

var x = Input.GetAxis(\var z = Input.GetAxis(\transform.Translate(x, 0, z); }

- 用上面的代码更新 Move1 脚本。

注意:变量 speed 在 Update ()函数之外被声明,这个被称为公开变量( exposed variable ),不论是什么游戏物体,只要关联了此脚本,该变量就会显示在 Inspector View 中(对于 UnityGUI 变量也是公开的)。当数值需要调整以得到希望的效果时,公开变量是非常有用,更改公开变量比更改语句更容易啊。 5 、链接变量

通过 GUI 链接变量是 Unity 提供的强大功能。它允许变量正常情况下在语句中被赋值,又可以通过在 Unity GUI 中拖动改变数值。这样可以确保快速且容易的对想法进行试验。当通过Unity GUI 与变量建立联系,我们知道还应该在创建的脚本中定义公开的变量,这样我们可以通过 Inspector View 为参数赋值。 下面将创建一个射灯,它将跟随主摄像机的移动,从而展示链接变量的作用。 - 在 Scene View 中添加一个 spotlight ,将它移动到游戏物体的附近。 - 创建一个新的脚本,命名为 Follow 。

我们需要新的射灯始终照向主摄像机拍摄的方向,这就需要使用 Unity 内置的函数

transform.LookAt() 。在你开始想象如何去做,并为之设想了很多代码之前,最好去看看 Unity 的 API ,因为可能已经有合适的函数存在。当我们需要更改游戏物体的位置和旋转的时候,

最好在 API 的“ transform ”章节查找合适的函数。现在,我们进入链接变量阶段,即拿什么作为 LookAt ()的参数?我们可以使用硬编码提供一个游戏物体,然而,更好的办法是通过 GUI 给变量赋值,因此我们需要创建一个类型为 Transform 的公开变量。 Follow.js 脚本如下: var target : Transform; function Update () {

transform.LookAt(target); }

- 将脚本赋给射灯,注意当添加成份后,变量“ target ”被显露出来。

12

- 保持射灯被选择,在 Hierarchy View 中拖动 Main Camera 到 Inspector View 中的“ target ”

变量上。这将赋值给 target 变量,即射灯将跟随 Main Camera 。如果想让射灯跟随其他的游戏物体,拖动其他物体到 target 变量上(该物体必须具有 transform 信息)。

- 运行游戏。将看到射灯跟随 Main Camera 。可以修改射灯的位置以改善效果。 6 、进入成份

一个游戏物体可以具有多个脚本(或者其他成份),因此经常需要进入其他成份的脚本或者变量。 Unity 可以通过 GetComponent() 达到上面的效果。

现在将为射灯添加其他的脚本,当跳跃按钮(默认是空格键)被按下时,将射灯照向 Cube1. 设想一下应该如何做到:

( 1 )侦测何时跳跃按钮被按下。

( 2 )当跳跃按钮被按下时,将射灯照向 Cube1 。如果做到呢?在 Follow 脚本中包含一个变量“ target ”,它的值用于确定射灯朝向哪个游戏物体。我们需要为这个参数设置一个新值。我们可以为数值进行硬性变成,当然,将变量公开,通过 GUI 赋值将会是更好的办法。

- 创建一个新的脚本,命名为 Switch 。加入下面的语句到 Switch.js 中。 var switchToTarget : Transform; function Update () {

if (Input.GetButtonDown(\

GetComponent(Follow).target = switchToTarget;// 给 Follow 脚本的 target 变量传值。}

注意: GetComponent() 中 Follow 是怎样作为参数的。这将返回一个指向 Follow 脚本的引用( reference ),利用该引用可以访问到它的“ target ”变量。

- 将Switch 脚本赋给spotlight,并将 Cube1 在 Inspector View 赋值给 switchToTarget 参数。 - 运行游戏。测试效果。

通过代码实现上述效果(不推荐)

在教程前面我们提高可以通过代码赋值给变量达到目的,下面让我们大概分析一下做法。记 住这只是一个比较,通过 GUI 赋值给变量才是推荐的方式。

前面我们比较关注的问题是当跳跃按钮按下时,如何告诉射灯照向 Cube1 。解决方案是在

Switch 脚本中公开一个变量,然后通过 GUI 将 Cube1 赋值给该公开变量。如果是用代码实现, 主要有两种方式:

( 1 )使用游戏物体的名称;( 2 )使用游戏物体的标签( tag ) ( 1 )游戏物体名称

在 Hierarchy View 中可以看到游戏物体的名称。在语句中要使用这些名称,就需要在

GameObject.Find() 函数中用做参数。因此如果想利用跳跃按钮控制射灯由 Main Camera 照向Cube1 ,语句如下: function Update () {

if (Input.GetButtonDown(\{

var newTarget = GameObject.Find(\返回 Cube1 的 transform 数值 GetComponent(Follow).target = newTarget;// 赋值给 Follow 里的 target 变量}}

注意:在语句中直接定义的变量,没有设置为公开变量。浏览 API 查看有关 Find ()的更多使用内容。 ( 2 )游戏物体标签

游戏物体的标签是一个字符串,可以用来表示成份。要查看内置的标签,可以在 Inspector View 中点击 Tag 按钮。当然也可以创建自己的标签。要查找具有特定标签的一个成份,可 以使用 GameObject.FindWithTag() 函数,将字符串做为参数。完成代码如下: function Update () {

if (Input.GetButtonDown(\{

var newTarget = GameObject.FindWithTag(\

13

GetComponent(Follow).target = newTarget;} } 7 、实例化

在游戏运行期间,经常需要创建物体,要做到这样,就要使用 Instantiate 函数。

下面要做的是:当按下开火按钮(默认是鼠标左键或者键盘的做 Ctrl 键)时,就实例化(创

建)一个新的游戏物体。关于确定哪个物体用于实例化,最好的解决办法就是使用公开变量。也就是说,通过拖动一个游戏物体来给公开变量赋值,从而确定哪个物体用于实例化。

至于在哪实例化,本例仅实现当开火按钮按下时,就在主摄像机的位置处创建一个新的游戏 物体。Instantiate 函数需要三个参数:( 1 )要创建的物体;( 2 )物体的 3D 空间位置;( 3 )物体的旋转角度。 完正的代码如下,即 Create.js 脚本。 var newObject : Transform; function Update () {

if (Input.GetButtonDown(\

Instantiate(newObject, transform.position, transform.rotation);}}

不要忘记 transform.position 和 transform.rotation 是脚本所附着的物体的位置和旋转角度, 本例将是 Main Camera 。

然而,当一个物体被实例化,通常是一个 prefab 预制物体。下面将用 Cube1 游 戏物体做成预制物体。

- 首先创建一个空的预制物体。选择 Assets->Create->Prefab 命令,然后命 名预制物体为 Cube 。

- 从 Hierarchy View 中拖动 Cube1 游戏物体到 Project View 中的 Cube 预制 物体上。注意预制物体的图标发生了变化。 现在,开始创建 Javascript 代码。

- 创建一个新的脚本,命名为 Create 。插入上面的语句。

- 将此脚本附着在 Main Camera 上,并将 Cube prefab 赋值给 Main Camera的 newObject 变量。 - 运行游戏,每按开火按钮(鼠标左键或左 ctrl 键),将看到一个新的立方体产生。 8 、调试

调试是查找和修改代码中错误的技巧。 Unity 通过 Debug class 提供调试帮助, 下面介绍 Debug.Log() 函数LOG 日志

Log() 函数允许游戏制作者发送信息到 Unity Console ( Unity 控制台)。可以应 用在以下几点:

1 、验证在运行阶段确实执行了某一段代码。 2 、报告变量的状态。

现在,我们将使用 Log() 函数发送一条信息给 Unity 控制台,每按一次开火按钮就发送一次。 - 打开 Create 脚本,在“ Instantiate ”语句下面,“ If ”代码块中插入一行语 句: Debug.Log(\

- 运行游戏,点击开火按钮。在 Unity GUI 底部将看到一行提示“ Cube created ”,点击此提示可在 Unity Console 查看。 Watch 查看

用于调试的另外一个有用功能是显示私有变量,在 Debug 模式中,这将是私有 变量在 Inspector View 中显示出来,但是不能被编辑。

下面,我们就设置一个私有变量,用于计数创建的立方体数目。 - 打开 Create 脚本,添加下面两行。

( 1 )添加一个名称为 cubeCount 的私有变量。 ( 2 )每实例化一个立方体就增加这个数值。 代码如下:

var newObject : Transform;

14

private var cubeCount = 0; function Update () {

if (Input.GetButtonDown(\

Instantiate(newObject, transform.position, transform.rotation); Debug.Log(\cubeCount++;}}

- 运行游戏,点击开火按钮创建一些立方体。注意在 Inspector View 中,每

当一个新立方体被实例化, cubeCount 变量就将增加。但是该数值显示为灰色, 表示是只读变量,不能被修改。 9 、常用脚本类型

不论何时创建一个新的脚本,默认都会包含 Update() 函数。本节将介绍其他常用的一些项 目,可以简单的替换 Update ()函数。FixedUpdate ()

放置在此函数中的语句每间隔(固定的帧数)就被执行一次。一般用于强制 Rigidbody (刚 体)动作。 Awake ()

脚本初始化时,该函数中的语句将被调用执行。 Start ()

在 Awake ()函数之后, Update() 函数之前被调用。 Start() 函数和 Awake ()函数之间的不同就是Start() 函数仅在可执行状态下(即Inspector View中复选框被选中)才被调用。 OnCollisionEnter ()

当脚本所附着的游戏物体被其他的游戏物体所冲撞时,函数内部的语句将被执行。 OnMouseDown()

当游戏者移动鼠标经过一个游戏物体时,这个游戏物体可以是 GUIElement ( GUI 元素)或者是碰撞体,执行单击动作,即可执行里面的脚本。

// Loads the level named \// to the user clicking on the object function OnMouseDown () {

Application.LoadLevel (\}

OnMouseOver ()

当鼠标滑动过某个游戏物体时,如 GUI 元素或者碰撞体,函数内的脚本将被执行。 // Fades the red component of the material to zero // while the mouse is over the mesh function OnMouseOver () {

renderer.material.color.r -= 0.1 * Time.deltaTime; }

Unity3D 命令手册

这本书主要对 Unity3D 的所有菜单与参数进行了翻译并逐个讲解 来帮助大家初步的认识 Unity3D 的每个命令的作用 Unity3D 下分 8 个菜单栏(翻译的不一定准)

分别是 File (文件) Edit (编辑) Assets (资源) GameObject (游戏对象) Component (组件) Terrain (地形) Window (窗口) Help( 帮助 ) File (文件) ------New Scene 新建场景 Open Scene 打开场景Save Scene 保存场景 Save Scene as ?场景另存为? New Project ?新建工程文件

15


unity3d脚本(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:小电流输出设备的电流回检解决方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: