Unity3D游戏开发之Unity脚本的简单运用

发表于2017-06-07
评论1 1.8k浏览

在Unity5.X版本中,支持的脚本有JavaScript,C#等,并且这些脚本可以同时存在和运用于同一个项目当中,两者没有绝对的排斥关系,所以本篇文章要和大家介绍的是Unity脚本的简单运用,一起看看吧。

一、新建脚本

接下来,我们可以在编辑器当中新建一个脚本,在Project视图文件夹中右键,选择自己熟悉的脚本create即可,这里我们新建一个C#脚本。新建完了脚本之后,我们打开脚本看一下,可以发现脚本自动生成了两个函数:Start() 和 Update()。 
在Unity里面,提供了一些函数供我们复写进行内部的调用,其中Start()是在脚本启用之后,Update执行之前调用,一般用于初始化变量等。Update()函数则是脚本每帧调用的时候都会执行,相当于是游戏的一个主逻辑线程,一般每帧对游戏的更新都在这个地方执行。除了这两个之外,还有其他的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
Update
 
 当MonoBehaviour启用时,其Update在每一帧被调用。
 
LateUpdate
 
当Behaviour启用时,其LateUpdate在每一帧被调用。
 
FixedUpdate
 
 当MonoBehaviour启用时,其 FixedUpdate 在每一帧被调用。
 
Awake
 
 当一个脚本实例被载入时Awake被调用。
 
Start
 
Start仅在Update函数第一次被调用前调用。
 
Reset
 
重置为默认值。
 
OnMouseEnter
 
当鼠标进入到GUIElement(GUI元素)或Collider(碰撞体)中时调用OnMouseEnter。
 
OnMouseOver
 
当鼠标悬浮在GUIElement(GUI元素)或Collider(碰撞体)上时调用 OnMouseOver .
 
OnMouseExit
 
当鼠标移出GUIElement(GUI元素)或Collider(碰撞体)上时调用OnMouseExit。
 
OnMouseDown
 
当鼠标在GUIElement(GUI元素)或Collider(碰撞体)上点击时调用OnMouseDown。
 
OnMouseUp
 
 当用户释放鼠标按钮时调用OnMouseUp。
 
OnMouseUpAsButton
 
OnMouseUpAsButton只有当鼠标在同一个GUIElement或Collider按下,在释放时调用。
 
OnMouseDrag
 
当用户鼠标拖拽GUIElement(GUI元素)或Collider(碰撞体)时调用 OnMouseDrag 。
 
OnTriggerEnter
 
当Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter。
 
OnTriggerExit
 
当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。
 
OnTriggerStay
 
当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用。
 
OnCollisionEnter
 
当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionEnter将被调用。
 
OnCollisionExit
 
当此collider/rigidbody停止触发另一个rigidbody/collider时,OnCollisionExit将被调用。
 
OnCollisionStay
 
当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。
 
OnControllerColliderHit
 
在移动的时,当controller碰撞到collider时OnControllerColliderHit被调用。
 
OnJointBreak
 
当附在同一对象上的关节被断开时调用。
 
OnParticleCollision
 
当粒子碰到collider时被调用。
 
OnBecameVisible
 
当renderer(渲染器)在任何相机上可见时调用OnBecameVisible。
 
OnBecameInvisible
 
当renderer(渲染器)在任何相机上都不可见时调用OnBecameInvisible。
 
OnLevelWasLoaded
 
当一个新关卡被载入时此函数被调用。
 
OnEnable
 
当对象变为可用或激活状态时此函数被调用。
 
OnDisable
 
当对象变为不可用或非激活状态时此函数被调用。
 
OnDestroy
 
当MonoBehaviour将被销毁时,这个函数被调用。
 
OnPreCull
 
在相机消隐场景之前被调用。
 
OnPreRender
 
在相机渲染场景之前被调用。
 
OnPostRender
 
在相机完成场景渲染之后被调用。
 
OnRenderObject
 
在相机场景渲染完成后被调用。
 
OnWillRenderObject
 
如果对象可见每个相机都会调用它。
 
OnGUI
 
