2014-03-04 11:46:44 hackdjh 阅读数 11500
  • Unity 值得看的500+ 技术内容列表

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

很多人都会Unity3D中调用网页中的js,反过来就一头雾水。

其实也很简单

在HTML中添加下面的代码:

       <script type="text/javascript" language="javascript">

		var u = new UnityObject2();
		u.initPlugin(jQuery("#unityPlayer")[0], "XXX.unity3d");//XXX为生成出来的.unity3d前名称
		
		function 方法()
		{
			u.getUnity().SendMessage("A", "B", "C");
			//A为你执行方法对应的物体
			//B为方法的名字
			//C为方法参数
		}

		</script>

2017-07-08 14:52:28 HappyKocola 阅读数 419
  • Unity 值得看的500+ 技术内容列表

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

前言

6月底开始学习Unity3D,断断续续,算是开始入门了.
相比于cocos2d-x,在用Unity3D写游戏时,在界面上用编辑器拖拉修改,而且可以实时查看效果,但cocos2d-x需要用代码去设计,而且每次查看修改后的效果都需要重新编译运行,十分耗时;此外,Unity3D,使用C#脚本(还有JavaScript)来编写逻辑,逻辑编写效率很高,而且不需要去担心C++里恼人的内存管理工作.
总之,Unity3D作为一套完整的游戏开发解决方案,开发游戏十分高效.自己甚至后悔在去年9月时,选择cocos2d-x去开发游戏.但,cocos2d-x的开发和实习经验,让自己对游戏开发,和部分底层的原理有了一些了解,这在自己学习Unity3D的过程中,或多或少有一定的帮助.
希望现在开始学习Unity3D还不晚,加油!

坦克大战

在此之前,已经花费时间学习了Unity3D简单的编辑器操作,对C#也简单学习了一下语法(自己C++基础尚可,对于C#只是简单的了解了一下语法和语言特性,更多的特性打算在开发过程中需使用时再去了解).

为了更加高效地入门,自己购买了Siki的一套完整的Unity教程,并照着教程视频来逐步开发游戏,第一个游戏名叫《坦克大战》(Unity官方教程之一).

以下,是学习该游戏过程中的一些Tips和总结.

1.刚体(Rigidbody)

作为一个组件(component),刚体可以使物体受Unity物理引擎的控制,而且不用添加任何的代码,就可以让物体受重力影响,并且能对碰撞做出反应.
当然,刚体组件提供了脚本API,这样就能在脚本中对刚体进行控制,例如对刚体添加力,或者控制器运动路径.
最后,应该在FixedUpdate函数中对刚体添加力或者改变刚体的属性,这是因为Update函数每秒运行次数和机器本身相关,而物理模拟应该是和时间相关,而不是和帧更新的速度相关.

重要的几个API:
(1)void OnCollisionEnter(Collision collision):
刚体本身和collision开始发生碰撞时被调用;
(2)void OnCollisionExit(Collision collision):
刚体本身和collision碰撞结束时被调用;
(3)void OnCollisionStay(Collision collision):
刚体本身和collision碰撞状态保持时被调用(每帧调用一次);

(4)void SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
这里对最后一个参数不做了解,第一个参数是方法名,第二个参数是传递的方法参数(可以通过数组来实现多个参数的传递);
这个函数的作用是,接收一个方法名,然后在刚体的脚本中找到名为methodName的方法,并传递参数调用.

注:个人觉得这是使用了C#里的反射机制;

2.CharacterController

使用刚体,在发生碰撞的时候,会产生力的作用,这在大多数场景下是合适的;但在某些场景下,是不适合用刚体的,例如使用摄像机游览场景的时候,虽然需要进行碰撞检测,以避免穿墙,同时又要求摄像机和其他物体碰撞之后不能对它产生任何力的作用,同时摄像机本身也不需要模拟真实碰撞的反作用力.

在这种情况下,CharacterController被提出来,以满足这种需求.CharacterController本身自带一个碰撞器,无需刚体即可完成触发(Trigger)和碰撞(Collision)功能.

