C#是一门由微软公司开发的面向对象语言。首先声明,C#并不是一门动态脚本语言。C#与JAVA和C++很相似,具备面向对象语言大多数特性,如类、对象、继承、重载和多态等。由于微软公司早期的封闭战略,C#语言只能在微软生态里运行。大部分开发者无法忍受微软公司的傲慢,纷纷放弃C#转而选择了JAVA语言,C#从此逐渐开始没落。直到新任CEO纳德拉上台后,微软开始大刀阔斧的改革,开始开源并支持跨平台。再加上.NET框架的性能优化和提升,C#语言正在焕发新的生机。尽管C#影响力大不如前,但在Unity应用领域,C#依然是绝大多数开发者的首选编程语言。

在Unity中,脚本即为游戏对象的行为组件。通过脚本,我们可以修改和创建游戏对象的属性,从而达到我们想要的游戏效果。Unity脚本语言支持三种,分别是C#、UnityScript和Boo,但绝大多数开发者采用C#语言。Unity与C#可以天然有机结合,因为Unity是基于由C#编写的Mono平台打造的游戏引擎。在Unity中,创建C#脚本有多种方法,最常用是直接在Project视图里单击右键进行Create。创建完成后,还需将C#脚本移动到Hierarchy视图中对应的游戏对象,这样才能生效。

本例来自于Unity官方教学视频,具体逻辑为,当小立方体添加了刚体RigidBody组件后,因受到重力作用开始自由下落,在这个过程中玩家按键盘上的R、G和B键时,小立方体的颜色就会变成对应红色、绿色和蓝色。

如上图所示,我们为Cube立方体游戏对象添加了ChangeColor脚本。红色方框内是脚本创建和存放的位置,单击脚本文件后,Unity会自动打开IDE供你进行编写代码。你可以在Unity-Preferences-External Tool里配置你喜欢的IDE。作者推荐VSCode,微软良心跨平台IDE,对C#和Unity天生友好,还十分轻量。选中脚本后,在检测视图里可以看见我们编写好的代码。

每个C#脚本的文件名和Class名必须一致。C#对大小写敏感,文件名、类名和函数名每个单词首字母必须大写,变量名采用帕斯卡命名法(首字母小写,从第二个单词开始首字母大写,其他字母小写)。Unity的C#脚本中所有的类默认继承自MonoBehavior,因此任何一个Unity中的C#脚本均可调用Unity生命周期事件。Unity生命周期中最常用的事件是Awake函数、Start函数、FixedUpdate函数、Update函数、LateUpdate函数和OnDestroy函数等。以上排列顺序即为这些生命周期事件的执行顺序。

当一个Unity脚本执行时,最先调用的便是Awake函数。Awake函数在Unity生命周期中只在初始时调用一次。通常用于创建游戏对象、初始化游戏对象属性值或者禁用脚本等。Awake函数执行之后,接着便是Start函数。通过Unity创建的C#脚本文件,会自动加上Start函数和Update函数。Start函数同样只执行一次,不过Start函数是在游戏开始运行时执行。通常用于初始化游戏对象的属性值和对应组件。

以上两个函数执行之后,Unity开始对游戏进行渲染。FixedUpdate函数在游戏运行后,每隔一个固定间隔时间就执行一次,具体间隔时间不定。它通常用于固定更新游戏对象或模型的移动。与FixedUpdate固定更新不同,Update函数更新间隔时间会根据当前系统的运行情况或者性能来决定。在游戏运行中,Update函数每一帧执行一次。但当系统繁忙或者性能欠佳时,游戏渲染的帧速可能会发生变化,Update函数更新的频率也会发生变化。LateUpdate函数在Update函数执行之后,表示最后的更新完成。每一个Unity脚本事件都有开始、更新和销毁的过程,OnDestroy函数在脚本销毁时调用。

除了以上常见的生命周期事件,Unity还有很多的生命周期事件。请看下图:

The last but no least! 在Unity中光源非常重要且作为场景的初始对象,有光才有投影,才能使用游戏场景更逼真。光源可以在检测视图中手动开启或者关闭,如下图。

除了手动关闭外,还可以通过脚本来控制,因为脚本即组件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CloseLight : MonoBehaviour
{
    private Light neoLight; //首先定义一个类变量存放Light组件

    // Start is called before the first frame update
    void Start()
    {
        neoLight = GetComponent<Light>(); //GameObject获取组件的方法已被弃用
    }
    
    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyUp(KeyCode.Space))  
        {
            neoLight.enabled = !neoLight.enabled;    //用空格键实现灯光的开闭
        }
    }

}

更多C#脚本编程知识请看后续博客。