您的位置:首页 > 移动开发 > Unity3D

Unity3D一些注意知识点总结

2013-12-17 16:45 375 查看
难查错误

C#引用传递和值传递并不明确,要仔细辨别

C#中集合类只传引用,一旦在函数内部修改了,全局都会改变

常用脚本命令

Application.LoadLevel

Application.Quit

Application.targetFrameRate 使程序保持在一个固定帧率运行

Input.mousePosition

transform.translate

Matrix4x4.identity 单位矩阵

Quaternion.identity 单位四元数

gameObject.name

gameObject.FindChild

gameObeject.Getcomponent<类型>() 取得对应对象中的指定类型,可用于跨脚本函数调用

gameObject.renderer.enable控制物体可见与否

gameObject.SetActive控制对象以及下面所有子对象是否启用

NowGameObject=(GameObject)Instantiate(YourObject)复制相应对象

Destroy从内存中销毁除引用对象本身的克隆,销毁后脚本中未执行的程序段会继续执行,但是协程会立刻终止,所以Destroy前要把Destroy的物体SetActive为false

Resource.Load

Resource.UnloadusedAssets(将引用全部赋值为null后)从内存中销毁不用的引用资源

camera.ScreenToWorldPoint 制作可以拖动等的NGUI元素用的坐标转换

collider.bounds.Contains(Vector3) 可以检测一个点是否在collider内

一个可以在Inspector面板里显示的自定义类,Inspector面板不会显示自定义struct,所以只能用类

[Serializable]

public class Point

{

public Color color;

public Vector3 offset;

}

1.不要把太多东西放在Update里面,可以SendMessage或者用C#自带的delegate以提高效率

2.加载外部资源要用WWW,场景间的数据传递可以用PlayerPrefs.Set 和Get系列函数

选择一个物体的父对象可以用transform.parent

3.鼠标的0点从屏幕左下角开始

4.当一个物体有了collider之后就可以检测鼠标的动作

可以触发OnMouseEnter,OnMouseOver,OnMouseExit

5.鼠标在屏幕上的坐标相对于摄像头的射线

ray = Camera.main.ScreenPointToRay(Input.mousePosition);

6.射线与路径上的collider的碰撞检测

返回第一个用Physics.Raycast

返回多个用

RaycastHit[] hits;

hits = Physics.RaycastAll(transform.position, transform.forward, 100.0F);

射线碰到的物体数量为hits.length

7.物体加刚体的时候要使用重力才会不到处乱飘,但使用重力前为防止出现意外,要注意物体初始高度要贴在地面上

刚体的碰撞运动可以限制旋转和位移

速度快的碰撞修改collision detect模式可以改善穿过bug

8.物体加了刚体(rigidbody)和collider之后才会与别的具有collider的物体发生碰撞

可以触发OnCollisionExit,OnCollisionStay,OnCollisionEnter

9.collider的isTrigger打勾之后物体将不会被碰撞而可以穿过

可以触发OnTriggerEnter,OnTriggerStay,OnTriggerExit

刚体撞墙抖动是因为直接修改了transform,如果不修改而用rigidbody.velocity的话就不会撞墙抖动了

10.多线程用

using System.Threading;

带参数开线程

ThreadStart starter=delegate {带参函数}

new Thread(starter).Start();

11.大数据传值用引用,小数据可以传值

12.改不了的子数据可以赋值整个给一个临时变量,然后修改后再赋值回去

13.C# GUI.Button(new Rect(),此处可以是文字或者一张图片);

14.一个可输入的GUI输入框str=GUI.TextField(new Rect(),str)

15.跨脚本调用可用static静态变量

17.旧的动画系统用animation.crossfade有过渡,直接播放用animation.play

18.新的动画系统mecanim要设置正确的avatar和动画控制器和状态机

脚本中修改状态机中的控制参数用

Animator animator;

animator.Getbool Setbool Getfloat Setfloat等等

用脚本控制物体的transform时最好吧Animator控件中的Apply Root Motion关了

关了后要注意RigidBody控件里面Drag设置为Infinity,不然遇到碰撞会乱飘

19.静止的物体产生阴影可以用lightmap,记住要改lightmap static

人物底下实时阴影性能行的话开灯光阴影,不行的话假影子一团黑

unity3d的lightmap烘培后直接就是所有灯光的效果

由于没有灯光,人物要表现的受到灯光效果可以用light probe,小球球很难弄,但是相对来说性能好一点吧,大概

20.专业版有性能分析器 profiler,还有occlusion culling和静态Batching,对优化有一定的作用

21.Navmesh Agent里面的BaseOffset注意设置一下,不然寻路时可能会出现高度问题

Navmesh和Character Controller有些冲突,最好是一个打开另一个就关闭

22.Unity Remote有安卓版和iOS版,可以直接在手机上调试

但是要先在手机上开APP,电脑里再开Unity3D才能保证连接

23.动态Batching部分平台需要自行在player setting里面打勾

24.unity3d现在自带iOS的GameCenter功能和iAd功能,在Social和AdBannerView里面

25.本地保存文件最好用Application.persistentDataPath+'"//"+name的地址,以防在iOS设备上弄出错误

26.有个Animation窗口,可以修改导入的Animation的,而且可以支持正负180度范围之外的旋转,并且可以x,y,z三轴采用完全不同的动画曲线

27.新动画系统的transition的动画混合部分不设置ExitTime的话混合会从任意位置开始,如果要从指定位置开始,记得设置

28.新动画系统播放指定动画Animator.Play("state",0,0.0),第一个参数为状态名称,第二个为状态层级,第三个为播放起始位置

29.判断攻击作用可以用RaycastHit[] RaycastAll(Vector3 origin, Vector3 direction,
float distance =
Mathf.Infinity, int layermask =
DefaultRaycastLayers);要注意的就是第二个是direction而不是to,所以StartPos->EndPos应该是...(StartPos,EndPos-StartPos,...);

30.导入maya的模型可能会很卡的原因是因为有个motionsystem,不能直接在mb文件里面删,请导出fbx后再导入maya并删除至仅剩deformationsystem和模型面片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: