admin管理员组

文章数量:1566352

 

1. Unity编辑器:

切换到书中的页面的时候点击window. Layouts, 选择2 by3; 这样就会还原成书中的页面

2. 在asset_store上可以下载一些模板资源,. Ctrl+9就可以切换, 也可以通过打开window, asset_store来打开这个页面.

4. 操作Scene视图, 选中手型工具, 然后按住alt键可以任意的切换视角.不按住alt的话只能是平移视图. 按下鼠标右键的话, 就可以放大或者缩小视图. 不过这个的话, 用鼠标轮更加方便. 选择手型工具的快捷键是Q. 其实后面的也是依次按照键盘顺序来排列的, QWERT这样.

5. 选中W, 可以移动一个物体. 但是不要在play模式的时候改变.

6. 一个物体是static的意思就是说这个物体在游戏中时静止的, 这样的话可以减少drawcall. 也就是说不用过多的绘制.

7. 选中E 的时候也就是说旋转的时候, 是可以选中一个物体之后进行任意角度的旋转的,

8. 选中R 之后, 这个的功能是缩放, 也就是说任意一个物体都可以进行一定程度的缩放. 可以选择在三个轴上进行缩放/。 也可以选中中间的矩形块, 在三个方向同时进行缩放.

9. 选中T. 这个的功能是矩形缩放. 按住shift之后可以进行等比例缩放.

10. Pivot和center的区别是, 如果是pivot话, 因为按住ctrl键是可以同时选中多个物体的. 如果这时候是center的话就是以所有选中的物体的整体中心为中心, 一般用于多个物体移动, 如果是pivot的话. 就是以最后一个选择的物体的中心为三维坐标的中心. 两种都可以用作多个物体的移动.

11. 在play状态中切换回静止状态的时.页面又会还原.

12. 点击左上角的file, build_settings 然后选择发布的平台 . 点击弹出的框右上角的一个add current或者是add open scenes 然后点击build, 就会生成一个对应的可执行文件,例如, 如果是电脑的话就会生成一个exe,. 双击这个exe文件之后经过一些设置就可以运行了.  然后就会出现一个可以运行的画面, 可以通过WASD 控制行进的方向. 用上下左右也可以.

13. 在project视图的搜索中, 也可以搜索来自asset_store里面的资源. 点击对应得资源之后, 会在inspector中显示对应资源的信息, 可以点击import .

14. 修改一个物体的pivot可以通过创建一个空的物体, 把这个空的物体当成这个物体的容器, 然后在移动这个物体的时候, 那么这个时候在pivot模式下再去看外边这个空物体的pivot的时候就已经改变了, 但是在center模式下的时候. 实际上也就是说. Pivot模式的时候. 这个时候通过对外边容器的一些操作可以相当于改变了内部的物体的轴心进行操作.  虽然实际上并没有改变,

15. Global坐标和local坐标的区别在于, global坐标系是永远不会改变的, 而local坐标系是会随着自身的变化而发生改变的,  也就是说local状态下可以通过坐标看到这个物体现在的状态, 例如旋转了多少, 移动了多少. 根据local坐标系的某一个轴移动的话, 可能实际上相对于global坐标系来说的话, 是三个坐标系上都发生生了变化,

16. Use Gravity这个是控制是否受重力影响的, 去掉标记位的话就不受重力影响了.

17. 把C#脚本的代码拖到一个对印的物体上的话, 就把这个脚本的代码关联到这个物体上了, 就可以产生作用了. 右边的inspector就是一个物体他所拥有的属性,包括脚本代码,, 位置, 大小, 旋转等等.

18. 在游戏play的时候我们也可以改变物体的属性,位置等等, 但是这些都只在游戏运行的时候生效. 最终都是不保存的, 也就是说play模式结束的时候一切都回到原样了.

19. 在播放模式的下一个就是逐帧模式, 每点击一次才会发生物体的变化,

20. Layer层就是控制一个页面上的一些分类的物体是否显示,

21. 在scene中如果是选择了wire frame的话. 就会显示所有物体的一个线条模式.

22. 删除一个物体之后, 还可以通过ctrl+z撤销操作. 这个删除可以在hierarchyview中删除, 也可以在edit中删除 .

23.  Hierarchyview中的元素和左边scene视图中的元素始终都是一一对应的,.

24. 快速定位到一个物体. 双击. 或者是选中它, 然后在鼠标放到scene场景中,按F, 这里F 的意思是focus.

25. Rigid body 刚体. Collider 碰撞.

26. 通过layer可以把某一个物体添加进某一层

27. 给一个物体添加脚本有两种方式, 一种是直接在inspector中new script and add. 一种是创建一个脚本, 然后把这个脚本放到这个物体的下面就好了.

28. Cube是一个立方体. Sphere 是一个球.

29. 选中一个物体, 按ctrl+d就会又创建一个.. 这个时候要区分的话, 可以通过给每一个物体添加一个tag. 就好了, 可以创建自定义的tag.. 在找这些物体的时候会通过一个findwithtag, 或者是findgameobjectswithtag, 但是这个的话是只能返回时active的. Active的也就是会显示的.

30. 给一个物体添加一个rigid body 刚体的意思是说, 让这个物体可以受力的作用. 可以碰撞, 可以受外力作用, 可以摩擦,等等…

31. Transform.translate(Vector3.up*Time.deltaTime); 其中这个移动默认是按照自己的坐标系来向上运动的. 可以在方法中添加一个Space.world. 表示就是说参照世界坐标系. 如果是通过position+= 来实现的话, 后面的参数类型都是float的.

32. Transform.rotate(); 通过这个方法可以设置一个物体的旋转. 按照哪个坐标来旋转. 旋转的速率,等等. 也是一样的需要指明是space.self还是world.

33. Fixedupdate()方法是固定时间间隔的, update() 方法不是固定时间间隔的.

34. 可以通过startCorotinue(方法) 来启动一个定时任务, 似乎是可以这么理解的, 下面会有一个yield  return new WaitForSeconds(Time); 这个的意思就是一段时间之后, 再执行下面的代码, 相当于java中的Thread.sleep(time); 或者是相当于android中的SystemClock.sleep(time); 然后通过一个递归达到无限执行的效果.  方法中写自己要执行的逻辑.

35. 物体的移动的话, 实际上也就是在update或者是fixedupdate方法中不停地去刷新在X,Y,Z轴上的坐标值.

36. Transform.position这个值是通过get方法获取到的一个copy, 这个是不能修改的. 如果要修改transform.position的话应该是用一个临时变量来记录一下, 然后修改对应的属性之后再设置回去.

37. 问题一: set方法不起效果. 因为都说过了, transform.position 只是一个copy而已. 改变这个是没有任何意义的, 必修要再设置回去才行.

39. Editor 选中project settings, 用来设置一个键的功能, 例如, 开火

40. Update方法在unity中是每一帧都会调用这个方法, 一分钟有64帧. 也就是说这个方法一分钟会调用64次.

41. 通过Input.getMouseButton(int num).可以获取到在游戏运行的时候, 用户按下了什么键. 0代表按下鼠标左键, 1代表按下鼠标右键, 2代表按下鼠标中键, 也就是那个滚轮.

42. Debug.Log() 用作debug调试.

44. Unity的资源可以导入导出, 就通过inport package 和export package 就可以了. 没有什么问题.

45. 游戏物体组成了游戏场景, 游戏物体又由游戏组件组成. 游戏场景的区分可以使一个游戏具有多个关卡, 这样的话可以减少每个场景载入的时间. 也可以进行每个场景的单独测试.

46. 一个物体如果放置在另一个物体之下的话, 那么他的世界坐标的原点就是父容器的中心, 以父容器的原点的0,0,0; 也可以说一个物体如果没有父容器的话, 那么他的父容器就是世界, 所以说任何一个物体的坐标都是基于父容器的坐标原点.

47. 创建一个cube, 他的默认大小长宽高都是1米.在坐标系的下面, 有两个视图方式, 一个是persp 一个是ISO. 不同的视图效果也是不一样的. ISO下鼠标右键用来旋转视野.. 围绕焦点.Persp下也是用来旋转视野, 但是是围绕当前视野. 而不是围绕焦点了. 鼠标左键用来选择游戏物体. 鼠标中键是用来平移视野的.在 Persp模式下要围绕焦点旋转视野的话应该是选择最左边的手势,然后按下alt, 然后左键拖动就可以了, 当然前提肯定是选择了这个物体.

48. 在坐标中, X轴代表左右, 右边为正. Y轴代表上下, 上边为正. Z轴代表前后. 纵深往里为正.

49. Prefab 预设, 用于创建大量的重复性的物体

50. 在Unity中一个script脚本的名字只能出现一次. 不能有重复的, 不然会报错.

51. 千万注意了,代码这些东西是只能在运行状态下才可以使用.例如按下哪个鼠标键, 例如按下点击, 之类的, 都是只有这时候才是有效的, 点击上面的scene’是没有任何效果的

52. 在Unity内部创建资源主要就是在Asset目录下的create中. 创建好之后最好先新建一些对应的文件夹, 然后把里面的组件添加到物体中.

53. Unity中最常用的就是模型和角色..unity视窗中的Asset对应的目录就是asset的目录. 所以直接在电脑中的asset目录下添加的东西也会直接在unity视图中的asset中展示出来

54. Unity中显示导入3D 模型. 其中模型的来源有如:

1. 直接使用3D模型工具本身自带的格式输出,然后保存到Unity的Asset目录下.

2. 再3D模型工具中, 用FBX 等插件进行导出, 然后保存到Unity的Asset目录下

55. Ctrl+shift+c可以显示console 控制台;

56. 如果说脚本中出现一些过时的方法的话, 其实也还是可以运行的,

57. 切割Sprite完毕之后, 在asset目录下一开始是不会有的, 然后点击右边的一个键,就可以看到切割出来的所有的sprite了.

58. Unity中有标准的资源库. 通过Asset--import package—environment 来操作

59. 在导入标准资源库之后, 可以在 game object中创建一个terrain 地面.通过在inspector 视图中设置一下, 可以将地形的高度抬升. 注意如果没有效果的话, 就把高度设大一点.

60. 添加草的时候需要注意的一点是, 要设置target_strength.这个的值不可以为0.

61. 在HierarchyView中通过F2键可以改名. 添加水的话, 也是很简单的. 之间把导入的标准资源库中的waterbasic daytime或者是waterbasicnighttime的资源直接拖动到scene视图中的池子中去, 然后调节大小,高度. 就可以了.

62. 导入的house资源, 直接拖到scene视图中就可以了;

63. 添加一个firstpersoncharacter之后.默认下面就是带了一个main camera的.

64. 取消选中mesh renderer 的话就会不会被渲染出来, 也就是说根本看不见了.

65. 声音也是作为一个物体放在scene视图中, 然后可以设置这个声音的覆盖范围, 当移动在这个范围之内的时候就会听到这个声音.

66. 2D游戏开发中, order in layer这个属性值越大的话就越往后渲染, 也就是说如果在前面渲染的话. 可能自己就被后面的图片给覆盖掉了.

67. 2D 中相机的最低视角就是修改position. 尺寸的话就是修改viewport的w和h两个属性

68. 一个物体如果是预设体的话, 在hierarchy 视图中字体会变成蓝色./ 把一个物体设置为prefabs 过程如下, 首先是就直接在scene视图中展示这个物体, 然后设置好这个物体的一些inspector的参数, 然后在assets 中创建一个prefabs文件夹, (如果不存在的话), 然后把这个物体从scene视图中拉到这个prefabs中, 就可以了, 然后这个物体就可复用了, 同时他的参数配置依然是以前保存的那样.

69. 在选中edge collider 2D 组件之后. 点击edit collider 然后会出现一条绿色的线. 这条线是可以拖动的, 有一个可以滑动的位置, 从这个位置往外伸的话就会拉出另一条线.

70. 在给一个空的物体创建一个box collider 2D 的时候会需要设置这个物体的宽和高, offset属性的意思就是偏离锚点的量.

71. 与mesh相关的组件有mesh filter,  mesh renderer,  text mesh, 和skinned mesh renderer.

72. Particle System 粒子系统. 组件用语创作烟雾, 气流,火焰, 瀑布, 喷泉, 涟漪等效果.

73. 给一个物体设置材质的办法是首先要新创建一个material. 在assets目录下创建一个material. 然后设置好材质颜色等等,然后直接把这个material拖到这个物体下就好了.

74. 利用Prefabs预设体代码实例化物体对象. 首先是要创建一个prefabs. 然后主要就是在C#代码中, 创建一个成员变量, 设置为public(只有这样,到时候才能够在视图的inspector中找到, 然后给这个变量赋予真正的prefabs). 然后代码中其实就一菊花. Instantiate(object, Vector3, Quaternion.identity); 第一个参数就是要实例化的那个成员变量, 第二个参数是初始化的位置. 第三个参数应该就是一个标志吧.;