要使用CharacterController,首先需要将CharacterController组件挂载在目标对象下,然后添加一个脚本,在脚本中,获取(GetComponent< CharacterController >())CharacterController组件实例,并在Update或FixedUpdate函数中调用Move(暂时还未用过)或SimpleMove来更新CharacterController的位置,如果与其他的碰撞去发生碰撞,CharacterController就会被阻挡前进,同时触发OnControllerColliderHit函数.

3.Prefab

概念:Prefab是一种资源类型—存储在项目视图中的一种可以反复使用的游戏对象.因而当游戏中需要非常多反复使用的对象、资源等时,Prefab就有了用武之地.它拥有下面的特点:
(1)能够放到多个场景中,也能够在同一个场景中放置多次;
(2)当加入一个Prefab到场景中时,就创建了它的一个实例;
(3)全部的Prefab实例链接到原始的Prefab,本质上是原始Prefab的克隆;
(4)不论项目中存在多少实例,仅仅要对Prefab进行改动,全部Prefab实例都将随之发生变化.

创建填充Prefab:为创建一个Prefab,必须使用菜单构造一个新的空白Prefab.不包括游戏对象,因而不能创建它的一个实例.

此时这个新的Prefab就像一个空的容器,想要使用它.必须用游戏对象的数据来填充它,让它不空.创建方法为:Project视图中,Create->Prefab(或者,Assets->Create->Prefab),此时能够看到Project视图中多了一个灰色的小立方体,这就是创建的Prefab.

填充Prefab非常简单,仅仅需要在Hierarchy视图中选择要成为Prefab的游戏对象,然后拖动该对象到刚才创建的Prefab上就可以.此时,能够看到灰色的小立方体变成蓝色.此时,游戏对象和其全部的子对象就已经拷贝到了Prefab的数据中.而Hierarchy视图中的原始游戏对象已经成为了该Prefab的一个实例.

脚本实例化Prefab(执行时实例化Prefab):在执行时,通过Prefab实例化复杂的游戏物体是非常方便的.实例化Prefab的替代方法就是从一开始就是用代码来创建游戏物体.而实例化Prefab比替代方法有非常多的优势:
(1)能够用一行代码来实例化一个具有所有同样功能的Prefab;而用代码创建等效的游戏对象却要花费平均5行代码甚至更多;
(2)能够非常简单地在Scene和Inspector视图中高速建立、测试和改动Prefab;
(3)能够改动实例化的Prefab,却不须改变实例化它的代码;

Unity中Object类实例化函数:
static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
第一个参数:实例化对象模板;
第二个参数:实例化对象的位置(例如炮弹,可以在场景中建立一个EmptyObject作为发射器,将该发射器位置作为position);
第三个参数:实例化对象的旋转.

using UnityEngine;
using System.Collections;

public class TankAttack : MonoBehaviour {

    public GameObject shellPrefab;

    public KeyCode fireKey = KeyCode.Space;

    private Transform firePosition;

    public float shellSpeed = 10.0f;

    public AudioClip shootAudio;

    void Start () {
        firePosition = transform.Find("FirePosition");
    }

    void Update () {
        if(Input.GetKeyDown(fireKey))
        {
            AudioSource.PlayClipAtPoint(shootAudio, transform.position);
            GameObject go = GameObject.Instantiate(shellPrefab, firePosition.position, firePosition.rotation) as GameObject;
            go.GetComponent<Rigidbody>().velocity = go.transform.forward * shellSpeed;
        }
    }
}

Instantiate函数返回的是Object类型,需要将其向下转型,C#里提供as关建志完成这个操作,如果转型失败,不会抛出异常,而是返回null;
上述代码中,在编辑器里将弹药(Shell)的Prefab拖到Tank脚本TankAttack的shellPrefab变量上,使用Instantiate函数即可完成实例化;

继承Prefab:继承是指任何时候当源Prefab发生变化时,这些变化将应用于全部已链接到该Prefab的游戏对象.比如,假设加入一个新的脚本到该Prefab,全部已经链接到该Prefab的游戏对象都将立马包括该脚本.

源的位置和旋转将不被应用,因为这样会影响到实例的绝对位置并把全部实例放在同一个位置.

4.InputManager(输入管理器)

在坦克大战游戏中,两个坦克分别通过WASD和上下左右键来控制前进后退以及左右旋转.在Unity中,WASD和上左下右一一对应,也就是按W和上是相同的效果,原因如下图:

