前言
使用C#脚本控制游戏对象,是一项必备的基本技能。Unity3D可以使用的脚本有C#和javascript等。我们主要讲注意力集中在C#上。本文将会介绍怎样使用脚本控制场景中的游戏对象。
1 创建脚本
点击Project视图中的Create——C# Script。然后将脚本命名为motion.cs。双击脚本,使用编辑器打开它。我的编辑器已经改为了VS2013,软件默认的编辑器是MonoDevelop。默认的内容如下。
using UnityEngine;
using System.Collections;
public class motion : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
2 控制方块运动
我们创建一个Cube,然后使用自己写的脚本控制其运动。假设场景中已经有了一个Cube,为了使我们的C#脚本可以随着游戏开始而运行,我们需要将脚本绑定在Hierarchy中的某个物体上。不妨我们就把脚本绑定在方块上吧。绑定脚本的方式很简单,直接用鼠标把脚本拖动到Hierarchy视图或者Scene视图中对应的物体上即可。也可以先选中物体,然后把脚本拖动到该物体Inspector视图的空白处。
在脚本的Start()函数中添加这句话:
Debug.Log("hello unity");
然后点击游戏运行按钮,可以在控制台窗口看到如下信息,表示脚本运行成功。
接下来我们使用脚本控制方块的旋转、平移、缩放。
(1)旋转
this.transform.Rotate(Vector3.up*1,Space.World);
将上面的语句写到Update函数中,表示每一帧沿着世界坐标系的Y方向旋转1度。如果要沿着自身坐标系,则将Space.World改为Space.Self.
this.transform.Rotate(Vector3.up*1,Space.Self);
(2)平移
this.transform.Translate(Vector3.up*0.1f,Space.World);
将上面的语句写到Update函数中,表示每一帧沿着世界坐标系的Y方向移动0.1m。Unity默认的长度单位是米。如果要沿着自身坐标系,则将Space.World改为Space.Self.
this.transform.Translate(Vector3.up*0.1f,Space.Self);
(3)缩放
this.transform.localScale = new Vector3(1 +Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time));
将上面的语句写到Update函数中,该语句可以使得方块随着时间做正弦运动规律的缩放。
3 控制多个对象
前面我们在控制对象的时候,使用了“this”,它指的是脚本被绑定的那个物体。如果我们要控制多个物体,就需要使用公有变量绑定物体或使用脚本动态寻找物体。
在场景中创建3个Cube,分别是Cube1,Cube2,Cube3。将写好的脚本绑定到摄像机上。
(1)使用公有变量
将脚本内容设置为如下所示。
using UnityEngine;
using System.Collections;
public class motion : MonoBehaviour {
public GameObject cube1;
public GameObject cube2;
public GameObject cube3;
void Start () {
Debug.Log("hello unity");
}
// Update is called once per frame
void Update () {
cube1.transform.Translate(Vector3.up*0.1f, Space.World);
cube2.transform.Rotate(Vector3.up*1,Space.Self);
cube3.transform.localScale = new Vector3(1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time));
}
}
拖动对应的Cube到脚本的变量上。
(2)使用脚本动态绑定
如果使用脚本自动绑定物体,则使用下面的脚本。
using UnityEngine;
using System.Collections;
public class motion : MonoBehaviour
{
GameObject cube1;
GameObject cube2;
GameObject cube3;
void Start()
{
cube1 = GameObject.Find("Cube1");
cube2 = GameObject.Find("Cube2");
cube3 = GameObject.Find("Cube3");
}
// Update is called once per frame
void Update()
{
cube1.transform.Translate(Vector3.up * 0.1f, Space.World);
cube2.transform.Rotate(Vector3.up * 1, Space.Self);
cube3.transform.localScale = new Vector3(1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time));
}
}