75. 创建粒子系统有两种方法, 一种是直接在gameobject中创建一个particle system. 一种是先创建一个空的object, 然后add component 中选择effects, 选择particle system. 两种都可以. 创建火焰的时候可以先创建一个粒子系统.调好之后, 在创建一个point light拖动成为这个粒子的子对象. 把整个物体弄成一个预设体.以便重复使用. 粒子系统也是通过设置material来确定样式.

76. 可以通过给一个物体添加一个刚体, 取消掉重力, 然后设置一个constant force, 添加一个恒力. 在某一个或者几个方向上, 那么运行之后在这个方向上就会受力, 就会有加速度.

77. 有几个触发函数:

OnCollisionEnter(Collision col);这个是碰撞体进入的时候触发

OnCollisionStay(Collision col);这是碰撞体停留时触发

OnCollisionExit(Collision col) 这个是碰撞体离开时触发

OnTriggerEnter(Collider  col) ;这个是触发器进入时触发

OnTriggerStay(Collider  col) ;这个是触发器停留时触发

OnTriggerExit(Collider  col) ;这个是触发器离开时触发

78. 刚体中的参数介绍:

Mass: 表示质量,

Drag: 阻力 游戏对象受到的空气阻力.

Angular Drag: 角阻力, 当游戏对象旋转的时候受到的阻力, 如果角阻力很大的时候, 物体会立即停止旋转.

Use gravity : 是否受重力作用;

Is Kinematic 是否开启动力学. 若开启这一项的话, 游戏对象就不再受物理引擎的影响从而只能通过transform 属性来对其操作.

Interpolate : 插值, 用于控制刚体运动的抖动情况. 有三个选项:

None: 没有插值

Interpolate 内插值, 基于前一帧的transform来平滑此次的transform

Extrapolate: 外插值. 基于下一帧的Transform 来平滑此次的transform

Collision Detection : 碰撞检测 有三个选项

Discrete: 离散碰撞检测: 这个是默认值

Continuous 连续碰撞检测;

Continuous Dynamic 连续动态碰撞检测;

Constraints: 约束, 用于对刚体运动的约束

Freeze Position 冻结位置, 刚体对象在世界坐标系上的X,Y,Z 上的移动将无效

Freeze Rotation 冻结旋转, 刚体在世界坐标系上的X,Y,Z 轴上的旋转无效

79. Character Controller 组件的属性面板: 有以下几种属性

Slope Limit: 坡度限制, 用于设置所控制的游戏对象只能爬上不大于这个数字的斜坡

Step offset: 用于设置所控制的游戏对象可以迈上的最大高度的台阶

Skin width: 皮肤厚度, 决定了两个碰撞体可以相互深入的深度. 较大的数值会产生抖动现象. 较小的数值会导致所控制的游戏对象被卡主, 合理的参数为Radius值得10%

Min Move Distance  最小移动距离, 如果移动的距离小于这个值得话,那么该游戏对象实际不会移动. 大多数情况下设置为0;

Center: 中心, 该参数决定了胶囊碰撞体与所控制的游戏对象的相对位置, 并不影响所控制的游戏对象的中心坐标;

Radius: 半径, 该参数用于设置碰撞体的半径.

Height: 高度, 该参数用于设置胶囊碰撞体的高度.

注意事项: 1.  Character Controller 不会对施加给他的作用力做出反应. 也不会作用于其他刚体..

如果想要 Character controller可以作用于其他的物体的话, 可以在脚本中调用OnControllerColliderHit() 这个函数”

注意事项: Character Controller 的Skin Width 这个属性很重要, 如果角色卡住了,通常都是因为skin width 的设置太小导致的.

 

80. Collider 碰撞体:

两个刚体物体相互撞在一起时, 必须要两个刚体都设置了碰撞体, 引擎才会计算碰撞, 否则的话就会穿过. 碰撞体有好几种类型:

1. Box Collider 盒子碰撞体;

属性值有以下:

l Edit Collider 点击可以编辑碰撞体

l Is Trigger  是否是触发器, 选中的话, 则该碰撞体可用于触发事件, 同时忽略物理碰撞. 也就是说会直接穿过去.

l Material 指的是编辑碰撞体的材质

l Center 中心, 碰撞体在对象局部坐标中的位置

l Size 大小, 碰撞体在X,Y,Z 轴上的大小;

2. Sphere Collider 球形碰撞体, 跟盒子碰撞体差不多, 不过球星碰撞体不能单独调节某一个坐标轴方向的大小;

3. Capsule Collider 胶囊碰撞体, 胶囊碰撞体由一个圆柱和与其相连的两个半球组成, Unity中的角色控制器通常都内嵌了胶囊碰撞体, 参数也和盒子差不多;

4. Mesh Collider 网格碰撞体, 网格碰撞体更加精细,但是更耗资源, 网格碰撞体可以和其他的普通碰撞体发生碰撞, 但是需要开启convex 参数后才可以与其他的网格碰撞体发生碰撞 而且需要注意的是, 网格碰撞体的三角形数量要小于255 的时候, convex参数才会生效,. . 属性如下:

l Convex 凸起. 若开启此项, 则网格碰撞体将会与其他的网格碰撞体发生碰撞

l Mesh 获取游戏对象的网格,并将其作为碰撞体.”

5. Wheel Collider 车轮碰撞体: 一般是针对于车辆的, 有内置的碰撞检测, 车轮物理系统和滑胎摩擦的参考体.  有以下属性

l Wheel Damping Rate: 车轮阻尼值

l Suspension Distance : 悬挂距离. 用于设置车轮碰撞体最大的伸长距离.

l Force App Point Distance: 力应用点的距离. 定义了车轮力作用点与车轮水平最低点的距离. 一般略低于车辆质量中心效果最好.

l Suspension Spring: 悬挂弹簧:

l Forward Friction : 向前摩擦力 又有三个子属性, Extremum Slip  滑动极值. Extremum value 极限值. Asymptote slip滑动渐进值. Stiffness 刚性因子: 是极限值与渐进值的乘数, 默认为1. 设置为0的时候将禁用所有的车轮摩擦. 通常会通过脚本去修改刚度来模拟各种地面材料

l Sideway Friction 侧向摩擦力, 当轮胎侧向滚动的时候的摩擦力属性, 他的子属性和forward friction 是一样的,.

6. Terrain Collider 地形碰撞体, 是基于地形构建的碰撞体. 有以下属性

l Material 材质. 决定了与其他碰撞体的交互形式

l Terrain data 地形数据. 决定了地形的外观,

l Enable Tree Collider 开启树的碰撞体. 开启的话就会启用树的碰撞体

81.  2D 碰撞体

1. Circle Collider 2D: 圆形碰撞体,

l Edit Collider 用于编辑碰撞体

l Material 跟上面都差不多

l Is Trigger 触发器. 启用的话就不会发生任何物理交互

l Used By Effects 是否使用物理效应器.

l Offset : 偏移, 碰撞体对象在对象局部中的位置

l Radius .碰撞体的半径

2. Box Collider 2D 矩形碰撞体. 用于给2D 游戏对象添加矩形碰撞体

l 参数和上面那个也差不多.

3. Edge Collider 2D 边缘碰撞体, 由一些自由绘制的边缘线构成. 可以很精确地适应各种形状的2D游戏对象.

4. Polygon Collider 2D. 多边形碰撞体, 也是一个很自由的绘制的碰撞体, 但是这个必须是一个封闭的区域, 和Edge Collider 2D 不一样. 多边形碰撞体通常会自动适应2D游戏对象的形状.

82. 布料组件 Cloth---(暂时不太好理解)

83. 关节组件 Joint

1. Hinge Joint 铰链关节由两个刚体组成,  会对两个刚体进行一定的约束.使得他们好像连在一起一样,  非常适用于对门, 时钟 等等的模拟. 有以下属性

l Connected Body. 连接刚体, 该项用于为关节指定要连接的刚体, 不指定的话就是与世界相连.

l Anchor : 锚点. 刚体围绕锚点进行摆动.可以说设置锚点的位置

l Auto Configure Connected Anchor 自动设置链接锚点.选中的话就会自动设置锚点, 默认选中

l Use Spring 使用弹簧.选中该项,则弹簧会使刚体

l Use Motor 使用发动机, 使用发动机会使对象发生旋转

l Motor 发动机, 有以下参数 Target Velocity 目标速度. Force  作用力, Free Spin  自由转动 选中的话, 发动机永远不会停止, 旋转只会越来越快

2. Fixed Joint 固定关节

l  Enable Collision 激活碰撞,

3. Spring Joint 弹簧关节, 可以使两个刚体想连接着弹簧一样的运动

4. Character Joint 角色关节, 主要用于布娃娃效果. 他是一个扩展的球关节.

5. Configurable Joint 可配置关节.  有以下重要属性X motion, Y motion, Z motion指的是在各个轴 上的移动形式, 有自由移动, 锁定移动和限制性移动. 三种.另外还对应了三种旋转形式, angular X motion, angular Y motion, angular Z motion.

84.  2D 的关节组件

1. Spring Joint 2D;

2. Distance Joint 2D

3. Hinge Joint 2D

4. Slide Joint 2D;

5. Wheel Joint 2D

85. 2D physics Effectors 组件

1. Area Effector 2D 区域效应组件, 将力作用于一个区域之中. 有以下重要属性

l Force Target 力作用的目标.

2. Point Effector 2D , 2D 点效应将力应用于吸引或者排斥一个点. 跟上面一样有下面这个属性

l Force Target 力的作用目标.

3. Platform Effector 2D 平台效应. 应用于单向碰撞等平台行为.

4. Surface Effector 2D  表面效应. 适用于沿着碰撞体表面的切线力, 这种效应可以用来创建恒速电梯和表面移动.

86. 力场组件

5. 力场是一种给刚体快速添加恒定作用力的方法. 有以下属性:

l Force 力,施加力可以启动加速的作用,

l Relative Force 施加在局部坐标系中的力

l Torque 扭矩, 在世界坐标系中

 

Unity中的C#脚本

 

87. 脚本 C#

有几个固定的方法.

Start() 这个方法是update函数第一次调用之前调用. 用于初始化

Update () 方法是每一帧都调用一次

Fixedupdate() 这个方法是每隔一个固定时间调用一次

Lateupdate() 这个方法是每一帧调用之后, 调用.

C#基础:

定义变量为public的时候, 就可以在inspector视图中看到这个变量.  默认是private 的,

 C# 中的: 就表示继承.

定义数组的格式也和java是一样的.

Foreach 循环的格式如下: foreach(int item in array);

C#中的List不是抽象的, 泛型可以是基本数据类型, 使用List的时候需要添加一句   using System.Collections.generic; 这个应该就是C# 中的导包;

C#中也有boolean值, 用bool来表示.

运算符和三元运算符也是一样的.

 循环语句也是一样的.  有for 循环, while循环, do while 循环和foreach循环

Switch 语句也是一样的.

方法的声明 也是一样的,.  一样都是修饰符, 返回值, 方法名, 参数.

 C#中的方法传参时可以用ref 声明为传引用, 例如一个int y = 10; 如果传递引用之后被改变了的话, 那么y这个值也被改变了,  

C#中Ref和out的区别 ref 的值必须在函数外进行初始化赋值, 而 out的话, 在外面的初始化赋值是没有作用的.

在Unity使用脚本时,脚本的文件名和类名必须是一样的. 不过一般新建都是没有问题的, 协同函数的返回值必须是IEnumerator, 返回语句是yield return ..

3. Unity中的一些触发函数:

1. OnMouseEnter() 鼠标移入一个GUI 控件或者碰撞体时调用

2. OnMouseOver 鼠标停留在GUI 控件或者碰撞体时调用

在Unity的一个场景中如果要找到其他的物体的话, 通过下面这几种方法, GameObject.Find(“名字”). 这个名字就是在Hierarchy View中显示的名字. 如果存在就会返回这个物体, 如果没有就返回null, 如果有多个就返回第一个. 找的时候似乎是从最后一个开始找.

GameObject.FindWithTag(); 根据标签来找对象.

GameObject.FindObjectsWithTag(); 这种情况是返回所以这个标签的对象, 是个数组.

3. 一个物体所具有的各个组件可以直接通过成员变量来访问. 例如transform, rigidbody, renderer, Light, camera, collider, animation, audio 等等. 也可以通过getComponent<Tranform>() 这样的方法来获取到这个组件. 一般获取物体或者组件的方法都应该是在start方法中调用.  避免在update中被多次执行,