这里写图片描述
这里,我们要将WASD和上下左右分别控制两个坦克,因此需要自定义Axes.
Edit->ProjectSetting->Input,打开InputManager,对于Horizontal,新建HorizontalPlayer1和HorizontalPlayer2,对应坦克1和坦克2在左右旋转上的按键输入控制,设置如下图:

这里写图片描述
这样AD控制坦克1,左右控制坦克2,对于Vertical,重复以上类似操作即可.

using UnityEngine;
using System.Collections;

public class TankMovement : MonoBehaviour {

    public float speed = 5.0f;

    public float angularSpeed = 10;

    public int playerNum = 1;

    private Rigidbody rigidbody;


    void Start () {
        rigidbody = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float v = Input.GetAxis("VerticalPlayer" + playerNum);
        rigidbody.velocity = transform.forward * v * speed;

        float h = Input.GetAxis("HorizontalPlayer" + playerNum);
        rigidbody.angularVelocity = transform.up * h * angularSpeed;     
    }
}

通过以上代码即可控制坦克的前进后退,以及左右旋转,这里用playerNum来判断是坦克1还是坦克2,playerNum的值在编辑器里设置.而且利用v和h变量,来控制坦克移动旋转的进行和停止.

5.Audio(音频)

1.AudioListener:音频接收者组件,一般挂载在摄像机或者玩家身上;
2.AudioSource:音频源组件,放置在需要播放声音的物体上;
3.AudioClip:音频源文件类;

使用方法:
1.在脚本中,建立一个public的Audio类,并在编辑器中将音频文件拖拉赋值,然后在脚本中可以如下播放:

using UnityEngine;
using System.Collections;

public class TankAttack : MonoBehaviour {

    public GameObject shellPrefab;

    public KeyCode fireKey = KeyCode.Space;

    private Transform firePosition;

    public float shellSpeed = 10.0f;

    public AudioClip shootAudio;

    void Start () {
        firePosition = transform.Find("FirePosition");
    }

    // Update is called once per frame
    void Update () {
        if(Input.GetKeyDown(fireKey))
        {
            AudioSource.PlayClipAtPoint(shootAudio, transform.position);
            ...
        }
    }
}

如上,使用AudioSource.PlayClipAtPoint播放音乐,参数分别为音频文件类实例和播放的位置;

2.同1,但在脚本中,额外增加一个private AudioSource实例,在播放时,用AudioSource实例播放具体的音频文件实例,如下:

using UnityEngine;
using System.Collections;

public class TankMovement : MonoBehaviour {

    ...

    private Rigidbody rigidbody;

    public AudioClip idleAudio;

    public AudioClip drivingAudio;

    private AudioSource audio;

    // Use this for initialization
    void Start () {
        rigidbody = GetComponent<Rigidbody>();
        audio = GetComponent("AudioSource") as AudioSource;
    }

    // Update is called once per frame
    void Update () {

    }

    void FixedUpdate()
    {
        ...

        if (Mathf.Abs(h) > 0.1f || Mathf.Abs(v) > 0.1f)
        {
            audio.clip = drivingAudio;
        }
        else
        {
            audio.clip = idleAudio;
        }

        if(audio.isPlaying == false)
        {
            audio.Play();
        }

    }
}

上述代码是坦克在不动和运动时的声音播放切换,因为Update调用频率很高,为了避免声音重复播放,使用

if(audio.isPlaying == false)
{
   audio.Play();
}

避免重复的播放;声音的切换只需要对AudioSource实例的clip成员变量进行赋值即可!

两者的区别:
(1)对于第2种方法,存在一个问题,就是播放音频是需要时间的,如果在播放的同一时刻,所挂载的GameObject被销毁,声音也就无法继续播放,此时就只能使用第1中方法;
(2)第2种方法适合根据不同状态,对多个声音的切换播放.

注:背景音乐的播放,一般是游戏开始就自动播放的,这需要将AudioSource的Play On Awake选项进行勾选,不然无法自动播放;
这里写图片描述

总结

初学Unity,很多内容都是跟着教程走的,上面的总结难免会有考虑不充分或者错误的地方,还望指出~

2013-07-07 22:50:40 gxrsprite 阅读数 3314
  • Unity 值得看的500+ 技术内容列表

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

