Unity脚本语言
Unity是可视化的集成开发环境,项目开发工作可以通过可视化操作和相关属性的设置完成。
交互操作要通过脚本程序,将脚本挂载到特定的对象上,然后在合适的时机被调用执行。
Unity支持三种脚本:
1.Javascript for Unity(2017.2版本)
2.C# Script
3.Boo(2014年)
Unity脚本生命周期
1)Awake():在游戏开始之前,脚本实例化、场景加载时被调用,Awake用来创建游戏对象、初始化变量或游戏状态,只被调用一次;
(2)Start():游戏启动后渲染第一帧之前,被调用并只被调用一次,用于数据的初始化操作;
(3)Update():Start方法调用结束以后,Update方法被调用,并且以后每一帧都会被调用。
案例:测试脚本中的各方法调用顺序和次数。
publicclass LifeCycle : MonoBehaviour {
void Awake(){
print ("Awake..."); }
void OnEnable(){
print ("OnEnable..."); }
void Start(){
print ("Start...");}
void Update(){
print ("Update..."); }
void FixedUpdate(){
print ("FixedUpdate..."); }
void LateUpdate() {
print ("LateUpdate..."); }
void OnGUI(){
print ("OnGUI..."); }
void OnDisable(){
print ("OnDisable..."); }
void OnDestroy(){
print ("OnDestroy..."); }
}
- MonoBehaviour类
MonoBehaviour类是所有脚本的基类,当创建一个新的脚本时,该脚本都要继承MonoBehaviour类。
- 向量类
(1)向量基本概念
既有大小又有方向的量叫做向量(亦称矢量)。3D游戏开发中经常用到向量和向量的运算,Unity中提供了完整的向量和向量操作方法。
Unity中向量就是类,包括平面空间的二维向量Vector2类和立体空间的三维向量Vector3类,另外还有Vector4类。
(2)Vector3
Vector3类表示三维空间的向量,包括x、y、z三个坐标。Vector3类可以在实例化时进行赋值,也可以实例化后分别给x、y、z三个分量赋值。
Vector3 v1 = new Vector3();
Vector3 v2 = new Vector3(1, 1, 1);
v1.x= 2;
v1.y= 2;
v1.z= 2;
print(v1);
print(v2);
(3)Vector3类的常量
- Transform类
Transform是一个类,游戏对象上的Transform组件是Transform类的一个实例,用transform表示。
4. Time类
Time类是获取时间信息的类。
实例:脚本控制游戏对象
本实例编写完成一个脚本,实现控制对象运动。
(1)创建Cube立方体和Plane平面对象,并分别赋予红色和绿色材质,将平面对象的Position的y轴值设置为-0.5,Scale的x、y、z值都设置为30。
(2)创建脚本trans_con.cs,挂载到立方体上。
(3)编写脚本代码。
(4)测试运行,分别按下W、S、A、D键,上、下、左、右箭头键,PageUp、PageDown键,观察立方体运行和变换效果。
(5)导入飞机模型,将airplane文件夹下的FBX模型文件airplane.FBX和贴图文件plane_texture.png拖动到Assets中。Unity会自动创建材质,将材质的主贴图设置为plane_texture.png纹理图片,材质会包裹住飞机模型。将飞机模型拖动到场景中,创建一个飞机对象airplane。
(6)将脚本trans_con.cs应用到飞机对象airplane上。
(7)设置摄像机的平滑跟随。导入资源包Scripts.unityPackage,为MainCamera添加SmoothFollow组件,将跟随目标参数Target设置为airplane(直接将airplane拖动到Target参数后面的文本框中)。
(8)运行效果如图所示。
1.创建一个Cube和Plane,添加颜色,创建一个脚本,使Cube可以上下左右移动和旋转
public int movespeed = 10;//移动初始值
public int respeed = 20;//旋转初始值
void Update () {
//移动
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(0, 0, movespeed * Time.deltaTime);//延Z轴移动
}
else if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(0, 0, -movespeed * Time.deltaTime);
}
else if(Input.GetKey(KeyCode.A))
{
transform.Translate(-movespeed * Time.deltaTime,0, 0 );
}
else if (Input.GetKey(KeyCode.D) )
{
transform.Translate(movespeed * Time.deltaTime,0, 0);
}
// 旋转
if (Input.GetKey(KeyCode.LeftArrow)){
transform.Rotate(0,-respeed * Time.deltaTime,0);
}else if (Input.GetKey(KeyCode.RightArrow))
{
transform.Rotate(0, respeed * Time.deltaTime, 0);
}
}
}
//缩放
if (Input.GetKey(KeyCode.PageUp))
{
scale += 0.05f;
transform.localScale = new Vector3(scale, scale, scale);
}
else if (Input.GetKey(KeyCode.PageDown))
{
scale -= 0.05f;
transform.localScale = new Vector3(scale, scale, scale);
}
}