4. 获取物体的子对象上的组件, GetComponentInChildren<>(). 输出的float的值都是四舍五入后一位精度的.

5. Tranform的成员变量中的Localposition 是相对于父容器的坐标, position是世界坐标., parent指的是父容器的transform组件. Root是对象层级关系中跟对象的transform组件.childcount是子孙对象的数量. Right, up, forward,  是指在世界坐标系中的右上前方向. Up对应的是Y轴, forward 对应的Z轴, right对应的是X轴.

6. 下面是Transform的一些成员函数, Translate ,平移函数, Rotate是旋转函数, LookAt是旋转自身使得前方向指向目标的位置. TransformDirection 将一个方向从局部坐标系变换到世界坐标系,. DetachChildren 与所有物体解除父子关系. RotateAround是按照指定的轴的指定的速度旋转.

7. Time.deltaTime 表示距离上一次调用的间隔时间. Time.realTimesinceStartup 这个是获取从游戏开始到当前所经过的时间,  framecount 是已经渲染的总帧数.

8. Random 类. Random.value() 生成一个0-1之间的随机数. InsideUnitSphere 返回半径为1 的球体类的一个随机点. InsideUnitCircle 返回半径为1的圆内的一个随机点.  Onunitsphere 返回半径为1 的球面上的一个随机点. 这些都是成员变量.  

9. Random的成员函数, Random.range(min, max) 返回最小值和最大值之间的一个数, 包含最小值和最大值,.

10. Mathf  数学类, 一些基本属性, pi 返回圆周率, infinity返回无穷大, negativeinfinity返回负无穷大, Deg2Rad 度到弧度的转换系数. 下面是一些常用的方法. Sin,  计算正弦值, sqrt 计算平方根, Abs计算绝对值, min返回若干个值的最小值, max 返回若干个值的最大值,  pow 返回次方. Clamp, 将数值限制在min 和max 之间.  Clamp01 将数值设置在0-1之间,

11. Coroutine 协同函数, 主要的功能差不多就是说可以间隔一段时间之后再执行.. 类似于多线程的功能.

12. Input类, 用于处理用户的输入.  InputManager 用于为项目定义各种不同的输入轴和操作. 有以下一些属性: acceleration 获取当前设备在三维空间中的线性加速度. AccelerationEvent获取上一帧的加速度数据列表.  Anykey 是否有按键按下, gymo返回默认的陀螺仪. MousePosition 鼠标位置的像素坐标, multitouchenabled 返回是否支持多点触摸.  有以下一些函数:

13. GetAxis() 根据名称得到虚拟输入轴的值. 在PC中vertical代表上下键,其中按下返回正数, 按上返回负数.  Horizontal 代表左右键, Mouse X. 代表鼠标左右滑动. Mouse Y 代表鼠标左右滑动时触发. GetButton(); 后面是button的名称, 如果指定button被按下了的话就会触发. 这个是虚拟按键. getKey() 当指定的按键按下时返回true.  GetMouseButton() 当指定的鼠标按键按下的时候返回true; 由于渲染得很快, 一般这种方法在点击下去之后会触发好几次, 但是如果是getmousebuttondown的话, 就只会在这一次点击中,触发的第一帧返回true. 也就是说一次点击只会触发一次. 另外, Input.getButton之类这种方法并不是只有在点击目标物体才会触发,. 而是点击任何地点都会触发.  在Input中key是不能变的. 与物理键盘一一对应, 但是button是可以自由配置的. 是虚拟的按键,.

14. 鼠标的位置使用屏幕的像素值来表示, 在电脑中左下角表示(0,0) 原点. 右上角为最大值, 通过Screen.width和Screen.height 可以获取到显示屏的宽高;

15. 键盘中的值都会对应KeyCode中的一个值.

16.  在移动设备中, 例如手机.获取触摸信息的api如下: getTouch(), 返回指定的触摸数据对象.  这个touch中会封装以下的变量,fingerId 触摸数据的唯一索引id, position 触摸的位置, deltaposition 触摸的改变量. DeltaTime距离上次触摸数据变化的时间间隔. Tapcount. 单击计数.  还有一个很重要的参数phase , 有如下几种状态, began, 手指刚刚触碰屏幕, moved, 手指在屏幕上移动, ended, 手指离开,

17. C# 中的强制转换时as …. 例如 as gameobject 就是把前面这个对象强制转换成游戏对象.

 

UGUI

1. 创建UI 对象, 首先是GameObject-UI – 需要创建的UI 对象. 任何一个UI 控件都是画布的子对象.  UI 元素的绘制顺序依赖于他们在Hierarchy View中的顺序.  如果要修改的话, 可以在Hierarchy视图中修改, 也可以通过在脚本中调用SetAsFirstSibling, SetAsLastSibling 和SetSiblingIndex 方法. 等等, 设置绘制的顺序.

2. Canvas 有以下属性, Render Mode 渲染模式. 有几个值, Screen Space-Camera, 设置这种的话. 画布会以特定的距离放置在指定的相机前. Screen Space-OverLay, 使画布拉伸以适应全屏大小, 并且使GUI控件在场景中渲染于其他物体的前方.

3. Unity中所有的UI 控件都是在ONGui函数中实现的. C#中float数也是可以取模的. 给Button设置图片背景, 使用一个Texture. 然后给这个texture 赋值. 可以在需要的时候给这个texture再次赋值为另一张图片就可以动态的改变这个button的背景了. 还可以同时给这个button设置既有文字又有图片, 使用GUIcontent. New GUIContent(文字, 图片);. GUIContent的构造方法也可以给这个button传递两个字符串, 第一个是button的名字, 第二个是一个工具提示, 然后在下面可以设置一个label就用来显示这个GUI.tooltip, 这样的话, 当鼠标移动到button上的时候就会显示这个工具提示.

GUI 常用控件:

l Label, 这个控件只是用来显示一些信息的, 不能与用户交互

l Button, 可以显示成图片, 文字,或者都有. 可以响应用户的点击事件. 一般写在OnGUI里面的if语句中, 用户按下后, 当松开鼠标的时候会触发里面的执行语句

l RepeatButton 创建的过程和Button差不多, 但是RepeatButton的执行过程和Button差很多, 用户按下开始每一帧都会执行, 直到用户松开为止.

l TextFiled 文本输入框. GUI.TextField(); 左边是rect, 矩形边框, 右边是默认文本,. 有返回值, 返回文本框里面的值, 所以这个值也可以用来给其他控件使用.  这个是只能输入一行,

l TextArea . 使用和TextField 差不多, 但是TextArea 是可以输入多行的.

l Toggle 开关, 这个有一个要注意的一点是, 在创建的时候要传一个默认的bool 值, 这个值不要是一个常量,. 不然的话就会点击不了, 应该传一个bool 的变量, 然后返回值也用这个值来接收, 这样的话每一帧在来的时候就会读取这个值, 这个值是发生变化了的, 所以就会刷新.

l HorizontalSlider : 水平滑块创建函数如下: GUI.HorizontalSlider(屏幕上的显示位置, 滑块点的初始位置, 滑块点的位置范围,起始值-终点值); 返回值是 滑块点 的位置.

l 另一种与水平滑块对应的是垂直滑块VerticalSlider. 用法和水平滑块几乎是一样的. 只不过样式是垂直的而已.

l Unity中有一个与android中的radio group 相似的控件就叫做toolbar, 这个跟android 中的toolbar是不一样的, 在构造函数中, 有三个参数第一个还是rect, 矩形区域, 第二个参数是被选中的位置, 第三个是一个数组, 可以是字符串数组,了可以使GUIContent 的数组都是可以的,. 在每次点击都会返回当前被选中的位置, 然后可以被其他的控件引用,

l Unity中还有一个控件是类似于android中的gridview 的, 就是可以自由的按照几列来排列, 例如总共五个排成2列这样子, 构造函数如下: GUI.selectiongrid(屏幕上的显示位置和大小, 几个selection中被选中的那个, 一个用于表示总共几个grid的数组, 最后一个参数是用于显示总共显示成几列); 总共四个参数, 一样的也是点击之后每次都会返回被选中的那一个. 也是一次只有一个被选中

l GUI.changed这个变量可以用来表明控件是否发生变化, 如果发生变化的话就会返回true就可以执行一些别的操作了.

l GUI.beginGroup和GUI.endGroup之间的GUI 控件将会被圈成一个组, 会部署在这个组中, 以组的左上角为原点. 其中组的begin函数中需要传入一个rect 用于确定整个组在屏幕中的显示位置和大小

l 一个物体添加一个button组件之后就可以被点击了, 他的点击函数可以由在别的物体的C#脚本中的一个public函数确定.

l 做UI 页面开发的步骤如下, 首先是要创建一个canvas, 然后在他的下面创建一些基本的UI 的游戏对象, 然后给这些游戏对象添加一个button组件这样的话, 这些游戏对象就可以响应点击事件了, 在这个button组件中有一个onclick函数, 这个onclick函数是自定义的, 可以选择别的游戏对象上的C#代码中的一个函数作为他的点击事件. . 另外一个需要注意的事情, 如果设置一个text 但是他的大小不足以容下他的内容的话会导致全部文本都消失, 调节一些大小就好了

l 如果想给一个Button设置背景图片的话,可以给这个button添加一个raw image组件或者是image组件, 然后给这个image设置一张图片就可以了.

l GUI 函数只能在OnGUI方法中.  DropDown的组件DropDown中有addOptions 方法, 会在原有的基础上添加.  获取开关是否选中的属性的 Toggle对象的Toggle组件的iOn这个属性.. UI 对象的任何属性都是可以通过他的组件去获取到的, 也包括他的一些方法似乎也都是封装在UI 组件上的, 而不是游戏对象本身,  用一个控件的enabled 属性可以改变这个控件的可见性.

l 一个对象的UI 组件有enabled 属性, 可以控制是否可以交互.  通过一个游戏对象的setActive*(bool flag) 方法可以让一个对象显示或者是隐藏.. 调用destroy(obj) 方法的话则是直接销毁一个游戏对象.  如果一个UI 对象enabled 为false 的话只是不能交互, 但是如果是一个canvas不能enabled 的话就是里面的所有控件都消失了. 但是也仅仅只是不见而已, 并没有消失,.

l C#中的IO流,. C#中的FileInfo 应该就是和java中的File差不多. 然后可以直接调用appendText方法可以返回一个流, 进行添加数据. 这个方法返回的流是直接添加数据的, 不会删除掉原来的数据, writeLine方法的话就是多写了一个回车换行. Java中创建一个文件夹用的是File. Mkdir 和File.mkdirs(), C#中创建文件夹用的是DirectoryInfo这个类, 调用create方法 C#中的文件移动和文件复制用的都是直接File.move 和File.copy(), 也可以用FileInfo.moveTo() 这个方法也可以移动文件到另一个地方. FileInfo.copyTo()这个就是复制文件的意思. 跟java中一样的是, 如果父级文件夹不存在的话就不能移动复制了,. 必须是父级目录是存在的才可以. 用File.exists(path) 判断是否是文件. 用Directory.exists(path) 判断是否是文件夹.

l C# 中的可变参数是用params 来表示的, java中使用… 

l C#中的导包用的是using这个关键字. C# 中有一种函数叫做虚函数, 相当于java中的抽象函数, 但是他是有默认实现的, 需要用到一个关键字叫做 virtual, 然后子类在实现的时候需要用到关键字叫做, override. 重写. 虚函数和抽象函数的唯一区别估计就是抽象函数是必须重写的, 虚函数是可以不用重写的,. 实现方法一样是要加override 关键字, 抽象函数一样是要写在抽象类里面,

l C# 里面也是有接口的, 也可以实现这个方法, 但是不能够用override 关键字了,这里就,

l Unity中一个C#脚本可以调用另一个脚本中的方法, 可以通过GameObject.Find(“游戏对象名”)..SendMessage(“函数名”); 这种方法可以调用public和private方法, 还有一种是GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数 (果然这个也可以).

l 给一个物体设置Box Collider 的时候也是需要设置这个碰撞体的轮廓, 调整到刚好覆盖这个物体是最好的. 如果是mesh Collider 的话就不用设置网格了, 因为会自动匹配的, 但是用这个的话是很耗性能的.

l Unity中可以在一个脚本中禁用另一个脚本的代码, 一样是获取到那个物体的c#脚本组件, 然后.enabled=false就好了;

l 鼠标控制物体的移动可以使用虚拟按钮, 例如Horizontal,. Vertical 等等. 通过获取返回的值, 来移动.

l 如果是要重复创建对象的话,必须是先把一个模板设置为预设体, 然后就可以多次重复使用了.

l OnApplicationQuit 会在游戏退出的时候调用.. 一个物体被销毁之后, 那么这个对象也成为null. 一个用处就是, 动态创建的物体会返回一个对象, 当这个对象被销毁的时候, 这个值就成了null, 所以可以做为一个对象是否已经被销毁的根据.

