Unity3D学习笔记(2)——脚本基础

本章介绍脚本相关基础,C#相关知识我之后会更新。

本文仅供个人记录和复习,不用于其他用途

前言

所有练习的代码和案例我都挂到了 GitHub 上,笔记请转到——Untiy脚本基础练习

什么是脚本

对于 Unity 而言,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码。Unity 编辑器集成了许多脚本编辑器的能力,像是建立脚本、与游戏对象连接、变量数值的修改以及修改脚本后的实时预览等等。在前一篇笔记中,我编写过一个很简单的脚本,并且把它连接到了方块上,实现了方块的移动。但请注意,我并没有做任何的实例化,这一步骤由 Unity 自动完成的。

在U3D中创建C#脚本

创建 C# 脚本要取有意义的名字,类名要与脚本名一致。当你创建了一个新的脚本后,你会看到如下的默认代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}

含义如下:

  • 前三行为调用 Unity 库文件
  • NewBehaviourScript 类中含有 Start() 和 Update() 两个方法。Unity 中会有些特定的函数,这些特定的函数在一定条件下会被自动调用,称为必然事件。Start 和 Update 这两个函数是 Unity 中最常用的两个事件,因此新建脚本时 Unity 自动创建了。

如果你修改了脚本的名称(比如改成 CubeMove),那么你必须要把类名也改成 CubeMove,否则就会出错。

MonoBehavior

继承自 MonoBehavior 的脚本从唤醒到销毁有着完整的生命周期。下面是生命周期的各个阶段:

名称 触发条件 用途
Awake 脚本实例被创建时调用 当游戏对象被创建的时候,游戏对象绑定的脚本会在该帧内执行 Awake() 函数,无论脚本是否处于激活状态
Start 脚本激活时执行,位于 Awake() 之后 该函数用于游戏对象的初始化,不过脚本如果未激活,那么 Start() 不会执行
Update 每帧调用一次 用于更新游戏场景和状态(和物理状态有关的更新应放在 FixedUpdate 里)
LateUpdate 每帧调用一次(在 Update 调用之后) 该函数是在 Update() 执行后被调用的,主要用来调整代码执行的顺序。例如玩家需要一个摄像机来跟随,那么角色的移动逻辑会写在 Update() 中,而摄像机的逻辑则在 LateUpdate() 中,这样可以确保在角色的位置计算完毕后再调整摄像机。
FixedUpdate 每个固定物理时间间隔(Physics Time Step)调用一次 用于物理状态的更新
OnGUI 绘制界面函数 用于测试功能使用,比如创建测试按钮
OnDestory 当前脚本销毁时调用该函数 可以在函数里填写删除时需要处理的逻辑
OnEnable 激活函数 当前脚本被激活时调用
OnDisable 禁用函数 当脚本被禁用时调用

这里先简单地说一下,Update 所指的“每帧调用一次”,主要取决于机器的运行配置。如果配置不足,那么游戏的运行帧数就会下降,Update 的调用次数也会减少。至于说为什么要把物理状态的更新放到 FixedUpdate 中,各位可以去看看我的《游戏编程算法与技巧笔记》的第二篇,里面详细地分析了这个问题。

至于其他的函数,我会在之后的章节中一一介绍。

总结

MonoBehavior 是 U3D 中非常重要的类,它有点类似于 Cocos2dx 中的 Ref 类。另外,在 Unity3D 中使用 C# 会略有些不同,所以在学习之前最好是先过一遍基本的 C# 语法。