学习Unity Script ( C# )

学习Unity,就绕不开Unity脚本,熟悉Unity脚本开发,就可以定义游戏的大部分行为,虽然Unity可以使用不止一种脚本来开发,但是通常推荐使用C#作为脚本开发语言。

Unity Script 的格式#

1
2
3
4
5
6
7
8
9
using System.Collections;
using UnityEngine;

public class Hello : MonoBehaviour {
void Start () {
}
void Update () {
}
}

从例子中可以看出,要成为一个UnityScript,必须使用UnityEngine命名空间,然后创建的类也必须继承自MonoBehaviour这个基类。

Unity Script 的使用#

Unity Script 作为 Unity 组件的一部分,可以通过挂靠在 GameObject 上面,去执行这个脚本。 然后通过脚本控制游戏中的相关逻辑部分。

当然,实际情况中经常会出现临时在代码中挂靠的情况:

1
gameObject.AddComponent<"Script Name">();

如果听过代码获取这个组件,则是:

1
gameObject.GetComponent<"Script Name">()

既然可以代码挂靠,当然也就可以代码删除脚本挂靠:

1
2
var newScript = gameObject.AddComponent<newScript>();
Destroy(newScript);

Unity Script 生命周期#

在 Unity 组件中,关于生命周期的函数主要有5个:

  1. Awake() 只会被调用一次,在Start方法之前被调用! 主要用于字段值的初始化工作,禁用脚本,创建游戏对象,或者 Resources.Load(Prefab) 对象
  2. Start() 只执行一次,在Awake方法执行结束后执行,但在Update方法执行前执行, 主要用于程序UI的初始化操作,比如获取游戏对象或者组件
  3. Update() 每一帧执行的,监听用户输入,播放动画
  4. OnGUI() 进行GUI的绘制,且GUI是每帧擦除重绘(准确的说这个不属于组件的生命周期)
  5. OnDestroy 脚本销毁时调用
  6. OnEnable 脚本enable为true时调用。

代码测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Awake()
{
Debug.Log("Awake");
}
void Start () {
Debug.Log("Start");
}

void OnEnable() {
Debug.Log("OnEnable");
}
void Update () {
Debug.Log("Update");
}

// Result;Awake OnEnable Start Update

脚本的加载和编译顺序#

Unity在加载C#脚本的时候,首先会先加载 Assets 中的 dll 文件;然后加载 Stambard Assets(这个文件夹包括子文件夹下的所有C#文件会被编译成firstpass.dll文件)中的 C# 脚本;然后才是加载 Assets 中的 C# 脚本文件(这些脚本会被编译成CSharp.dll)。

在最后则会加载 不会被打包到游戏中的 Editor 文件夹下面的脚本,这些脚本通常是用于扩展Unity编辑器用的,被编译成 Editor.dll。

理解脚本的加载顺序,才能避免 类似 先加载依赖的脚本,后加载被依赖的脚本而导致报错。

Assemblies 是C#中的程序集,通常一个namespace有一个或多个程序集,而一个或多个类会合并成一个程序集。
程序集通常是一些dll文件,这些是一种汇编集文件,可以通过这些让C#脚本的跨平台使用。
一定要和win32的dll做一个区分,这个dll是由unity的mono架构编译成的方便跨平台使用的汇编集。这些Assemblies程序集通常可以在 …/Libraray/ScriptAssemblies 文件夹里面找到。

dll必须了解他的特性,实际上在很多公司的项目中,并不是直接存放可执行的C#文件,而是将C#文件编译成 dll 文件后才放到unity中去使用。

脚本的优化#

  • 对象池

管理频繁出现的对象,用池的方式去解决。

但是对象池本身也会有一定的内存消耗,所有要酌情使用。

  • 避免频繁的内存分配

比如:

1
2
3
4
5
6
var str = "1" + "2" + "3" // Error

var str = new StringBuilder(10); // Right
str.Append("1");
str.Append("2");
str.Append("3");
  • 避免非必要的逻辑出现在 Update 中

  • 使用Editor内赋值,而不是find

  • 除非必要,不要使用复杂的物理表现,不要使用物理刚体,不要复杂的数学运算

  • 除非必要,避免全局缓存

  • 随时通过 Profiler 去检查游戏性能

Unity中的特殊文件夹#

  • “.filename” 这种前面有点号的文件夹

这种文件夹通常是显示隐藏的文件夹,存放那些不想被显示的文件内容

  • Stambard Assets

加载顺序第一批加载的文件脚本,但是除非特殊需求,不会用到这个文件夹。

  • Editor

编辑器扩展相关的内容,不会被打包到游戏中

  • Plugins

通常存放 插件 和 原生平台的内容

  • Resources

会打包安装到游戏中的内容

  • Editor Default Resources

提供给编辑器使用的Resources文件,也是不会打包到游戏中

  • Gizmos

Game 和 Scene 中的标识符。比如 Scene 中的相机符号。

  • Streaming Assets

也会打包到游戏中,通常是一些unity不能识别的自定义文件。

小狗钱钱 C# 快速入门

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×