l Unity中网页上的按钮的点击事件在手机中也会对应的生成. 还有就是网页中的getMouseDown() 也会在手机中的点击事件对应.

l Button 点击事件是在getmousedown之后在getmouseup之前

l Unity中可以通过创建GUIStyle 来控制创建的UI控件的样式.

l 使用EasyRoad3D 可以用来简单方便地创建公路.

l 如果需要屏幕跟随着鼠标动的话, 是需要设置一个第一人称控制器,

l 如果要给一个物体设置一个属性动画的话, 是选中该物体之后, 然后点击window-animation, 就可以编辑了

l 如果要让camera跟随着物体的话就需要使用到Vector3.lerp 或者是Vector3.slerp, 插值器. 用于平滑的让相机滚动到指定的位置.

l 如果是人体的各个部分的话, animationtype设置为humanoid.

l 要给人体的各个部分设置不同的材料和颜色的话, 改变的是skinnedMeshrenderer 下面的mesh属性和material.color 属性, 在视图中可能是改变main color就把整个身体的颜色都改变了,但是在游戏运行的时候是不会这样的.

l C#代码中的数组设置为public之后一样是可以在inspector中赋值的. 保存用户的配置可以使用playerprefs. 有setInt, setString, setfloat的方法可以保存几个数值. 通过PlayerPrefs.hasKey 来判断是否保存有这样的键.

l Unity中的C#脚本不是一定要继承monobehavior的. 如果不是要附在物体上的脚本的话就不需要继承这个类. 例如常量类, bean类之类的.

l Scenemanager 的使用的时候是需要导包的, using UnityEngine.Scenemanagement. 调用loadscene() 方法. 这个方法是用于加载scene场景的,. 用于替代application.loadlevel() 这个方法.

l FPS 第一人称射击游戏. First person shooting game;

l 人物换武器应该是这样的, 就是先把所有可以用的武器都添加上来, 然后在换的时候再选择渲染哪一个, 通过active

l 给一个人物物体添加一个character controller 组件可以控制物体的移动, 调用CharacterController cc. simpleMove(Vector3) 就可以了 . 这个方法指的就是移动的偏移量. 例如simpleMOve(new Vector3(1,1,1)) 那么意思就是x,y,z轴都移动一米.  这个也是要调整这个组件的大小的, 最好的就是刚刚包裹物体对象

l Transform.lookAt() 里面有两个参数,第一个参数是当前对象的正Z轴所指向的目标位置, 第二个参数是, Z轴调整好之后, 继续绕着Z轴旋转, 使得旋转之后y轴的指向与第二个参数的指向一致

l Time.fixedDeltatime= 0.01f, 意思是设置默认的固定更新时间.  也就是fixedupdate方法的调用间隔时间,

l Animation组件执行动画的方法是animation anim.crossFade(“动画名”); 人物走路或者别的运动的效果的原理是, 首先把物体移动到指定的位置, 这个只是一个translate方法, 在这个同时又执行一个animation, 这个animation只是一个原地的肢体的运动, 两个结合起来就成了运动的动画了

l Unity中的Light物体可以设置灯光的颜色.  这样的话被照射的物体就有了相应的颜色了,.

l Quaternion.euler(new Vector3(x,y,z)).意思是返回一个rotation, 这个rotation的意思就是让物体绕X轴旋转x个角度, Y轴旋转y个角度, Z轴旋转Z个角度, 直接通过赋值的方式设置给对应的物体就可以生效了

l Joystick 在onEnabled的时候给摇杆设置回调函数,

l  左边都是属性, 右边是方法名. 用+= 的方式来赋值.

l 设置dontdestroyonload属性的话,那么一个物体其实当前场景被销毁了, 加载别的场景了, 这个物体仍然存在.

l C# 中也可以用var 这种弱类型的变量来接收一个对象,

l Unity中如果要设置一个动态生成的物体的运动方向的话, 可以先确定一个参照的物体. 这个物体在最开始的时候和这个要生成的物体的指向方向是一样的, 然后在代码中动态创建的时候,instantiate(obj, position, rotation) 的时候使用那个参照物的旋转就好了, 因为在translate的时候坐标系可以选择为自己, 而且默认就是自己.

l 同一个物体可以添加多个脚本

l 人物的骨骼映射avater 在导入进来就会存在.

l 在给很多图片制作atlas maker 的时候要先选中所有要添加进来的图片, 然后再右键点击,

l 用想在Scene屏幕上使用NGUI右键功能, 必须先选中一个UGUI 的控件才行

l 在给人物设置旋转动画的时候, 首先要去掉本身已经有的那个animator的动画.

l 在编辑数组的时候在设置size的时候, 修改了size 必须要enter键一下, 不然的话就没有效果

l Unity中的onpress(bool ispress) 函数是 只有在触摸到指定的物体了才会触发的, 并不是触摸到屏幕也触发.

l 如果是一个有父容器的物体的话, 用localposition会更好控制一些,. UICamera.lastTouchPosition 可以获取到在屏幕上移动的上一个位置.

l 要看人体的骨骼的话, 可能会需要点击一下configure

l 在给物体设置animator 的时候, 人物必须要绑定avatar 的, 还有就是一个animator controller. Animatorcontroller 要设置一些参数以及触发器之类的东西控制在某个条件下执行某个动画, Animator.setBool(“属性”, bool值); 获取当前的动画状态的api是animator.getcurrentanimationstateinfo() 有一个参数就是layerindex,. Animator设置触发器的api是animator.setTrigger(“触发器的名字”); 第一个拖进去的动画就是默认状态下的动画. 动画还要设置是否是循环的, 一般来说攻击肯定不是循环的而是一次性的, 走路这些事循环的, 因为不可能点击一次走一步. 如果两个动画连接的话, 默认是前一个动画执行完之后就执行后一个动画

l 动态为NGUI 的button绑定点击事件, 方法, EventDelegate event = new EventDelegate (脚本对象, 方法名); 按钮对象.getComponent<UIButton>().onclick.add(event); 这样就可以了\

l Animatorcontroller每次改变触发动画的参数布尔值或者是触发器都会进行相应的动画, 同一个layer 里面的动画一次只能执行一个.

l 一个类中静态的变量的不能再inspector中显示,然后赋值

l 把游戏中的场景添加进build settings 的操作, 首先是点开file下的build settings 然后add open scene 把当前的场景添加进来, 然后切换到另一个场景,进行同样的操作一个一个的添加进来,

l 在Unity中使用List必须要加泛型,.不然就找不到类, 恶心 C# 中list 的长度是用count属性来获取

l 在动画中设置的event 方法, 在脚本中必须是public 的, 不然就会报错

l 可以在动画的某个瞬间设置触发函数. 在动画中添加一个event 就好了

l 一条动画机中的转移线如果设置额hasExitTime的话意思就是等上面这个动画执行完了再执行下面这个, 如果不设置的话就是任何时候都只要条件满足了就可以执行下面这个动画

l 似乎一个触发器才有ontriggerEnter这样的方法, 放在resources 下面的物体预设体可以用resources.load()来加载

l Application.quit()方法在测试的时候出现问题. 但是导出之后是有效的

l NGUI中设置一个背景图片覆盖整个屏幕, 用代码去获取UISprite组件, 然后设置宽高为Screen.width 和height 就好了

l 导入字体的话其实只要在window电脑中找到font的tff文件就可以在unity中使用了, 不过我用的是NGUI , 不确定UGUI 是否也能使用, NGUI创建button要是project视图中搜索control, 找到simple-buttoN

l 使用NGUI 的时候如果出现一个控件在其他控件上不能显示的话可以通过改变depth属性, 设置为大一点的话就好了, 因为这个表示的是渲染的顺序

l NGui中输入文字的时候k,如果在前面加上[FF0000] 那么后面的字体就会变成红色,.

l Unity 也有bug, 有时候代码没问题的, 可是跑出来有问题,  再跑又没问题

l 在inspector中赋值的变量在awake之前就已经赋值好了, 就可以使用了

l 一个NGUI 的控件只有在选中字体为Unity而不是NGUI 的时候才可以选择自己的字体 例如在windows 电脑中存在的一些如楷体之类的字体,

l 自己制作一个CheckBox, 首先是创建一个sprite , 然后添加collider 和toggle 组件, toggle 是一个脚本. 然后在这个checkbox上再添加一个孩子sprite 这个就是勾选后的状态图标, 然后把这个图片设置给父亲sprite的脚本中state transition中去.

l NGUI 中的toggle 要获取是否是选中的只要获取到value 就好了, gameobject.find(). GetComponent<UIToggle>().value, 这个值就是是否选中的状态

l NGUI 中的滑块获取值的话很简单的了只要在inspector视图中找到对应显示的那个控件那里就好了

l Unity导出apk 的时候不要设置development build 不然的话导出来的apk 无法运行出现一个找不到so库的错误

l ScrollView 会出现条目显示在左边并且显示不完整的问题, 这个问题是调节每个条目的position就可以了.

l 如果在把一个gameobject 设置active 的时候, 如果马上调用一个方法的话, 这个方法是会在start之前调用.

l 一个Button如果设置自己在点击之后就不能再点击的话, 那么他就不能响应点击的音效了, 因为音效的执行是需要一定时间的, 所以可以设置延时一定的时间然后再把自己的UI button脚本设置为enabled  false.

l 在Inspector视图中赋值的数据会在awake后赋值, 在start之前.

l 似乎在resource 里面的预设体脚本中的引用, 如果有引用其他的物体的话是不能再inspector中赋值的,

l C# 中的using 有好几种用法有一种是说, 在using(对象){}  然后当这个代码块运行完毕之后就会自动释放这个对象, 调用这个对象的dispose 方法, 所以一般是用于流.

l 如果要做屏幕适配的话, 可以动态的设置UIRoot 的manualHeight , 就可以了, 在实际中会根据屏幕的真实高度, 去确定root下面的每个控件的实际比例. Anchor 的话其实更简单了, 基本上就是按照现在的调整之后, 设置anchor 为unfied 就好了, 似乎

l ScrollView 的条目就不要设置anchor了, 这样的话就失去了ScrollView 的效果了

l 屏幕适配的时候最外层的anchor 设置为UIroot最好, 这样的话, 如果分辨率差不多的话, 就会几乎看不出什么问题. 而且这种情况下也不需要任何代码来控制, .  因为UIroot会等比例进行缩放的. 会按照manualheight 和实际设备的宽高比进行等比例的缩放, 不过首先的前提是UI root 设置了模式为fixedSizeOnMobile. 这种情况下支持的仅仅也是分辨率差不多的, 如果分辨率的宽高比差得比较多的话还是会变形很厉害的, 如果用带代码的话就是控制分辨率的宽高差得比较多的情况. 控制在那些情况下该怎么处理,.

l C# 中取出集合在某一个位置的元素的写法跟数组竟然是一样的, 是list[0]; 这样写的.

l Unity中药给ScrollView动态生成条目的话,方法如下,. 先调用NGUITools.addChild(), 这个方法将条目添加到scrollview上去,然后把ScrollView中的UIGrid组件的repositionNow属性设置为true.  然后再调用reposition方法 就好了,.

l 给EventDelegate 添加方法的参数, 可以在脚本中定义一个public 的成员变量, 必须是public 的, 也必须是成员变量, 其他的都不行. 另一种方法就是写一个类集成UnityEngine.Object 这个类, 然后EventDelegate.parameters[0].obj = 一个特定的自己创建的这个类的对象, 这样就可以作为一个区分的标志了,你妈要不要这么麻烦,.

l 人物在死亡的时候的动画触发最好是用trigger , 因为感觉用bool的时候有问题, 因为人物的死亡是动画的结束了,

l 在切割CSV 格式的时候用’\r’+””+’\n’,在使用csv 格式的时候要注意不要在最末尾多一个换行, 不然的话切割字符串的时候就会多出一条来,

l 调好一个视野的角度之后, 可以选中camera 然后点击GameObject 中的align with view 这样的话, 这个camera 的视角就会跟当前视角保持一致, 这是一个很好的调节相机视角的方法

l 改变游戏场景中的鼠标显示图标, 可以在file-build settings 中选中player settings 然后在default cursor 中选择想要使用的图标就好了, 这样的话一运行就可以了

l 给场景设置天空背景, 首先选中camera , 然后设置 clear flags 为sky, 然后添加一个组件, skybox, 然后添加skybox 的素材就好了, 这个skybox 的资源也是系统自带的

l 设置雾的效果, 可以选中edit, 然后render setting 然后选中fog, 就可以由雾的效果了, 还可以调节雾的浓度. 通过设置fog density

