【Unity3D入门教程】使用C#脚本控制游戏对象

前言

使用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 () {
		
	}
}

首先,using关键字定义了两个默认使用的程序集UnityEngine和System.Collections。然后类名和我们定义的文件名保持一致。类里面有两个默认的函数Start()和Update()。Start()在脚本运行开始时执行,而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));
    }
}

(3)运行效果如下图



posted @ 2017-01-07 16:48  雁回晴空  阅读(2251)  评论(0编辑  收藏  举报