2017-01-07 16:47:47 zzlyw 阅读数 34245
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

前言

使用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)运行效果如下图



2013-03-25 18:31:11 wangyihero8 阅读数 813
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

1. unity中在js中调用C#的脚本时,js的名空间#pragma strict要去掉,否则js不能调用c#中的脚本:

#pragma strict可以更加严格的进行静态类型检查,能够引导你更加好的写更加严谨和更好风格的代码,一般在开发的时候推荐写上。

 

2. 要使用Physics.Raycast ()来检测鼠标点击所获取的物体时,该物体object必须有碰撞器组件!否则Raycast ()检测不到!

Physics.Raycast ()static function Raycast (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean Returnsboolean - True when the ray intersects any collider, otherwise false.//布尔值,如果射线相交于任一碰撞器,返回true 否则为falseDescription //描述Casts a ray against all colliders in the scene.// 对场景里的所有带有碰撞器组件的对象投放一束射线

2014-05-10 03:32:34 weini_xiong 阅读数 855
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

在编写C#时,发现不能很好的将JS代码转换为C#,所以这里放一些我遇到的问题:
201311.30
修改transfome.position  时,要new 一个Vector3,而不能单独直接修改某一个值。

2013.12.12
1、获取和添加组件
获取组件:
GetComponent<Type>();或gameObject.GetComponent(“Type”) as Type;

添加组件以例子:
private LineRenderer linerenderer;
linerenderer = gameObject.AddComponent("LineRenderer") as LineRenderer;//添加对象  注意js中的不同


2、延时处理
StartCoroutine(PlaySound(SlingShotSound));//与js区别,如何调用IEnumerator PlaySound(AudioClip soundName)

IEnumerator PlaySound(AudioClip soundName)
{
if(!audio.isPlaying)
{
audio.clip = soundName;
audio.Play();
//Debug.Log("SB");
yield return new WaitForSeconds(audio.clip.length);
//yield WaitForSeconds();
}
}

没有更多推荐了,返回首页