l NGUI 中如果要使用一张不在图集中的图片的话, 可以使用simple texture. NGUI 中可以很简单地给一些控件设置补间动画,直接选中一个控件, 然后右键选择tween 就是补间动画的意思, 然后可以设置对应的,例如, alpha 之类的动画, 还可以设置动画的播放次数, 有循环还有ping pong 这个的意思就是顺序循环, 从头到尾,.再从尾到头这样,

l 脚本里面存的东西可以是一开始初始化就是active false 的物体,.

l 给游戏添加背景音乐用的是audio source 脚本. 然后指定audio clip , 然后设置一下loop 表示循环播放,.

l 更新一个atlas 的方法是,. 选中要新添加进来的图片, 然后右键open atlas maker 出来的atlas 就会把这些图片都已经添加进来了, 但是要点击一下add/update’这个按钮, 点完之后就好了,

l Animation 下既可以放一个单独的动画也可以放一个animation controller,

l 可以将一整个UI Root下面的东西都做成一个预设体, 然后动态生成的时候直接instantiate(预设体) 就好了, 不用设置什么位置啊, 旋转啊, 父容器啊, 之类的, 如果是添加一个什么小的控件的话就需要设置父容器

l 要做成类似android中gridview 的效果的话, 只需要一个UI Table 的脚本就可以了, 那么所有添加在他下面的控件就会整齐排列

l 在做scrollView 的时候应该确保,. 每个子条目的box collider 的尺寸应该是包裹这个条目的, 真他妈有时候很奇怪, ScrollView 中的条目如果不在中间的话, 可以通过设置条目的anchor, 默认是靠中间的似乎.

l 去你妈的, table 调节里面的条目在他上面的位置竟然是调节UI Widget 里面的pivot 属性.

l ScrollView 可以直接通过一个UIGrid 组件上设置成多行多列的模式. 通过一个叫row limit 或者是columns limit 然后设置好cell width 和height 以及整个scrollview 的width和height. ScrollView 也可以把UIGird 孤立出来, 用另一个控件, 添加UIGird 脚本, 然后作为scrollview 的儿子. 然后所有的真正的子条目写在这个儿子下面. 此时这个儿子上是不需要加box collider 的, 真正的子条目才加

l 监听滑动的话是可以使用OnPress 这个函数, 点击之后就开始记录当前位置, 然后每次滑动都记录当前位置, 或者是在松手的时候再记录当前位置也行, 如果当前位置和初始位置的偏移量达到多少的时候就执行相应的操作, 通过UICamera.lastTouchPosition 就可以获取到上一次的手指滑动的位置了

l C#中的线程休眠和java 是一样的, 都是Thread.sleep(毫秒);

l 一个物体第一次active 的时候才会执行awake方法,.

l C# 中的接口还不能设置public

l 删除一个UI 控件的child 的话, 只需找到这些child,然后 destroy 就好了

l 在monodevelop 中添加引用, 就是在project--Edit references— assembly—在文件夹中找到对应的dll 引用. 在Unity中添加引用的时候好像要必须要把对应的dll添加到asset目录下才可以

l Unity中resouces.load() 如果这个文件是不存在的话就会返回null, 所以这个也可以做为一个是否存在该文件的一个标记

l C# 中如果要切割字符串的话应该要用regex.split(data, ”切割”, 选项), 如果用string.split(字符数组来切割的话, 这个是表示遇到数组中的任意一个字符都会切割)

l Unity中Resources 目录下的文件, 格式也是有要求的, 如果没有格式的话, 会读不出来, 可以点击这个文件,看看右边的inspector面板会不会显示出内容, 如果显示不出的话就有问题

l Unity可以通过Application.platform来判断当前游戏运行在哪个系统下面

l Unity 中的文件可以选择放在resources 下面或者是streamassets 下面, 后面这个的话其实就是在asset目录下面创建一个新的目录就好了, 下面的文件在打包的时候也会加上的, 在各个平台下他的路径也是不一样的

l 如果用到中文的话应该都要弄成UTF-8格式, 为了确保是U8 的,  写好的带中文的配置都用finafile转成U8 . 其实可以直接用记事本打开, 然后另存为的时候设置编码为UTF-8.

l UICamera.currentCamera.screentoworldpoint();

l Unity中会识别是否是click, 还是只是press 和滑动, 所以可以加个标志位. 意思就是并不是每次按下松手都会触发onclick. 执行顺序是, 按下, 滑动, 在松手的前一个瞬间会判断是不是click, 如果是的话才会执行onclick, 最后执行松手

l LitJson 是不能识别float 类型的数据的, 但是可以是double

l Unity中的配置文件如果放在resources目录下的话, 即使打包成apk的时候会被压缩, 用resources.load方法还是可以正常的读取的, 这个是没有问题的

l PersistentDataPath 是Unity中可以进行读写操作的文件夹, 这个文件夹是在游戏运行之后才生成的文件夹, 在android ,ios, PC 上都是可以使用的.   resources 是一个只可以读的文件夹

l 一个物体的box collider 是会跟着自己的大小而改变的, 但是要设置collider  adjust to match 这个属性, 打上勾

l Unity游戏横竖屏是在游戏设置中设置的, 而不是在android 的清单文件中

l OnEnable 是每次设置active 为true的时候都会执行的, 所以可以在这里进行一些数据的获取, 尤其是一些会随着玩家的游戏进度而改变的配置

l C# 中的运算符重载其实也很简单 举个例子, + 运算符的重载, 直接写上public static(必须是静态的)  返回值+ operator+  (这个就是重载+ 运算符的意思)(参数1, 参数2)  就好了, 然后就可以直接调用了

l C# 的stringBuilder 类几乎和java 是一样的, 几乎都没有什么差距了

l C# 中是不支持匿名内部类的. 不知道为什么, 但是可以写一个类继承或者实现另一个类或者接口之后, 再传递这个对象作为参数

l C# 中的delegate的本质是一个函数指针, 可以将任何一个函数名赋值给delegate 的变量, 然后这个变量就会记录这个方法的指针, 就是这个作用的, 类似于C, 中的函数指针, 但是还是有不同的, C# 中可以这样定义一个delegate, public delegate void Method() 这个的意思就是说这个Method 类型就是用来代理一些没有返回值, 没有参数的方法, 可以代理多个 调用的时候都会一起执行

l Unity中可以直接把一个文件在inspector面板中给TextAsset赋值, 对于中文, 放在resources 下的话, 只有UTF-8格式的才可以被解析, 否则的话就是空

l C# 中开启子线程, Thread thread = new Thread(new ThreadStart(method)); 其中method 是任意一个方法, 因为这里要求传入的方法是一个delegate , 委托

l C#中只有添加了abstract, virtual这些的函数才是可以重写的,子类如果要重写父类函数的时候, 可以使用override. 如果父类函数没有加abstract 或者是virtual, 那么不管在子类的方法中要不要执行父类的同名方法, 要在方法的声明中加new 字, 如果需要父类的方法就加上一句, base.方法(;  ) java中同名,同参数同返回值的函数就会当做是重写

l 脚本的awake 方法只执行一次, 但是重新加载这个场景之后, awake 是会再次调用的, 因为一切都重新开始了.最好把一些会随着游戏的进展而变化的数据都放在onenable 方法中初始化, 以确保进度是及时的 , 是最新的数据

l 导出一个游戏场景, 可以选中该场景, 右键然后选择select dependencies, 然后在asset中选择export 就可以了, 不过似乎如果是resources 下的文件是不会被导出的, 如果需要的话, 需要手动加入进去

l Untiy的游戏工程只要提交assets 目录和project settings 目录就可以了, 其他的都是自动生成的,

l Unit中创建服务器用的是network 这个类, network.initializeserver 这个方法就是用来初始化一个服务器的,有三个参数, 第一个参数是连接人数的限制, 第二个参数是监听的端口号, 第三个参数是是否使用NAT 技术.

l Network.peertype 用于获取当前的连接状态, 有四种状态, 未连接, 连接中, 客户端, 服务端.

l Network.connect() 用于连接到已经创建好的服务器上, 有两个参数, 要传递连接的服务器的IP地址, 端口号, 或者密码, 之类的, 返回值类型是一个错误, 判断错误类型, 如果是noerror 代表连接成功, 没有出现错误

l 刚体在遇到碰撞体的时候是会停止运动的, 例如一个cube 受重力往下掉的时候遇到地面的碰撞体就会停止运动了

l 通过Network连接到局域网游戏. 连接之后就会把通过network.instantiate() 方法实例化出来的对象也先实例化出来 达到和服务器端同步的状态/ . 例如, 假如服务器在一创建的时候就会通过network创建一个游戏物体的话, 那么 在一个客户端连接上之后也会创建这个物体, 尽管这个物体是在服务端的代码实例化出来的.

l Monobehaviour 有三个方法如下, OnPlayerconnected(networkplayer player) 这个方法是在服务端调用的, 每当有客户端连接的时候就会调用. OnServerInitialized() 在服务器初始化之后调用. OnConnectedToServer() 在客户端调用, 当成功连接上服务器的时候调用

l NetworkView组件是用来同步一个游戏物体的, 一般默认是同步transoform组件, 他会把真正创建出来他的那个客户端当成是主客户端, 只有这个客户端控制他的位置, 才会在其他的客户端里做相应的改变. 而在其他的客户端改变他的位置, 别的客户端是不会受影响的. 为了区分控制, 可以在代码中用一个对象来接收实例化出来的物体,

l Unity 中自带了又第一人称character controller 和第三人称character controller

l Character Controller本身也是一个碰撞器, 本身很也会受重力的作用

l 添加character motor 脚本之后就可以实现像第一人称那样的前后左右, 跳.

l 添加mouse look之后就可以使游戏物体随着鼠标旋转, 可以指定按照鼠标的左右移动或者是上下移动, 可以指定角度.

l CharacterController 的属性isgrounded 用于判断当前游戏物体是否在地面上. 如果还是空中则返回false.

l 枪支在发射子弹的时候.枪口的闪光实际上就是一个平面上图片.

l 子弹的代码中如果有遇到物体消失的话, 即便一开始就设置了子弹3秒后销毁也不会有问题的, 因为任何一次销毁之后, 这个代码就根本不会执行了, 所以不会出现那种说已经被销毁的物体但是仍然想访问他的现象

l 一个游戏物体是在父容器中被设置为预设体的, 当用代码instantiate的时候他并不会保留他的父容器信息,. 而是会出现在最外面的坐标系中

l 要保证子弹最长的一端正好和运动方向一致, 只要在设置预设体的时候把Z轴设为最长的就可以了,.

l 将一个图片拖到游戏物体上就会生成对应的材质, 然后可能还需要调整, 例如选中mobile—particles—additive. 这个可以去掉中间黑色的部分, 这个是选中materila 的shader.

l 将UI 控件的位置转为屏幕的位置是很简单的, 直接加上半个屏幕的宽高就可以了, 然后就可以通过发射射线的办法了

l 播放一次性音乐就是添加一个audio source 组件, 这个组件设置好audio clip . 然后调用这个组件对象的play方法就可以了, 如果有时候unity不能播放出音乐的话, 重启一下试试

l 通过camera 发射射线检测的方法跟相机的旋转角度是没有关系的, 只要在屏幕中两个位置上是在一条直线上的就可以了,

l Input.getMousebutton,   0 是鼠标左键, 1是鼠标右键,. 2是鼠标中键

l 开发射击游戏的时候要注意碰撞到枪口本身的一些带碰撞体的效果

l 如果不需要在面板中设置的数据的话, 最好不要设置为public, 因为有时候如果你修改之后, 面板中还没有同步, 导致一直用的都是面板中开始设置的数据

l Unity5.5在导出android项目的时候就需要选择是导出ADT 还是gradle 了

l 今天遇到一个问题, 修改了物体的旋转但是,物体的状态却并没有发生改变, 绑定的camera 看上去并没有什么问题, 但是此时的射线检测却出问题了. 很奇怪的一点

l NGUI 中使用输入框的话, 实际上只要有UIInput 这个脚本就可以了, 这个脚本的使用也很简单就是要指定一个UILabel 就可以了.  而且UIInput 还做了输入类型的判断, 可以限定只输入数字, 或者别的等等, 应该就是用的正则表达式把, 要给他的背景设置一个box collider 同时把UIInput这个脚本也设置给他的背景.

l Camera 可以设置只渲染哪一些layer , 哪些层. 通过设置culling mask 这个属性, 如果设置是everything的话就是渲染所有层

