首页 > 技术文章 > Unity3D知识点

shihui142857 2013-07-12 01:23 原文

世界空间(World):整个虚拟世界的3d空间,在Unity3d中以米作为单位,如长100米宽100米高100米的立体空间。

屏幕空间(Screen):屏幕2d空间,大小就是屏幕的大小,以像素作为单位,可以设定屏幕大小,0点在左上角,向右为x正向,向下为y正向。

视口空间(Viewport):摄像机的显示范围空间,x介于0-1,y介于0-1的2d空间,0点在左下脚,(1,1)点在右上角。世界空间坐标常常需要转换到视口空间,然后转换到屏幕空间。

 

Unity3D的坑:在C#脚本中创建了枚举类型后,如果你已经在物体的脚本上指定了不同的枚举类型,此时你打乱枚举类型中变量次序,或者把新建类型放在最前面,那么你之前指定的类型全部乱了,必须恢复顺序。

 

Application.LoadLevel,该函数在加载关卡时不会重置已存在的静态变量的值,需要手动重置

Destroy,使用这个销毁对象的函数时,注意参数不是"类的对象",应该是"对象名.GameObject",否则场景中物体不会消失

DontDestroyOnLoad(GameObject obj),这个函数最好放在静态构造函数中,这样就只会执行一次;或者loading界面执行;或者用代码来创建物体并挂载脚本。

WorldToScreenPoint,使用这个函数可以进行场景3D与屏幕2D的坐标转换,相反的是camera.screenToWorldPoint

StartCoroutine,用于启动一个协程,与主线程一起执行,貌似多线程,实际上是CPU分时的单线程,性能不是太好。但是,它有时用起来很方便,相当于在Update里启动一个计时器函数,可以防止界面卡死。

Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.W),同时按下多个键 ,常用于实现人物奔跑效果

GetKey:按键按下期间返回true

GetKeyDown:按键按下的第一帧返回true

GetKeyUp:按键松开的第一帧返回true

GetAxis("Horizontal")和GetAxis("Vertical"):用方向键或WSAD来模拟-1到1的平滑输入

退格键:backspace;回车键:return;退出键:esc;后面是按键名,例如, Input.GetKey("up"), Input.GetKey("esc")

 

Unity3D使用GUI或者GUILayout时,如果用代码动态创建对象,可能会出现画面闪烁问题。我通常的解决办法是,看看哪些变量在其中被改变了,找到它们,尽量不要改变即可。

GuiText始终会被放置在顶层,如果你不想这样显示,但又需要程序文字,建议使用3DText,把scale调小,把font size调大即可。 

 

如果需要NGUI支持Android电视的空鼠,可以打开UICamera脚本,找到Awake函数, 把useMouse改为true,useTouch改为false

Android盒子遥控器按键:

Up Arrow          KeyCode.UpArrow
Down Arrow      KeyCode.DownArrow
Left Arrow         KeyCode.LeftArrow
Right Arrow       KeyCode.DownArrow
Center Button    KeyCode.JoystickButton0
Back button       KeyCode.Escape
Menu Button      KeyCode.Menu

 

Unity3D中要想脚本中变量在编辑器中显示,需要满足以下要求:变量必须被public修饰,不能使用[HideInInspector]修饰,变量的类型必须继承自MonoBehaviour。如果想把某个脚本挂在GameObject上,该脚本必须继承自MonoBehaviour,否则根本看不到该脚本。

 

Unity3D Asset Store 下载的文件保存位置 C:\Users\sh\AppData\Roaming\Unity\Asset Store。

 

Unity3D对C#仅提供有限的支持,在Player Settings中可以看到目前为.Net 2.0 Subset。所以在编写C#脚本时,可能无法对某些C#特性提供支持,出现一些奇怪的现象。比如无法修改单实例对象,常常需要把变量改为static类型才可以修改成功。

 

使用Android插件与外置硬件设备交互时,我遇到过数据读取的错误,这里可能需要对AndroidManifest.xml配置文件做如下修改:

<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />

 

如果在Unity中使用了Android插件,那么需要修改AndroidManifest.xml文件,主要改package和activity中的name,例如android:name=".MainActivity"。

 

在使用UnityPlayer.UnitySendMessage("gameobject", "functionname", result)这个函数时,有一点需要注意:第三个参数result中不能包含特殊字符,否则整个字符串传递到Unity游戏中都会为空。比如,在Android开发中,我先把"00"这个16进制字符串转换为了char字符,然后append到了一个StringBuilder字符串中,最后传递这个字符串到Unity中,收到的值总是为空,且无论原来这个字符串是什么。

 

推荐阅读