zoukankan      html  css  js  c++  java
  • 【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)运行效果如下图



  • 相关阅读:
    JPA实体类中常用的注解
    Eclipse的Project Facets属性
    java.util.HashMap的简单介绍
    java.util.Stack(栈)的简单使用
    java.util.Queue(队列)的简单使用
    如何让Spring MVC接收的参数可以转换为java对象
    解决eclipse报PermGen space异常的问题
    HTML <form> 标签的 enctype 属性
    Chrome浏览器查看cookie
    Eclipse调试时出现source not found的问题
  • 原文地址:https://www.cnblogs.com/yanhuiqingkong/p/7770069.html
Copyright © 2011-2022 走看看