l 设置小地图的步骤就是,. 首先是要创建一个单独的camera, 确定他要渲染哪些东西, 然后在assets中创建一个render texture,  camera 中都有一个target texture 把这个render texture 设置给这个camera, 那么这个camera实时渲染出来的图片就会在render texture 中显示, 然后在NGUI 中创建一个simple texture . 把这个render texture 设置给这个simple texture 的texture 属性就可以了. 如果需要设置渲染的部份的话, 就会需要到shader 了, 因为上面设置完之后显示的是一个正方兄的, 设置mask的话就会可以只显示这个mask显示的图形的样子, 例如圆形

l 每个相机在创建的时候都会自带一个audio listener,. 一个场景有且只能有一个audio listener .

l NGUI的标准用法是首先创建一个scrollview, 然后在下面创建一个grid, 负责排序, 其实最后就是调这个grid 的位置就可以把条目的位置都设置好了.  然后在grid 下面添加子条目, 首先在grid 中的cell width 和cell height属性设置好条目的宽高, 然后设置好是水平还是垂直, 然后给每个条目设置好box collider drag scrollview 脚本, 就可以了.  最后如果有需要的话再添加一个scroll bar 就万事大吉了

l UIcamera.hoveredCamera 用于判断鼠标当前 是否放在在某个碰撞体上面. 如果为null就没有, 注意这个碰撞体仅限于UI 中的碰撞体, 不包括游戏场景中的游戏物体.  这个方法即使是在Input.getmousebuttonup 的时候也是可以用的, 因为鼠标松手的时候鼠标的位置还在那, 这就够了

l Vector3.lerp 插值方法的第三个参数是0-1 的, 超出1 的部分会忽略. 实际上在执行的时候考虑的是这个公式, pos = start+(end-start)*speed; 第三个参数就是这个speed, 所以不可能为1, 实际上这个就是一个不断的逼近的方法

l 物体的localeulerangles里面的各个分量肯定会是正数的, 即便在给localeulerangles 赋值的时候赋值的是负数,

l Unity 和android 通信的机制就是, 首先是Unity导出android 工程的时候, 会根据你在游戏中的所有的脚本以及对应的物体都记录下来, 在unityplayeractivity这个类中通过调用UnitysendMessage(物体, 方法名, 字符串) 通过这样就可以了, 如果是多个参数的话, 是可以通过切割字符串的方法获取到想要的参数. 这种方式是通过unity先把一个unity工程导出成android之后, 再通过自己定义一个activity 继承unityplayeractivity 的方式, 然后通过这个类来调用在Unity的脚本中预留好的公共的方法.

l 另外一种方法是首先建一个android library 库文件, 引入Unity 的classes.jar , 然后就可以了, 然后导出jar 包, 注意除了src和gen 下面的R.java之外, 其他的东西都不要导出. 然后在Unity 工程下建asset-plugins—android—bin, libs, res 其中把android中导出的jar 放在bin目录下,  写好代码之后, 导出的android工程, 主工程依赖生成的另一个unity-resouces 的库文件. 就可以了, 在主清单文件中, 把一些在androidjar 文件中定义的类, 都用全包名, 因为这个包名不要和unity 导出的包名一样, 不然的话会报multiple dex  的错误

l  在Unity中调用android 的代码都是这样写

l AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo=    jc.GetStatic<AndroidJavaObject> ("currentActivity"); 

l 上面两句都是固定的,  就是在调用方法的时候会有不同, 然后就是调用jo.call() 左边是方法, 右边可以传一个字符串, 或者是一个字符串数组, 其实是可以传object[ ] 数组的

l 在android中如果一个activity继承unityplayeractivity的话, 那么如果不把它设置为依赖库而是运行的话会报错.

l Unity 如果要改变android的原生界面的UI 的话,需要加上一句runonuithread这个方法. 不然的话就没有办法执行

l Unity 破解之后可以设置splash动画. 可以定制也可以选择不要动画, 用patch 1.0 版本的, 最好先删掉C/program data/unity 文件夹之后, 重装再破解

l 地形中的flatern 是可以把整个地形或者一部分地形拉到flatern的高度.

l Android中提供给unity调用的方法, 如果要求在主线程执行的, 最好都加上一句runonuithread 以免出现调用无效的情况

l Hovered这个状态在手机上似乎是没有效果的

l 脚本里的public变量如果在inspector面板中修改了的话, 最后运行时以inspector面板中的值为准的

l C# 类如果要给Js调用的话, 需要把这个C# 的类放在standard assets 目录下.  同时这个JS 不可以放在standard assets 目录下. JS 要给C# 调用也是一样的处理, 这个是涉及到Unity编译代码的一个顺序问题.在standard Assets 目录下的脚本是最先被编译的

l 如果Unity版本是4.x 的话集成SDK的时候应该参照UnityPlayerNativeActivity. 如果是5.x 的话应该参考UnityPlayerActivity的写法. 否则的话可能会出一些奇怪的问题, 例如没有去掉状态栏

l HuaweiSdk这个类要做修改, 在dontdestroyonload那里

l NGUI 也是可以调节图片的拉伸区域的

l UIPanel可以做到让超出的区域不显示. 所以这个还是很重要的

l C# 中没有设置回调内部类的方法. 因为根本用不着了, 可以直接使用代理方法就好了 delegate. 设置一个代理的方法就可以了,

l 用4.x版本做的游戏最好就在 4.x 上打开修改, 同时安卓类也要按照4.x的继承unityplayernativeactivity的写法, 在5.x上做的游戏最好就在5.x的版本上的打开然后修改, 不然的话会出各种问题的, 例如不全屏. 例如重力感应失效, 等等一系列的问题. 这是因为unity_class.jar 的版本不一致,. 而他内部的处理也是不一样的,

l 一定要记得动态生成的游戏物体的名字后面都会带上一个(clone). 所以如果要找这个物体的话也是必须要带上这个后缀的, 不然的话就会找不到

l Unity导出的时候会给清单文件自动加上一个启动模式singletask. 这个是要去掉的, 不然的话接华为sdk 的时候, 弹出的页面, 按下home键之后再返回就看不见了

l 假如是在面板中被TextAsset引用的文件的话即使不放在resouces 中. 打包出来一样是可以用的

l 在Inspector中赋的值, 在awake方法中就已经可以使用了, 已经是更新了的. 静态变量的话是不可以在inspector面板中赋值的

l 如果是在notepad++ 上的话有时候没有换行符也会换行, 所以最好是在notepad上显示看看

l GetComponentsInChildren() 这个方法是没有办法获取到不显示的孩子的, 但是还有一个重载的函数叫getComponentInChildren(true) 即使是孩子是不显示的也可以获取到, 而且还可以设置

l 上华为的游戏都要以hwgame结尾的包名

l NGUI 中如果一个UI控件要进行缩放动画的话最好是x,y,z 三个方向都进行一样的缩放, 不然的话如果控件内部包含有uiPanel的话就会出问题的.

l 对于NGUI 的tween来说, 如果调用了playreverse放法的话就不用调用resetToBeginning了

l Android 中获取streamingassets 目录下的文件只能用www 来下载, 下载对应的地址是”jar:file://”+Application.dataPath+”!/assets/”+文件名,带后缀

l Unity的模型都是有对应的shader 的, 会在一个tga或者是psd 上有自己对应显示的纹理或者说图片.

l 将C++ 通过NDK 导成so, 不能用def 的方式来保证方法名, 必须用extern “C”{} 所有要用到的方法都要放在大括号内部,  如果出现bug 说entrypointnotfound 的话就说明方法名出错了,  windows.h这个文件是没有什么作用的, 可以直接删掉, 要想引用头文件, 必须手动在properties 中添加 路径, 否则就会找不到头文件, 因为这些头文件实际上在NDK 中都是有的,  使用NDK 7 以上的话就不需要配置cgwgin 了. 调用的时候是直接用DLLImport(“名字”), 这个名字是去掉了lib前缀和.so后缀的, 只要中间那一块就好了. 在配置NDK 的时候可能在properties 中android下面找不到NDK 这个时候需要添加一个jar. com.Android.ide.eclipse.ndk_23.0.2.1259578.jar 然后就会可以找到NDK 这个选项, 就可以进行配置了

l 在初始化华为的sdk的时候, 如果key和密码有错误的话也会一直初始化不成功, 然后报请检查网络.

l OnApplicationPause 和OnApplicationFocus 是监听应用是否获取以及失去焦点的方法, 关键时候可能会用得到, 不过事实上一般根本用不着去监听,

l Unity 中的游戏物体对象或者是组件的个都是可以当做布尔值来使用的,

l FindObjectOfType<T>() 会寻找当前场景中第一个这个组件. FindObjectsOfType<T>() 就是寻找场景中所有的这种组件, 似乎是只会寻找到active 的.

l Vector3.normalized 获取该向量的单位向量. Vector3.magnitude 获取当前向量的长度. Vector3.distance(Vector3, Vector3) 获取两个三维向量之间的距离

l Vector2.lerp(start, dest, speed) 和Vector2.moveTowards(start, dest, disdelta) .前面这个方法是以速度做插值, 后面这个方法是以最大单位位移做插值, 意思是每次最多就加这个单位. 如果再加就超出的话就不加了. Vector2.angle 返回两个向量的夹角, 这个角是基于360度的角. 而不是弧度值

l OnCollisionEnter(Collision col) 这个方法是在刚体和碰撞器碰撞到的时候会调用, 两边都会调用. 都会获取到对方物体

l Ondestroy() 用于监听物体被销毁的时候的回调函数

l GameObject.addComponent<T>() 给游戏物体动态的添加一个组件.返回值是添加的这个组件对象

l GameObject.find(“名字”).sendMessage(“方法名”, 参数) 这个也是可以的, 而且这个是可以调用私有方法的

l Transform.detachchildren()跟子物体解除父子关系

l Unity 的脚本编译顺序如下: 首先最先编译的是在standard Assets , pro standard assets 和plugins 下的脚本. 因为这些脚本最先被编译, 所以在这里不可以引用其他文件夹里面的类或者变量.  然后编译的是这三个目录的Editor目录下的脚本, 然后是所有在assets/editor 外面并且不再前面两个文件夹下的脚本. 最后编译的是assets/editor目录下的脚本. JS 和C# 的脚本如果需要互相的调用的话, 不要写在同一个文件夹下

l Input.touchcount 这个好像是有在手机上才有效果的, 在电脑上是没有效果的. Touch.phase 是获取手指的触摸状态. Stationary是按下没有滑动.

l Transform 的rotation 在属性面板上显示是-180-180, 但是在实际代码输出的时候是0-360的

l 旧版GUI 系统可以通过先预设几个GUISKin文件, 然后通过GUI.skin设置进去, 这样的话, 所有在OnGUI 函数中绘制出来的UI 控件都会应用上对应的skin.

l GUI.tooltip 只有在触发的时候会有值, 一离开就又会变成空. 一般用作提示信息, 在点击按钮或者是鼠标位于按钮上的时候触发

l GUI 的depth属性好像越大, 反而是最先渲染了.  这个跟NGUI 是不一样的. 似乎, 这种写法是在OnGUI函数中的写法

l GUI 的UI 控件都是以左上角为其坐标, 所以0,0 的话就是刚好对应屏幕的左上方, 而不用再加上控件本身的宽高的一半

l GUI.passwordField() 用于绘制密码输入的输入框, 需要指定用什么字符来做遮罩

l GUI.setNextFControlName(“”), 用于指定下一个绘制的控件的名字. 在调用GUI.focusControl(“”) 的时候就会让这个控件获取焦点

l GUI.window本身是不可以拖动的, 需要的是在window函数中最后的位置调用GUI.dragwindow() 这样的话整个窗口都是可以拖动的了, 这个window函数必须是有一个形式参数int类型的

l UGUI 中的Canvas 中的UI 元素的绘制顺序就是这些UI 控件在canvas内部的排列顺序

l UGUI 中的canvas 可以设置渲染模式, 如果是world_space 模式的话, 那么就会有个相机去照射它. 还要调好位置才能看得见

l UGUI 中每一个控件的rect transform组件的左上角一个准星图标是用于设置anchor的.

l UGUI 的panel组件是一创建就和屏幕一样大

l UGUI 中的button 也和NGUI 差不多都是通过设置代理来弄的. 指定点击之后执行的方法是属于哪个游戏物体上的哪个脚本的哪个方法, 这个方法是可以有形式参数的

l UGUI 中的一个button如果设置模式是animation模式的话, 那么在创建animator之后, 打开window_animation 编辑这个动画, 的话实际上影响的也就是这个animator. 可以试运行的时候就可以看见, 另外就是 编辑的时候使用curve

l 把一张图片设置为Sprite的做法是, 点击这张图片, 在属性面板中把Texture Type设置为Sprite(2D和UI) 然后apply就可以了. 然后就可以设置给UGUI 中的Image组件了

l 对于一个GUI 的元素, 必须要是layer 为GUI 才可以监听到OnHover 之类的方法

