答:1.直接监听事件:在按钮上绑定一个带有OnClick脚本,但这种方法不太好用,也不灵活。
2.ButtonScript:在按钮上添加BoxCollider,在添加ButtonScript脚本,把要调用的方法放到场景中一个物体上,一般放在摄像机上,因为摄像机一直存在,然后把这个方法添加到ButtonScript脚本里写好的委托里面,所以可以添加多个方法,一旦点击就触发事件。
答:Panel是一个容器,它将包含所有UI小部件,并负责将所包含的部件组合优化,以减少绘制命令的调用。
Anchor是NGUI中屏幕分辨率的自适应性,来适应不同的分辨率的屏幕显示。
答:1.不美观
2.OnGUI很耗费时间
3.使用不方便
4.drawcall很高
答:GUI.DragWindow()
答:1.使用本身的GUI
2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴
3.使用2d插件,如:2DToolKit
答:在两个平面上分别取一个向量,然后看是否相交
答:MeshCollider是网格碰撞器,对于复杂网状模型上的碰撞检测,比其他的碰撞检测精确的多,但是相对其他的碰撞检测计算也增多了,所以一般使用网格碰撞也不会在面数比较高的模型上添加,而会做出两个模型,一个超简模能表示物体的形状用于做碰撞检测,一个用于显示。
答:1.碰撞器物体不能互相进入到对方内部,触发器可以
2.触发器角色控制器可以使用,碰撞器中不能使用
3.触发器没有物理属性了,碰撞器可以有力存在
4.碰撞器调用OnCollisionEnter/Stay/Exit函数,触发器调用OnTriggerEnter/Stay/Exit函数
答:两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
CharacterController和Rigidbody的区别?
CharacterController自带胶囊碰撞器,里面包含有刚体的属性;
Rigidbody就是刚体,使物体带有刚体的特征。
答:穿透(碰撞检测失败)
避免的方法:把刚体的实时碰撞检测打开CollisionDetection修改为Continuous Dynamic
在unity3d中物体发生碰撞的整个过程中,有几个阶段,分别列出对应的阶段函数
主要是三个阶段:1.Collider.OnCollisionEnter进入碰撞,
OnCollisionEnter is called when this collider/rigidbody has begun touching
another rigidbody/collider.
当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用。
2.Collider.OnCollisionStay 逗留碰撞,
OnCollisionStay is called once per frame for every collider/rigidbody that is
touching rigidbody/collider.
每个collider/rigidbody触动rigidbody/collider,将在每帧调用OnCollisionStay。通俗的说,
一个碰撞器或刚体触动另一个刚体或碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开不接触。
3.Collider.OnCollisionExit 退出碰撞,
OnCollisionExit is called when this collider/rigidbody has stopped touching
another rigidbody/collider.
当 collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用。
答:
答:主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。
1.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画。
2.单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
3.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观,皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。
答: 反转动画,将动画的速度调到-1。
答:AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样 、CrossFade淡入淡出切换动画、IsPlaying是否正在播放某个动画
答:动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画
答:ITween是补间动画的一个插件,主要作用就是给出开始、结束的值、时间,此插件实现各种动画,晃动,旋转,移动,褪色,上色,音量控制等等。
方法:1.MoveTo 物体移动
2.ColorTo:随着时间改变对象的颜色组
3.LookTo:随时间旋转物体让其脸部朝向所提供的Vector3或Transform位置
答:法线贴图:是一种特殊的纹理,可以应用在3D表面,让低模呈现出更明显的凹凸效果。一般应用在CG动画、美术效果要求较高的单机游戏
CG动画:游戏中的CG动画其实是用3D模拟引擎制作的游戏短片,一般画面效果比较真实。
答:Unity支持多线程,如果同时要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:1.虽然支持多线程,但是仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用,所以如果使用的话需要把组件中的数值传到开启的新线程中。
2.C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
答:多线程程序同时运行多个线程,除主线程之外的线程无法访问Unity3D的对象、组件、方法,而在任一指定时刻只有一个协程在运行。
答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。
答:所谓四元数,就是把4个实数组合起来的东西。4个元素中,一个是实部,其余3个是虚部
作用:四元数用于表示旋转
优点:
1)能进行增量旋转
2)避免万向锁
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁]
四元数由4个数组成,旋转矩阵需要9个数
两个四元数之间更容易插值
四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化 (orthogonalize),对四元数规范化更容易
与旋转矩阵类似,两个四元组相乘可表示两次旋转
答:游戏界面可以看到很多摄像机的混合
答:正交和透视
正交无法看到一个物体距离自己有多远,或者远近的变化,物体也不会随着距离而收缩,所以一般做2D游戏或者是UI时会使用正交摄像机。
透视一般看物体会随着距离有大小的变化,一般3D游戏里经常使用这种摄像机。
答:Prefab是预制物,一般当游戏中需要频繁创建一个物体时,使用预制物可以节省内存,方便创建,方便对游戏物体进行操作,方便对属性进行修改。
答:动态加载再实例化,如果自己不主动清理内存的话,再次加载不会增加内存的,会自动去取之前已经加载好的assets,如果这一个assets你都嫌多的话,那你只能减资源了,比如,模型面数,纹理尺寸等
答:实际光照强度l=环境光(lambient)+漫反射光(Idiffuse)+镜面高光(lspecular)
环境光:lambient=环境光强度(Aintensity)*环境光颜色(Acolor)
漫反射光:ldiffuse=镜面光照强度(Dintensity)*镜面光颜色(Scolor)*(光的反射向量(R).观察者向量(V))^镜面光指数(n)
答:MeshRender是模型渲染的组件,有此组件物体才能显示出来
Material是材质球,实际就是shader的实例,并进行赋值,贴图、纹理、颜色等。
Shader是着色器,实际上是一段程序,还可以用来实现一些仅靠贴图不容易实现的效果,如玻璃。
Shader大致分为:1.表面着色器
2.顶点和片元着色器
3.固定功能着色器
答:Alpha Blend是 实现透明效果,Color = 原颜色*alpha/255+目标色*(255-alpha)/255
答:1.使用光照贴图比使用实时光源渲染要快
2.可以降低游戏内存消耗
3.多个物体可以使用同一张光照贴图
答:顶点着色器:顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的
transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。
.unity3d提供了几种光源,分别是什么
答:4种,Directionllight ,Point Light ,Spot Light,Area Light
答:FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
答:Awake –>OnEnable->Start
OnEnable在同一周期中可以反复地发生
答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
答:FixedUpdate因为不受到计算机帧频的影响,所以比较适合于做物理方面的更新。
答:LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。
当renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible 当renderer(渲染器)在任何相机上可见时调用:OnBecameVisible
答:PlayerPrefs.SetInt()
PlayerPrefs.GetInt()
答:1.Resources.Load();
2.AssetBundle
区别:
Resources是动态内部调用,Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle是外部调用,要用AssetBundle首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。
简单说,Resources资源的加载是动态加载内部的,AssetBundle是动态加载外部的
答:MonoBehaviour.OnLevelWasLoaded
答:Destory
答:获取:GetComponent
增加:AddComponent
没有删除组件只有让组件不生效:enable
答:加载关卡
答: Debug.Log();
答:层索引
答:localPosition:自身位置,相对于父级的变换的位置,局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。
Position:在世界坐标transform的位置,世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。
答:Transform.Rotate()
答:Transform.RotateAround()
答:Transform 父类是 Component
答:
int scend;
int minte;
int hour;
void Start()
{
scend=0;
minte=0;
hour=0;
}
void Update()
{
If(scend<60)
{
Scend+=time.deltime;
}
Else
{
Scend-=60;
Minte+=1;
}
If(minte>=60)
{
Minte-=60;
Hour+=1;
}
}
答:添加刚体使小鸟模拟受到重力影响。
1. 答:using UnityEngine;
2. using System.Collections;
3. public class QizhongjiCS : MonoBehaviour {
4. private float dianX = 0;
5. public GameObject hook;
6. private float yuandianX;
7. private Vector3 hookV;
8. private int flag=0;
9. private delegate void HookMove();
10. private HookMove _hookMove=null;
11. private int speed=3;
12. public HookZhongWu hzw;
13. private int zwFlag=0;
14. private GameObject zhongwu; //抓住的重物;
15. public GameObject shengzi;
16. public GameObject heng;
17. // Use this for initialization
18. void Start () {
19. hookV = hook.transform.localPosition;
20. yuandianX = hookV.x;
21. }
22. // Update is called once per frame
23. void Update () {
24. if (flag == 0) {
25. if (Input.GetMouseButtonDown(0))
26. {
27. dianX = Input.mousePosition.x;
28. }
29. else if (Input.GetMouseButton(0))
30. {
31. float dx = Input.mousePosition.x - dianX;
32. if (Mathf.Abs(dx) > 0.1f)
33. {
34.
35. hookV.x = yuandianX + dx / 32;
36. if (hookV.x > -6 && hookV.x < 6)
37. {
38. hook.transform.localPosition = hookV;
39. }
40.
41. }
42. }
43. else if (Input.GetMouseButtonUp(0))
44. {
45. //yuandianX = hookV.x;
46. flag = 1;
47. _hookMove = hookDown;
48. StartCoroutine(downZhua());
49. }
50. }
51. }
52. IEnumerator downZhua() {
53. yield return new WaitForSeconds(0.01f);
54. //1、向下移动, +speed
55. //2、判断移动的位置 如果大于某个位置 ,返回 speed为负
56. if (_hookMove != null)
57. {
58. _hookMove();
59. yield return StartCoroutine(downZhua());
60. }
61. else {
62. yield return null;
63. }
64. //3、判断移动回到原点 整个钩子向原始位置水平运动
65. //4、判断钩子回到原点 停止协程 flag=0
66. yield return StartCoroutine(downZhua());
67. }
68. void hookDown() {
69. hook.transform.Translate(Vector3.down * Time.deltaTime * speed); changeShengZi();
70. if (hook.transform.localPosition.y < -2) {
71. if (zwFlag == 1) {
72. zhongwu.transform.parent = null;
73. zhongwu = null;
74. zwFlag = 0;
75. }
76. _hookMove = hookUp;
77. }
78. }
79. void hookUp()
80. {
81. hook.transform.Translate(Vector3.up * Time.deltaTime * speed);
82. changeShengZi();
83. if (hook.transform.localPosition.y >3.2)
84. {
85. _hookMove = HMove;
86. }
87. }
88. void HMove()
89. {
90. hook.transform.Translate(Vector3.left * Time.deltaTime * speed);
91. if (hook.transform.localPosition.x <=-4.5)
92. {
93. if (zwFlag == 0)
94. {
95. flag = 0;
96. _hookMove = null;
97. }
98. else {
99. _hookMove = hookDown;
100. }
101. }
102. }
103. public void zhuaZhongWu(GameObject zhongwu) {
104. _hookMove = hookUp;
105. zwFlag = 1;
106. this.zhongwu = zhongwu;
107. }
108. void changeShengZi() {
109. Vector3 hookPosition = hook.transform.position;
110. Vector3 hengliangP = heng.transform.position;
111. float dy = hookPosition.y - hengliangP.y;
112. Vector3 shengziP = shengzi.transform.position;
113. shengziP.y = hengliangP.y + dy / 2;
114. shengzi.transform.position = shengziP;
115. //改变 绳子长度
116. Vector3 shengziSclae = shengzi.transform.localScale;
117. shengziSclae.y = dy/2;
118. shengzi.transform.localScale = shengziSclae;
119. }
120. }
HookZhongWu.cs用来判断钩子是否和重物碰撞
碰上的时候将重物设置成钩子的子对象 就可以实现带着往上升的效果了
1. public class HookZhongWu : MonoBehaviour {
2. public QizhongjiCS qzj;
3. void OnTriggerEnter(Collider collision)
4. {//当碰撞时
5. print("OnTriggertEnter+" + collision.gameObject.name);
6. if (collision.gameObject.name == "zhongwu") {
7. collision.gameObject.transform.parent = this.gameObject.transform;
8. Vector3 v = collision.gameObject.transform.localPosition;
9. v.y = -1.2f;
10. collision.gameObject.transform.localPosition = v;
11. qzj.zhuaZhongWu(collision.gameObject);
12. }
13. }
14. }
答:在场景中添加一个Plan,Camera,Directional Light,Cube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。
1.鼠标滚轮实现缩放:将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void Update () { //鼠标滚轮的效果 //Camera.main.fieldOfView 摄像机的视野 //Camera.main.orthographicSize 摄像机的正交投影 //Zoom out if (Input.GetAxis("Mouse ScrollWheel") < 0) { if (Camera.main.fieldOfView <= 100) Camera.main.fieldOfView += 2; if (Camera.main.orthographicSize <= 20) Camera.main.orthographicSize += 0.5F; } //Zoom in if (Input.GetAxis("Mouse ScrollWheel") > 0) { if (Camera.main.fieldOfView > 2) Camera.main.fieldOfView -= 2; if (Camera.main.orthographicSize >= 1) Camera.main.orthographicSize -= 0.5F; }} |
2.鼠标实现在场景中拖动物体:
解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理
主要代码如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Use this for initialization void Start () { StartCoroutine(OnMouseDown()); }
IEnumerator OnMouseDown() { //将物体由世界坐标系转换为屏幕坐标系 Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标 //完成两个步骤 1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系 // // 2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离 //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离 Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z)); while (Input.GetMouseButton(0)) { //得到现在鼠标的2维坐标系位置 Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z); //将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量 Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset; //curPosition就是物体应该的移动向量赋给transform的position属性 transform.position = curPosition; yield return new WaitForFixedUpdate(); //这个很重要,循环执行 } } |
答:PhysicMaterial 物理材质:主要是控制物体的摩擦,弹力等物理属性。
Material材质:主要是控制一个物体的颜色,质感等显示。
答:CharacterController自带胶囊碰撞器,里面包含有刚体的属性;
Rigidbody就是刚体,使物体带有刚体的特征。
答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。
答:Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
答: Unity内一种用于实现自动寻路的网格
答:四种。
平行光:DirectionalLight
点光源:PointLight
聚光灯:SpotLight
区域光源:AreaLight
答:Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
JavaScript
C#
Boo
答:1)点乘计算两个向量之间的夹角,还可表示某一方向的投影
2)叉乘得到的是法向量
3)标准化向量:用在只关系方向,不关心大小的时候
答:用于表示线性变换:旋转、缩放、投影、平移、仿射
注意:矩阵的蠕变:误差的积累
答:Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
答:render是渲染器,渲染器可以使物体显示在屏幕上。
MeshRender是网格渲染,SkinnedMeshRender是蒙皮网格渲染器
答:骨骼蒙皮动画,模型本身是静态的,是因为通过蒙皮,使模型每个点都有Skin数据,Skin数据包括顶点受到哪些骨骼影响以及这些骨骼影响顶点的权重值,还有动画数据,有了Skin数据的模型就可以根据动画数据进行显示动画了。
答:组件上绑定的对象被删除了
答:1)将Assets目录和Library目录一起迁移
2)导出包
3)用unity自带的assets Server功能
答:LOD是Level of detail简称,意为多层次细节,是最常用的游戏优化技术,LOD技术指根据物体模型的几点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态的选择渲染不同细节的模型
缺点:增加美工工作量,增大了游戏的容量。
答:自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域收不到光照照射而形成的阴影。
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后在按视点位置对场景进行相应处理得到所要求的师徒(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)若是动态光源此方法就无效了。
答:MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
答:
答:指定身体的某一部分是否参与渲染
答:需要得到Mono.Data.Sqlite.dll 文件与System.Data.dll文件
答:1.压缩自带类库
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉
3.释放AssetBundle占用的资源
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小
5.使用光照贴图
6.使用多层次细节(LOD)
7.使用着色器(Shader)
8.使用预设(Prefab)等
答:NGUI/DF/ITeen
a. Camera
b. Light
c. Render settings
d. ProjectSetting=》Player=》OtherSettings