渲染和处理GUI事件时调用。
 
OnRenderImage
 
当完成所有渲染图片后被调用,用来渲染图片后期效果。
 
OnDrawGizmosSelected
 
如果你想在物体被选中时绘制gizmos,执行这个函数。
 
OnDrawGizmos
 
如果你想绘制可被点选的gizmos,执行这个函数。
 
OnApplicationPause
 
当玩家暂停时发送到所有的游戏物体。
 
OnApplicationFocus
 
当玩家获得或失去焦点时发送给所有游戏物体。
 
OnApplicationQuit
 
在应用退出之前发送给所有的游戏物体。
 
OnPlayerConnected
 
当一个新玩家成功连接时在服务器上被调用。
 
OnServerInitialized
 
当Network.InitializeServer被调用并完成时,在服务器上调用这个函数。
 
OnConnectedToServer
 
当你成功连接到服务器时,在客户端调用。
 
OnPlayerDisconnected
 
当一个玩家从服务器上断开时在服务器端调用。
 
OnDisconnectedFromServer
 
当失去连接或从服务器端断开时在客户端调用。
 
OnFailedToConnect
 
当一个连接因为某些原因失败时在客户端调用。
 
OnFailedToConnectToMasterServer
 
当报告事件来自主服务器时在客户端或服务器端调用。
 
OnMasterServerEvent
 
当报告事件来自主服务器时在客户端或服务器端调用。
 
OnNetworkInstantiate
 
当一个物体使用Network.Instantiate进行网络初始化时调用。
 
OnSerializeNetworkView
 
在一个网络视图脚本中,用于自定义变量同步。

其中,要注意的是以下几个常用的函数的执行顺序: 
Awake()->OnEnable()->Start()->Update()->LateUpdate()->OnGUI()->OnDisable()->OnDestroy() 
下面是我用相关的测试脚本得出来的执行结果: 

Awake 和 Start比较容易混淆,我们看看Unity圣典当中的介绍好了:

Awake()

当一个脚本实例被载入时Awake被调用。

Awake用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。每个游戏物体上的Awke以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息。Awake总是在Start之前被调用。它不能用来执行协同程序。

Start()

Start仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。 
你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。

二、脚本的使用

Unity是一个面向组件的一个游戏引擎,在Unity当中,脚本也算是一种组件,我们可以通过以下四种方式将建好的脚本和游戏的物体结合起来:

  1. 直接拖动到Hierarchy当中的Object节点
  2. 选定Object,在Inspector面板中点击AddComponent来添加
  3. 直接拖至Scene当中的Object
  4. 通过代码添加:this.gameObject.AddComponent();

三、变量的声明

在Unity中,有一个很方便的功能,就是允许你在脚本当中定义一个变量,然后在编辑器运行当中可以实时改变变量的值,而不需要打开脚本编辑,通过这种模式,我们可以在游戏播放测试的时候设置合适的变量值。下面我们说一下定义变量需要注意的事项(C#脚本):

  • 必须定义成public对象
  • 结构体定义前需要加上序列化标签

我们来看看例子:

1
2
3
4
5
6
7
8
9
10
[System.Serializable]
public struct Boundary
{
    public float xMin;
    public float xMax;
    public float zMin;
    public float zMax;
}
 
public Boundary bound;

在代码中,我声明了一个Boundary的结构体,并定义一个public的bound对象,然后我们把这个脚本拖到场景中的物体当中,此时,编辑器会进行更新,然后我们就会发现在Inspector界面里面,我们的脚本组件多了可以编辑的属性在内:

通过这种方式,我们可以提高脚本的复用性。

这一节就先学习到这,下一节我们将会学习如何通过脚本跟游戏的组件和Object进行进一步的交互。

Unity3D游戏开发系列:

Unity3D游戏开发之Unity3D编辑器总览

Unity3D游戏开发之地形(Terrain)的创建

Unity3D游戏开发之Animator组件的应用

Unity3D游戏开发之GameObject的操作

Unity3D游戏开发之第三人称摄像机的简单实现(跟随视角,自由视角)

Unity3D游戏开发之观察视角的实现

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论