l Animation.play() 是直接播放这个动画不会考虑当前正在执行什么, Animation.crossfade() 是平滑的过渡到当前动画

l 如果出现you should never nest widgets.这个bug 的话, 问题就是一个UISprite或者是UIlabel的父类不要出现有UISprite或者是UILabel. 这是老的NGUI 版本才会有的问题应该是, 3.6.8 以后的反正都没有这个问题了

l Atlas中的图片最好不要太多, 免得出现问题.

l Unity从人物模型中提取动画很简单的, 首先是选中这个人物模型, 然后右边的属性面板可以直接添加动画, 通过截取帧数

l Unity 中的Mathf.cos() 后面传的是弧度数

l Vector3 是值传递, copy一份, 而不是地址传递.结构体是值传递

l 如果出现UILabel的尺寸在显示的时候发生变化的时候有可能是因为设置了shrinktofit. 这样的话就是会把字在超出的时候选择缩小字体\

l 如果需要做圆盘效果的话最好的办法应该就是实时计算在圆中的位置,

l 销毁组件也是可以用GameObject.destroy();

l Dontdestroyonload 方法可以让一个脚本的对象一直保持存活而不销毁, 而且他所挂载的对象也不会销毁.  对象的awake方法也不会一直调用.

l UIPanel的子对象里面不要再有UIPanel ,. 不然的话soft clip 功能裁剪功能就失效了

l Mono中如果出现代码编辑中不能显示中文的话, 很有可能是当前的代码不是UTF-8的.只要用notepad 把它弄成utf-8 的就可以了, notepad 而不是notepad++ 可以直接另存为设置编码格式

l 用Unity4.x 创建工程的时候最好不要在中文路径下, 不然的话可能会出现创建失败的情况的

l 有时候如果出现打开同一个工程,但是屏幕适配出问题的话, 很有可能实际上是没有问题的, 只要打个包出来之后就好了. 可能是fixed on mobile 在没有导出过android 的包的时候不生效? 导致在unity上的显示出现异常. 实际上这个问题是因为平台的问题, 此时Unity并不知道你想导出到什么平台, 所以如果不导出apk的话就可以使用switch platform的方式, 切换一个平台 之后就好了

l 要将一个UIButton的状态设置为disabled ,同时更新按钮图片的话, 应该是设置isenabled, 设置enabled这个属性是木有用的

l PlayerPrefs 如果给某个键存为null的话, 获取出来的可能是””;

l UISprite 要设置type 为filled 才可以使用fillamount  这个属性用于控制显示多少

l 如果一个UIroot 的depth 比另一个高的话, 那么这个UIroot里面的东西一定会显示在另一个的上面, 也就是说UIRoot 的depth 的优先级比widget的优先级高, 也就是说一个UIRoot 是1, 另一个是0, 那么root为1 的面板下面的widget 即使depth 为0, 也会显示在root为0 面板下的depth 为2的widget上面, 也就是说先看UIRoot的depth

l C# 有用于解压缩的dll. ICSharpCode.SharpZipLib.Zip; 很好用, 已经试过了,

l Environment.NewLine用于替换”\r\n”

l 一个类如果是只有get 不能set的话, 那么在读取json数据赋值的时候会变成空的.

l 一个物体只有含有rigidbody才可以受力, 关节和碰撞的影响. 一个只含有碰撞器而没有刚体的物体只会对别的含有刚体的物体有作用. 但是本身是不受影响的. 两个物体都有刚体的时候, 一个物体即使勾选了is kinematic 也就是说只受脚本和动画影响, 这个时候他自己不受力的作用, 但是他在撞击另一个物体的时候,另一个物体是会受力的. 另外就是刚体是要碰到碰撞器才有作用的, 两个只含有刚体的物体相撞是没有效果的.

l getComponentInChildren 如果父物体本身就有这个组件的话,那么返回的就是父物体上的这个组件

l 如果一个物体的is kinematic 设置为true 的话, 那么修改刚体组件的angular velocity 对这个物体已经不会产生什么影响了.

l 改变刚体的位置的时候,. 物体本身的位置也会跟着变. 一般情况下,物体的位置会跟刚体的位置保持一致, 但是在高速运动的时候可能会出现一定的偏差.

l Rigidbody.moveposition(Vector3)  会让刚体移动到Vector3 所代表的位置.

l Rigidbody.moveRotation(rigidbody.rotation*Quaternion.euler(new Vector3(0,100,0)*Time.deltaTime)); 这个函数放在fixedupdate 里面可以让物体绕着自身的轴匀速旋转. ---好好研究研究四元数..

l 在用Litjson 解析json字符串的时候如果其中的某个字段对应的是一个对象的话可以这样. Data[“字段”].toJson() . 然后再解析成一个对象.

l Unity 4.x的dontdestroyonload 只会把当前的物体一直带入场景, 但是又回到那个场景的时候就又会创建一个然后又会运行, 5.x 的话就不会了, 就永远都是全局唯一了.

l 在写代码的时候,要写一个工具类. 成就的基类, 数据管理的类, 这个类用于存储玩家数据-这个类不用集成monobehaviour, 数据和视图分离, 免得出现过大的耦合.

l TimeSpan 在构造的时候传入的long值是ticks 这个值是秒的一千万分之一,

l Litjson解析的时候, 如果一个值是int,. 但是要赋值给long的话, 是会报错的, 但是可以先赋值给double 然后再转换成long

l NGUI中的anchor 有两种执行方式, 一种是OnEnable. 一种是OnUpdate. OnEnable 的话意思就是每次OnEnable 的时候自适应一次,. OnUpdate 的话就是每次OnUpdate 的时候自适应一次. , 但是似乎是如果一开始就显示的物体的话就不要用OnEnable 这种否则出问题,. 还有就是即使是设置的是OnEnable, 但是在OnEnable 中还是无法获取到anchor之后的位置

l SpinWithMouse 是NGUI 中用来做手指滑动控制物体旋转

l 一个物体的脚本是只要这个物体是enabled 那么这个物体的脚本的awake方法就会执行. 即使这个脚本时禁止的