CharacterMotor,FPSInputController,MouseOrbit,PlatformInputController,SmoothFollow,SmoothLookAt,ThirdPersonCamera,ThirdPersonController

http://pan.baidu.com/share/link?shareid=2102756824&uk=2701734937

2015-09-22 13:36:22 HZGJF 阅读数 2880
  • Unity 值得看的500+ 技术内容列表

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

3d程序使用VC+OpenGL写太累,一直想找一个3d游戏引擎来写,直到看到了Unity3d...

Unity3d是一个跨平台的游戏引擎,不仅支持windows,还支持ios、Android、flash等,所见即所得设计,功能十分强大。更令人激动的是支持C#和JavaScript脚本。

于是,又用Unity3d写了一遍,过程和WebGL一样,看看效果:


1、先在scene中放个球,加上地图贴图,再加上旋转缩放平移代码



2、在球上贴上云图



3、给云图加上调色板



4、加上凹凸效果


2014-11-05 00:40:15 Blues1021 阅读数 26425
  • Unity 值得看的500+ 技术内容列表

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

Unity中的JS,也称UnityScript,和基于浏览器的JS有比较大的区别,因为UnityScript是基于Mono的.net 的IL语言规范,CLR运行环境(Mono虚拟机)上设计的语言。

0.基本概念

Unity3d中的脚本可以与游戏对象链接,变量数值的修改以及实时预览脚本修改后的游戏效果,节省了很多脚本调整和调试的时间,提高了开发效率。

简单的项目和Unity中的大量例子和脚本资源包都是用JS。商业项目基本都用C#,因为C#和C/C++交互方便,丰富的数据结构和面向对象的架构利于大型程序的编写,很多强大的第三方插件是用C#开发的,方便工作流程。

编译过程:

UnityScript运行环境使用Mono  的.NET Framework。实际上,UnityScript是用Boo实现的,Boo是运行在Mono虚拟机上的一种语言,并且编译成本机代码。JavasScript很多典型的运行环境如String和Math库由Mono提供。你也就知道了为什么UnityScript中方法名要大写了,因为要与Mono中相同。

Unity中的脚本和传统的解释型(JIT解释)语言不同,都是需要经过编译的,因此速度都一样快。

这三种语言的代码最后都会被编译执行,而且脚本可以互相访问

库的调用:

Unity的脚本基于Mono的.net平台上运行,脚本都可以使用.net库,为xml,数据库,正则表达式提供了良好的解决方案。

Unity中js想调用mono的.net库,直接import即可。

import System;

import System.IO;

否则,你带指定完整的命名空间来调用函数,如System.IO.File.Open(),而不是File.Open()。

 

1.基本类型和语句:

1)数据类型

数值类型:char,byte,sbyte;short, ushort, int, uint, long, ulong; float,double; decimal.

布尔值:boolean

字符串:String,[index]符号

字符串[0]是字符串取下标为0的字符。

var s: String = "Whatever_it_may_be";

s =s.Replace("_"[0], " "[0]); // replace all the underscoreswith spaces

2)变量声明:

变量必须先声明[必须](编译缘故,且声明类型有利于减少太多常量,避免内存泄露发生),可以定义类型[可选]:

var playerName:String;

函数的参数也要声明类型:

function Test( playerName:String, baseInfo:Object )

{

}

如果声明时候定义或赋值了类型,那么不能再改变类型,除非声明时候不定义类型。

var a= "test";

a =5;// 报错


var a;

a ="test";

a =5;//正确

变量前面可以加public,protected, private来修饰;不写默认是public的,public的变量可以在Inspector视图中查看和编辑。

3)数组:

内建自定义数组(快功能简单):

var values : int[] = {1,2,3};

转换到Array数组(需要对数组处理),var arr = new Array(values);

Array对象数组(慢动态增长排序合并功能):

var arr = new Array(); arr.Push("good");

转换到内建数组(需要比较高的性能时候),var bArray : int[] = arr.ToBuiltin(int);

4)链表和泛型:

UnityScript可以使用泛型,所以当用到动态大小的数组时,最好用List来替代Array。基本上就没有什么理由要用到Array了,List更快并且功能更多。如果你需要混合类型的数组,你可以用Object List。UnityScript中泛型的语法与C#中接近,除了要加一个额外的“.”符号在“<>”之前。如C#中的"varmyList = new List<int>();"在UnityScript中对应的写法为:"var myList = new List.<int>();"。

5)运算符和表达式:

和C一样。

6)语句:

每行必须写分号; 比C多了for in 用于遍历对象元素,for(var i:int = 0; i < 10; i++)。

switch可以使用String变量。


2.函数

声明规则:

function函数名(参数1:参数类型, 参数2:参数类型...):返回值类型

{

}

unityScript中的函数可以视为Function类型对象,可以像变量一样进行赋值比较等操作。

 

不能写匿名函数。

Math需要用Mathf。


3.类(DOM js中没有类):

在Unity里,一个js文件就是一个类,unity引擎会为js文件自动生成一个类。

对于UnityScript脚本,Unity编译该文件时会自动的为脚本添加一个与脚本文件名相同的类,并自动地继承于MonoBehaviour。但对于C#或Boo,则需要在脚本中显式的写出类名和继承关系。要创建不继承自MonoBehaviour的类,用C#语言,或者从外部添加js脚本资源(就可以自己直接new对象出来了)。

//SayHello.js

#pragma strict // 严格类型检测,尽早生成错误,禁用动态类型,强制用静态类型(强类型)

function sayHello()

{

}

等价于C#中:

#pragma strict

public class SayHello extends MonoBehaviour

{

  function sayHello()

    {

    }

}

但是,你可以在同一个文件中声明多个类,尤其是当你需要使用一些辅助工具类时非常有用,一般这种辅助类没有继承自MonoBehaviour。

class ButtonState {

  var currentState : int;

  var offset : Vector2;

}

如果你在一个文件中声明了MonoBehaviour的子类,但类名与文件名不匹配的话,即使是大小写不一致,你也会碰到麻烦。

一定要理解,当你在js文件中编写行为脚本是,你实际上在编写一个类:

a) 类及其对象:文件名就是类名,如果文件名是foo.js,你就可以在其他地方以var x = new foo()的格式进行调用;

b)类的方法和预定义方法有一些特定的方法是实现系统预先定义的一些事件处理器,如Start、FixedUpdate等。任何事件中,声明的一个函数就是这个文件所代表的类的一个方法。

c) 类的属性:文件中在函数定义之外编写的代码都在该类的范围之内执行,声明的变量也是该类的成员变量。类中的静态函数、变量本质上是类的方法与属性

实例:

/*whenyou drag the behavior onto a gameobject, these values will be visible andeditable

*/

public name : String;

 

/*otherscripts which have a reference to this object (e.g. if they're attached to thesame object) can see public functions

*/

publicage : int;

 

/*privatemembers are NOT visible to other scripts, even if they have a reference to thisobject

*/

private favoriteColor : Color;

 

/*youcan assign a value to bestFriend by dragging a gameObject with an attached copyof the foo behavior to this property. This will give you access to bestFriend'spublic methods and members

*/

public bestFriend : foo;

 

/*this function will be called every frame by Unity, so it's actually an eventhandler

*/

function Update(){

 

 /*transform is a property inherited from thegameObject the behavior is attached to*/

var t = transform;

 }

 

function Bar(){

  // this is just a function, if you don't callit yourself, it will never do anything

}

 

4.继承

Unity里需要extends关键字:

class MyHello extends Hello

{

}

DOM js中用prototype里的bind()方法。

Unityjs里面还提供了虚拟函数。

 

类的继承也是不同的。在JavaScript和C#中,方法是隐型并且不可重载,除非方法声明中添加虚拟关键字。不同的是C#只重载那些包含重载关键字override的方法。而JavaScript不需要关键词,只要重载类方法就可以覆盖,其它的都可继承得到。

//Foo.js

var foo = "hello, world";

 

function doEet () {

  // does nothing, intended to be overridden

}

将会生成:

//Foo.js

import UnityEngine;

classFoo extends MonoBehaviour {

  public var foo = "hello, world";

 

  public function doEet () {

    // does nothing, intended to be overridden

  }

}

 

子类写法:

//PrintingFoo.js

class PrintingFoo extends Foo {

   function doEet() {

    print( foo );

  }

}

