我是AR人
侠客
侠客
  • UID4982
  • 粉丝2
  • 关注0
  • 发帖数20
阅读:1706回复:0

Unity3d入门教程系列:使用C#脚本控制游戏对象

楼主#
更多 发布于:2017-12-29 15:02
前言
使用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)旋转
  1. this.transform.Rotate(Vector3.up*1,Space.World);  

将上面的语句写到Update函数中,表示每一帧沿着世界坐标系的Y方向旋转1度。如果要沿着自身坐标系,则将Space.World改为Space.Self.
  1. this.transform.Rotate(Vector3.up*1,Space.Self);  

(2)平移
  1. this.transform.Translate(Vector3.up*0.1f,Space.World);  
将上面的语句写到Update函数中,表示每一帧沿着世界坐标系的Y方向移动0.1m。Unity默认的长度单位是米。如果要沿着自身坐标系,则将Space.World改为Space.Self.
  1. this.transform.Translate(Vector3.up*0.1f,Space.Self);  

(3)缩放
  1. 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)使用公有变量
将脚本内容设置为如下所示。
  1. using UnityEngine;  
  2. using System.Collections;  
  3.  
  4. public class motion : MonoBehaviour {  
  5.  
  6.    public GameObject cube1;  
  7.    public GameObject cube2;  
  8.    public GameObject cube3;  
  9.  
  10.    void Start () {  
  11.        Debug.Log("hello unity");  
  12.    }  
  13.      
  14.    // Update is called once per frame  
  15.    void Update () {  
  16.        cube1.transform.Translate(Vector3.up*0.1f, Space.World);  
  17.        cube2.transform.Rotate(Vector3.up*1,Space.Self);  
  18.        cube3.transform.localScale = new Vector3(1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time));  
  19.    }  
  20. }  
拖动对应的Cube到脚本的变量上。


(2)使用脚本动态绑定
如果使用脚本自动绑定物体,则使用下面的脚本。
  1. using UnityEngine;  
  2. using System.Collections;  
  3.  
  4. public class motion : MonoBehaviour  
  5. {  
  6.  
  7.    GameObject cube1;  
  8.    GameObject cube2;  
  9.    GameObject cube3;  
  10.  
  11.    void Start()  
  12.    {  
  13.        cube1 = GameObject.Find("Cube1");  
  14.        cube2 = GameObject.Find("Cube2");  
  15.        cube3 = GameObject.Find("Cube3");  
  16.    }  
  17.  
  18.    // Update is called once per frame  
  19.    void Update()  
  20.    {  
  21.        cube1.transform.Translate(Vector3.up * 0.1f, Space.World);  
  22.        cube2.transform.Rotate(Vector3.up * 1, Space.Self);  
  23.        cube3.transform.localScale = new Vector3(1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time), 1 + Mathf.Sin(Time.time));  
  24.    }  
  25. }  
(3)运行效果如下图

图片:20170107164510132.gif

欢迎分享

游客

返回顶部