l Android端播放视频, 在android中可以直接播放.MP4格式的视频,  播放的时候直接用Handheld.PlayFullScreenMovie("CG.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput); 就可以播放了,  而且是同步播放的. 播放完之后调用回调方法就好了. 这个是在android中的, 在电脑上的话因为会找不到视频所以会直接跳过. 也不会报错的.

l 粒子系统如果不是playonawake 的话动态加载的时候可能不会播放, 所以获取isStopped 的话可能一开始就是true了.

l 用NGUI 的UILabel 也可以调用UIWidget的pivot 使文本对其哪个方位

l Unity的震屏效果可以通过改变camera .rect 来实现. 正常的时候是rect(0,0,1,1) , 指的是从屏幕的左上角, 覆盖整个屏幕.  震屏的话可以通过改变rect的左上位置就好了

l NGUI 支持给文字加下划线[u]文本[/u] 这个样就会给文本加下划线

l 有时候粒子系统不会自动运行, 这样的话, 可以手动调用particlesystem.play() 就可以了

l 物体被销毁的时候, 脚本的OnDisable 也会执行

l 提升游戏的运行效率, 图片是很重要的, 有时候可以适当的压缩图集. 一个图集不要太大, 尽量让图集占满. 不要浪费, 因为这个是很占体积的. 即便是多个图集会造成需要多个drawcall.  但是如果一个图集太大的话, 在用到这个图集的图片的时候都不得不一次性加载整个图集, 很浪费性能的

l NGUI中显示图片除了UISprite之外还可以使用UITexture. 这个是不需要图集的

l 千万切记, 在Unity调用android方法的时候, android本地方法要runonuithread, 不然不会报错, 但是也没有效果

l GuiTexture可以在属性面板中通过add component 来添加, 这个是要在game视图中才显示的, x,y 如果设置0.5的话是代表居中. 通过调整scale 来设置大小. 另外也可以通过WH 来调整宽高, 通过XY 来调整位置. 也可以通过border 来微调位置.

l 3D 模型软件, 有: 3D max, maya, cinema 4d, blender

l 3D max 等建模软件的长度单位与Unity 是不一样的, Unity中的单位是m, 但是在3D max 中1cm就相当于Unity 中的1m了.

l Unity 中可以序列化一个类, 让这个类的属性可以在属性面板中编辑, 加上[serializable] 就可以了, 首先要using System;

l Unity中的#if #endif 判断平台的时候必须要在build 那里点击switch platform 才会生效的.

l 如果用户直接杀死进程的话, OnApplicationQuit是不会执行的. 事实上这个时候连android中activity的OnDestroy方法都不会执行

l Unity android 调用so 的方法, 很频繁的话也不会报错的. 妈的忘关流了

l 如果出现share violation on path 这个错误的话, 很可能是忘了关闭io流了, 好低级的错误啊.

l Unity android 最好使用ETC 格式的纹理, argb 16bit

l 天空盒是一个六个面的立方体, 它会在所有的图片最后绘制.

l API 中获取的时间都是系统上的时间, 也就是说如果人为的改变的手机上的时间, 那么真正显示的时间就会发生变化

l NGUI 中UILabel 的文本换行就等同于一个\n, 另外就是在读取配置的时候如果配的是\n的话,. 读出来实际上就是\\n. 然后需要替换.

l OnPress() 这个方法, 按下的话是必须点中碰撞器的区域, 但是松开的话是没有要求的, 在哪松开都可以的,

l 要做成那种一个页面被另一个层覆盖遮住,但是某一块要显示的, 可以通过改变NGUI 的unlit_transparent colored 这个shader 来实现, 具体可以参考自己的fps里面修改过后的这个, 这个实际上就是让Z 轴的深度产生了作用.. 这个效果是只有在game场景可以看见, 这个时候让最外层的那个panel的图片的透明度设为1, 就可以看见下面被遮住的东西了, 但是有一个前提是, 这张图片中透明的区域将还是一样无法显示, 所以要照一张没有任何地方是透明的图片. 改成这种shader之后, 如果场景中用到图片旋转的话, 那么确定必须是只旋转了Z轴, 不然的话会出现绘制的时候的遮挡, 造成显示不全,

l 一个物体要执行完了OnEnable之后才会执行下一个物体的Awake方法.  如果一些物体都是一开始就激活的, 那么awake的顺序是从下到上, 但是如果一开始他们都是没激活的, (例如他们有一个父容器, 父容器不激活). 那么激活父容器之后他们Awake的顺序是从上到下. 一样也是只有一个物体的OnEnable都执行完了之后, 才会执行下一个物体的Awake方法.  切记的一点就是Awake方法执行完之后就是OnEnable , 还有就是Unity 是没有多线程的. 还有就是Start方法是要在所有物体的Awake和OnEnable 都执行完毕之后才会开始执行的

l Unity中的instance变量指向对象本身, 当加载新的场景的时候这个对象销毁, 这个时候的instance 也会等于null. 应该可能是因为这个对象已经被销毁了. 这个应该是Unity帮我们改了吧.

l 如果一个类被禁用了,或者这个类所在的物体设置禁止了, 那么以前在这个类中启用的协程也就自己停止了, 不会再执行了.

l 如果要删smali中的Unity/ads 这个包, 必须把Unity Engine下面的advertisement 这个dll也给删掉, 不然的话就会报错, 唯一的解释就是这个dll下面的代码也是会自动运行的, 而不是一定要在assembly_csharp.dll中调用.

l Transform.find(“”) 这个是只会找儿子, 不会去找孙子

l 删除Unity 的X86 包下面的内容也可以减少不少体积, 因为那个也有好几兆.

l GUI.label(rect, string, style) 最后一个参数是GUIStyle, 可以直接传一个字符串表示风格, 例如”button” 代表是按钮的风格, “box” 代表是box的风格

l 如果给GUI.skin 赋值为null的话意思就是使用默认的皮肤,

l GUILayout.width(float), GUILayout.space(float). GUILayout.beginhorizontal();

l GUILayout.beginArea(rect).

l 一个不可见的物体一旦设置Active 就会立即把这个物体上脚本的awake 和onenable执行完, 然后才会执行setActive(true) 之后的代码.

l 扩展Unity中类的方法很简单的, 就是写一个静态类, 写一个静态的方法, 方法的第一个参数就是this 类名, 其他参数, 然后就可以用这个类名的对象调用这个方法了, 很简单的

l Unity游戏在打包成apk的时候把资源都打包在一起了, 图片shader声音之类的, 打包成一个.assets 之后又直接通过截流的方法把这个文件按照一兆为一个单位截成了很多个分支, 所以要合并的话就通过序列流合并就好了.

l 如果unity在打开的时候出现了fail to initialize unity graphic 的话, 问题很有可能是显卡太老, 更新一下显卡就好了

l 手机连接电脑之后无法打开的问题, 首先是点开电脑,右击计算机,管理-》设备管理器 android phone, 然后选中自己的手机然后右键点击更新手机驱动, 然后联网检查更新, 安装好之后就可以了

l Unity 4.x破解的时候, 很简单的其实, 首先是安装好之后什么都不要弄先, 清空C\programdata\unity  这个文件夹, 这个时候Unity里面也是没有liscense的, 这个时候首先用unity patcher 生成一个liscense 这个证书就已经在unity 的editor目录下了, 这个时候就可以finish安装, 然后就可以点击打开unity了

l Unity中NGUI 元素模块下面是可以添加非UI 元素的, 例如添加一个模型在下面, 然后放在另一个层, 这样是不会出问题的

l 模型中的动画, 完整的帧不是在take001中, 而是在下面的那个可以拖拽的横条上看, 拖到最末尾就可以知道有多长了了

l OnTriggerEnter 或者是OnCollisionEnter 这些方法是必须在当前脚本所在的物体就是这个物体的碰撞器或者是刚体所挂载的地方. 碰撞器父物体的这些方法是不会执行的, 很好理解

l Win7下复制文件全路径, 可以先按住shift键, 然后选中文件或文件夹, 右击复制全路径, 然后粘贴就可以了

l Unity 用animation来控制动画的时候, 播放完一个动画后会停在最后一个动作上,

l NGUI 中父物体的透明度设成0的话, 那么他下面的子物体就都看不见了.

l NGUI 中如果服务体的UIWidget取消勾选的话, 那么他的碰撞器就失效了.

l NGUI 中如果UISprite中图片选择一张在图集中没有的图片, 那么他就完全透明了, 但是此时他的碰撞器是可以用的哦.

l 只要像素是一样大的两张图片, 导出来的dds文件就会是一样大的

l Unity中读取DDS 文件的时候好像是按照图片垂直翻转的形式来读的

l 如果Unity Studio 不能打开一些texture2D 的图片, 提示说找不到那个什么dll的话, 很简答, 在win7 下面只要安装一个Visual studio2015 就可以了, 应该是这里面就包含了这个dll 吧, 可能

l UISprite 的flip属性就是旋转图片, 可以是横着旋转, 也可以是垂直旋转, 这样的话就不用设置一个UI 元素, 绕着Y啊Z 轴旋转之类的了

l Trail Renderer 拖尾渲染器,. 附着在一个物体上, 当物体移动的时候就会在物体的运动轨迹上显示一条光带.

l Unity 在打包的时候会把Editor安装目录下的那几个UnityPlayer的Activity原封不动的写到最终打包的代码中去, 所以如果是想自己加功能的话,则可以直接加,

l 替换的时候切记不要到处dds再替换, 应该直接用tex替换, 这样才不会出问题, 如果用dds 替换的话, 就会出现色差,

l 在打开别人的工程的时候最好是别人用什么unity的版本就自己也用哪一个版本免得出现问题, 有时候在电脑上运行没有问题, 但是在手机上运行的时候就会出现各种奇怪的问题

l ETC2- RGBA8 是在Unity中, 只有平台为android的时候才会有的. ETC1-RGB4 也是这样

l C# 的泛型限制, 写法是public class Wife<T> : parent where T: anotherParent; 意思就是wife这个类的泛型是T, 同时T 必须是继承anotherParent的, 其中Wife本身是继承Monobehavior的.

l 不同的Unity版本, 导出同样大小的图片, 同样的压缩配置, 导出来的tex也是不一样大的, 但是如果导出来的比理想中的要大一点的话, 很简单,直接在IO中去掉后面多出的字节就可以了

l UILabel.setcurrentpercent, 就是设置当前的百分比. 传入一个0-1的值, 显示百分数.

l  .meta文件会影响到一个模型导入时候的filescale这个值.

l Yield return null, 和yield return 0 都是一样, 下一帧继续执行.

l Unity只能不论是协程还是Invoke(“方法名”, 延时) 其中的延时都是通过Time来计时的, 计时的精度又是跟运行的帧数来确定的, 所以写一个很小的延时的话, 可能是不会起作用的, 最终执行时间还是由帧数决定, 例如写了0.01秒后执行,但是因为一帧的间隔都已经是0.02了, 那么最终执行就是0.02f的

l Unity 的Text 设置enabled 等于false的时候等于是隐藏的效果了

l 切割的时候还是直接用\r\n把. 因为文档的编写都是在windows上写的,  windows上的换行符是\r\n. 所以切割的时候直接用

l C# 中的DateTime.parse是用了0时区来计算的, 如果要计算我们本地的时间是要去TimeZone.currentTimeZone.toLocalTime来计算才可以. 这个就是就算0时区的那个时候, 当前时区的时间.

l 先执行按下, 然后执行松开, 最后才会执行点击事件.

l Animationclip在没有执行的时候enabled就是false, 执行的时候就是true.

l Unity中可以没有物体的样子, 然后只加一个collider. 这个也是有用, 而且如果是碰撞器而不是触发器的话, 还会有碰撞的效果. OnTriggerEnter一样也是会有效果

l Animationclip.normalizedtime 可以使一个动画在播放的时候定位到某个位置,0代表最开始, 1代表最后,0.5代表中间

l Animation.PlayQueued() 这个的话就会让添加进来的这个动画在上一个动画执行完毕之后执行.

l 在游戏场景中depth比较高的相机渲染的东西会完全覆盖depth比较低的相机渲染出来的东西, 也就是说depth比较低的相机渲染的部分是完全看不见的.

l 销毁一个已经被销毁的物体是没有关系的, 应该是做了非空判断的,

l Timescale=0 的时候, 会影响协程函数中的yield return new waitforseconds(); 函数,. 但是再重新开始设置TimeScale=1 就好了, 不会受影响, 只有是在这个gameobject都被隐藏掉了的时候, 这个时候这个协程就已经没有用了.

l 如果在awake中设置了Time.timescale=0,  那么start方法一样可以执行.Enable, OnDisable这些方法都是一样的会执行, 但是FixedUpdate就好像受影响了, Update和LateUpdate也不会受影响. 一样是照常执行,  

l 不管是NGUI 还是UGUI 的图片都有fill type这个属性, 如果设置成radar 的话, 意思就是圆形的, 通过设置value可以决定最终显示多少.

l 设置animation的speed对animationclip的normalizedtime属性没有什么太大影响, 一开始是0, 最后仍然是1. 只不过执行速度不一样,

l Unity的代码可以在外部进行编译, 然后放到Unity中, 一般是放在Plugins目录下, 然后就会自动把这个类里面继承Monobehaviour的类都显示出来, 一样可以挂载在场景的物体中, 这一点还是很厉害的, 实际上, 不管这个代码的dll放在哪里好像都是可以的, 没有什么问题. 他都能找到所引用的UnityEngine. 对于不是继承monobehaviour的类在unity中不会显示出来, 但是肯定也是可以用的.

l string ret=string.Format ("{0}:{1}:{2}","我","爱","你"); 这个就是把后面三个来替换前面的{0},1,2.

l Rotation*vector3 就相当于这个vector3 的向量绕着远点旋转了这么rotation这个变化. 要注意的是只能是rotation*vector3 不能是vector3*rotation.

l NGUI的图集除了压缩之外, 把图集类型从texture改成editor GUI and legacy 也能小一点. 还是很可观的

l OnGUI 函数给Gui.Button设置背景, 可以通过GUIStyle.normal.background 来设置, 这是一个texture2d 类型的图片, 设置文本居中可以使用guistyle.alignment 这个是一个textanchor类型的.

l Unity中也可以通过rect.contains 判断点击的位置是否在一个区域内,

l screenPoint 是以屏幕的左下角为原点的, 包括GuiTexture 和GUIText也是这样, GUITexture和GUIText 的X,Y 不能超过1.

l 改一个方法, 还要看exception handler 那个东东, 要删的时候, 那个也要删掉才可以. 不然的话就会报错的,

l Unity 3.x 话, 调用addcomponent<T> 这个T 还不能是类中类, 不然的话就无法添加组件. 4.x 5.x 都没这个问题, 这也是一个坑.

l VS 格式化代码, ctrl+k 然后ctrl+d, ctrl+k ctrl+c注释. ctrl+k, ctrl+u 取消注释

l #region 和#endregion 是用于折叠代码的, 在VS 中

l Unity scene场景中选中一个物体所显示出的点坐标, 不代表就是他的位置, 这个还受子物体影响, 妈的, 这也是很恶心的,

l Decimal d = 100m; 必须用m表示是一个decimal类型

l C#中字符串格式化, 填坑的个数必须大于等于挖坑的个数, 也就是必须保证每个挖的坑都要填上. 输出的顺序是按照挖坑的顺序, 例如, {1}{0} , 2,6  那么输出就是62.

l C# 中\b 的作用是backspace , 删掉左边的这个字符. 例如”我爱你\b胖梅” 最终输出就是我爱胖梅, 但是\b 放在字符串的两边是没有效果的.

l C# 可以直接使用File的静态方法操作. File.ReadAllText(路径). File.WriteAllText(路径, 字符串). 这一点还是很省事的, 根本都不用创建对象了

l C# 中的@符号有一个作用就是, 放在字符串前面表示这个字符串的转义字符\ 不起转义字符的作用.  例如@”我爱你\n 玉梅” 输出就是我爱你\n玉梅, 而不是我爱你换行玉梅. @ 符号还可以起到原格式输出的作用. 例如Console.writeLine(@“我爱你

l 玉梅”) 最终输出就是分两行的我爱你玉梅

l C# 中低于int 的数在做运算的时候都会转成int, 这个跟java是一毛一样的,

l C#中的decimal 和java中的bigdecimal 是不一样的, 前者是可以存小数的, 而且是精确到29位小数, 后者是一个取值范围更大的整数. C# 中的double 还可以强制转换成decimal, 这一点也是比较不一样的一点, decimal的取值范围虽然没有double 那么大, 但是精确度是更高的,

l C# 中的字符串格式化, 例如 double a = 0.34235; 保留两位小数a.tostring(“f2”); 还可以string.format(“{0:0.00}”,a) 都是给a这个数, 保留两位

l UIEventListener.get(gameobject).onclick+=方法, 也是可以给这个物体设置点击事件的, 只需要这个物体挂有boxcollider 就可以了. 方法会将gameobject传进去. 所以动态设置条目的点击事件的时候也可以不用eventdelegate的方法, 使用uieventlistener 也是可以的. 而且似乎会更简单,.

l 判断一个对象是否是某个类型可以使用gettype()==typeof(TYPE)

l Googleplay的登录方法在authoticate上

l GameObject.SendMessage(string method, object params) 这个就是传入一个参数, 这个参数是用于那个method的

l UIGrid的HideInactive 这个属性还是有用的. 这个属性的作用是, 如果当前Grid下面的物体是隐藏的的话, 通过GetChildList 返回就不会把那些隐藏的给添加进来.

l Instantiate 这个方法, 在实例化之后, 会在执行完生成物体上的脚本的Awake OnEnable之后, 才开始执行下面的代码, 如果这个物体实例化出来是挂在不可见物体下的话, 在执行OnEnable之后会马上就执行OnDisable 方法.

l Time.timescale 等于0 的时候Time.deltaTime 也受影响永远是0. 这个时候要计时的话可以考虑使用Time.realTimeSinceStartUp 这个数值是一直都在计算的.

l Gameobject.Find 是只能找到显示的物体, 但是Transform.Find 来找子物体, 就算自己是隐藏的, 子物体也是隐藏的也是可以找到的,

l Unity中的模型并不是都用到发现贴图的, 是否可以使用发现贴图是根据shader 来看的, 有些shader 是可以使用发现贴图, 有些是不可以的,

l 如果把粒子系统直接当成UI 的部分放在NGUI 的UIRoot里面的话,会导致scale的问题, 这个的话就要调一下了,  可能还会要调一下生命周期之类的东东,

l 一个audioclip 如果是3D 的话, 那么如果离audiolistener 太远的话就会没有任何声音, 如果想要任何时候都有声音的话, 就把这个声音设置为2D 的, 也就是去掉3D 那个标记就好了.

l C# 中的delegate 可以添加多个方法, 也可以重复添加一样的方法, 不会做任何判断,  

l C# 中的集合也存在并发修改的问题, 所以也是要注意一点, foreach 是只读的, 不能做增加, 删除之类的操作.  但是修改是可以的,  跟Java 一样

l 如果SVN 碰到出现XXX is scheduled to addition but is missing, 这种情况下就是revert, 然后把那个东东delete(有的话) 然后再提交.

转载自:https://blog.csdn/mr_henry_love/article/details/80409028

本文标签: 常识Unity