创建虚函数

classFoo

{

     virtual function DoSomething ()

     {

         Debug.Log("from baseclass");

     }

}

//SubFoo.js

class SubFoo extends Foo

{

     virtual function DoSomething()

     {

          Debug.Log("from subclass");

     }

}

//Elsewhere

varfoo : Foo = new SubFoo();

foo.DoSomething();//printsfrom sub class

如果你要调用父类的方法,用关键字super。示例如下:

class SubFoo extends Foo

{

  virtual function DoSomething()

  {

    super.DoSomething();// 不是虚函数,应该不需要super修饰就可以直接调用。

    Debug.Log("from sub class");

  }

}

//Elsewhere

varfoo : Foo = new SubFoo();

foo.DoSomething();//prints"from base class" and "from sub class"

类间通信:Use-a方式(关联关系)比继承耦合度底得多,易于修改维护

/*Foo.js */

varbar : Bar;

function Start(){

  bar = gameObject.GetComponent(Bar);

}

function doEet(){

  // do my own thing

  if( bar ){

    bar.doEet();

  }

}

/*Bar.js */

  function doEet(){

    // do something special

  }


5.对象

Unity中不一定可以用new 创建对象(普通类可以,特殊类不行,各种脚本都一样)。特殊类:用编辑器工程视图右键或者组件Create js 或者C#的类都是继承自MonoBehaviour类,对这种类型的类不能new出来一个对象,原因是Unity会为这种类自动创建对象,并调用被重载的方法。 

使得用Unity非常有趣的一件事是,它的类采用了非常自由的mixin策略。通常你可以非常快速简单的查到你所需要的类。最通用的一个例子是Transform类,对于你正在处理的一个对象,所有被附加到该对象的相关联的类,都可以简单快速的获取它的属性和方法。

比如,典型的动作就是你会访问名叫"transform"的变量,它代表与该对象关联的Transform类的实例。如果你需要相关的位置坐标,就访问transform.position(一个 Vector3对象);如果你需要它的GameObject,就访问transform.gameObject;如果你需要它的渲染器,就访问transform.renderer。等等。一般如果你一个对象的主要属性,你就可以快速获取该对象所有其他的属性。

 

6.js和C#单向通信,不能双向通信,因为编译问题

js访问C#脚本组件:

//createa variable to access the C# script

private var csScript : CSharp1;

function Awake()

{

    //Get the CSharp Script

    csScript =this.GetComponent("CSharp1");//Don't forget to place the 'CSharp1'file inside the 'Standard Assets' folder

}

   

//rendertext and other GUI elements to the screen

function OnGUI()

{

    //render the CSharp1 'message' variable

    GUI.Label(new Rect(10,30,500,20),csScript.message);

}

C#访问js脚本组件:

using UnityEngine;

using System.Collections;

public class CSharp2 : MonoBehaviour

{

    //create a variable to access the JavaScriptscript

    private JS1 jsScript;

    void Awake()

    {

        //Get the JavaScript component

        jsScript = this.GetComponent<JS1>();//Don'tforget to place the 'JS1' file inside the 'Standard Assets' folder

    }

    //render text and other GUI elements to thescreen

    void OnGUI()

    {

        //render the JS1 'message' variable

        GUI.Label(newRect(10,10,300,20),jsScript.message);

    }

}

 

7.使用第三方库:

第三方.NET库如XML-RPC可以以新建资源Asset的方式引入。

 

8.调试

可以用print函数,Log()函数或者Debug.Log(),想设置断点,用Debug.Break()函数。

print() 函数将会生成消息,并输出到状态栏及控制台中,但仅限MonoBehavioour类范围内。

更好的办法是使用Debug.Log("insert messagehere");,该方法到处都可使用。还可用Debug.LogWarning 和 Debug.LogError生成警告和错误消息。

Debug.Break(); 可以将游戏暂停在一个精确的点。当一种特定的情条件发生时,如果你想检查对象的状态的时候,这个特性非常有用。

开发环境运行项目时,编辑界面也是完全实时更新的,你可以查看对象实例的内部状态。


参考整理自:

http://www.cnblogs.com/x3d/p/3838619.html

更多的细节:阅读和编写大量unityScript代码。

Unity3D之路

阅读数 518

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