day1
1.Material:Material(材质):物体的材质是指:“色彩”、“纹理”、“光滑度”、“透明度”、“反射率”、“折射率”、“发光度”等...即可以添加上述属性。
2.Mesh Collider:网格碰撞体 (Mesh Collider) 采用网格资源 (Mesh Asset) 并基于该网格构建其碰撞体 (Collider)。对于碰撞检测,这比将基元用于复杂网格要精确得多。标记为 凸体 (Convex) 的网格碰撞体 (Mesh Collider)可以与其他网格碰撞体 (Mesh Collider) 碰撞。
属性: | 功能: |
为触发器 (Is Trigger) | 如果启用,此碰撞体 (Collider) 则用于触发事件,会由物理引擎忽略。 |
材质 (Material) | 引用可确定此碰撞体 (Collider) 与其他碰撞体 (Collider) 的交互方式的物理材质 (Physics Material)。 |
网格 (Mesh) | 对用于碰撞的网格的引用。 |
平滑球体碰撞 (Smooth Sphere Collisions) | 启用此项时,会使碰撞网格法线平滑。应对平滑表面(例如没有硬边缘的丘陵地形)启用此项以使球体滚动更平滑。 |
凸体 (Convex) | 如果启用,则此网格碰撞体 (Mesh Collider) 会与其他网格碰撞体 (Mesh Collider) 碰撞。凸体网格碰撞体 (Convex Mesh Collider) 限制为 255 个三角形。 |
day2
1.创建的物体要添加到Material之后才能更改渲染属性,如颜色。比如创建一个cube之后,需要添加到material之后才能更改颜色。
2.将脚本挂载到object上时,类名要和脚本名字一致,否则会出错
3.c#脚本常用代码类:
float h = Input.GetAxis("Horizontal"); //这个代码的意思是 对应键盘上面的左右箭头,当按下左或右箭头时触发
float v=Input.GetAxis("Vertical"); //对应键盘上面的上下箭头,当按下上或下箭头时触发
float m=Input.GetAxis("Mouse ScrollWheel"); //当鼠标滚动轮滚动时触发
以上方法:GetAxis()返回值为-1,0,1的值,(有相应按键按下时返回-1或1,没有按键按下时则返回0,所以用if判断语句时要注意)以确定在目标轴的正负方向上移动。
4.Transform类的介绍:Transform类的介绍
5.建造了一个类,却无法显示在inspector上,原因:要用序列化存储的解决:
[System.Serializable]
序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
day3
1.导入asset包时要注意,可能会和之前的资源矛盾(主要是脚本冲突),导致出现:
the associated script can not be loaded
please fix any compile error
and assgin a vaild script
(问题没解决 ,所以只能推倒重来)
2.为object添加rigidbody(刚体)属性后,要注意重力的影响因素(比如运行后下坠)。
3.rigidbody里的constraints(约束)可以选择关闭某个轴方向上的旋转,减少在碰撞检测时拐角处的旋转。
4.Update和FixedUpdate的区别:
Update | FixedUpdate |
update跟当前平台的帧数有关 | FixedUpdate是真实时间,所以处理物理逻辑的时候要把代码放在FixedUpdate而不是Update |
Update是在每次渲染新的一帧的时候才会调用,也就是说,这个函数的更新频率和设备的性能有关以及被渲染的物体(可以认为是三角形的数量)。在性能好的机器上可能fps 30,差的可能小些。这会导致同一个游戏在不同的机器上效果不一致,有的快有的慢。因为Update的执行间隔不一样了。 | FixedUpdate是在固定的时间间隔执行,不受游戏帧率的影响。有点像Tick。所以处理Rigidbody的时候最好用FixedUpdate(ps:FixedUpdate的时间间隔可以在项目设置中更改,Edit->ProjectSetting->time 找到Fixedtimestep。就可以修改了。) |
ps:使用FixUpdate可以消除刚体碰撞检测时出现抖动的鬼畜情况(Update是在每次渲染新的一帧的时候才会调用,FixedUpdate是在固定的时间间隔执行,可理解为Update按键时,不同帧的受力情况不均匀,所以出现了抖动)。
5.Unity2D游戏层级渲染问题:可以用Sorting Layer和Order int Layer属性,后者可以看作前者的子类(说法可能不对,但是意思就是一个Sorting Layer层可包含多个Order int Layer的object)。解决图片层叠在一起时的渲染问题,一般情况下,我们只需要用到Order int Layer属性,该值越大,越后渲染,即值大的会覆盖值小的。
6.欧拉角转四元数:
欧拉角:欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度
四元数:在计算机图形学中,四元数用于物体的旋转,是一种较为复杂,但是效率较高的旋转方式。在三种坐标变换:旋转,平移,缩放当中,旋转应该算是比较复杂的存在。平常我们接触的比较多的是矩阵变换和欧拉变换。
day4
1.yield return作用:在 return 时,保存当前函数的状态,下次调用时继续从当前位置处理。
2.LOD为Levels of Detail的简称,简单来说即为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
如上,将模型保存为FBX后,导入Unity进行测试,命名的方式建议是在物件的后面加上LOD的层级代号,这样比较方便我们直接用名称来选择高模与低模。
详解见:Unity3D之LOD技术详解
day5
1.unity的一些快捷键:
F:选中物体后按F键,可以使选中物体居中。
alt+鼠标左键:选中物体后,按住alt再通过鼠标左键使视野围绕选中物体旋转。
alt+鼠标右键:选中物体后,按住alt再通过鼠标右键使选中物体放大缩小 。
鼠标右键+W、S、A、D、Q、E:选中物体后,按住鼠标右键后,再按W、S、A、D、Q、E,可以实现视野的向前、向后、向左、向右、向下、向上小距离移动。
2.camera
1)clear flags:
1))天空盒(sky box):围绕整个场景的包装器,用于模拟天空的材质。
天空盒材质种类:6 sided、procedural、cubemap。
使用天空盒:
方法一:摄像机添加组件skybox
方法二:光照窗口:window-lighting-environment lighting--sky box可作为反射源将天空色彩反射到场景中的物体。
2)projection:选择摄像机模式
perspective:三维模式,在此选择下,可以通过其下的field of view选择镜头大小,此功能可以实现fps游戏狙击枪的开镜功能
orthographic:二维模式。
3)clipping planes:选择相机裁剪范围(即视野大小)
near:近处的裁剪范围。用得较少
far:远处的裁剪范围。可以通过脚本修改此参数来实现由近到远或者由远到近的视野刷新效果。
4)viewport rect:可以改变game窗口的大小、位置。
X,Y:表示把视野从X、Y轴移动,0,1表示边缘。
W,H:表示调整画面的长度、宽度,1表示全屏。
5)depth:表示相机的渲染深度(顺序),比如小地图,如果大地图(camera)的depth比小地图(camera)的depth高,则game界面中会没有小地图camera捕捉到的画面。可以理解为渲染顺序上的差异
day6
1.instantiate:instantiate函数是unity3d中进行实例化的函数,也就是对一个对象进行复制操作的函数。
//参数一:是预设 参数二:实例化预设的坐标 参数三:实例化预设的旋转角度
GameObject instance = (GameObject)Instantiate(obj, transform.position, transform.rotation);
2.Debug.LogError():在使用此方法后,后面的程序似乎不会被执行(自己调试出来的,不知道对不对)。所以Debug.LogError()一般在条件控制语句里使用,否则会引发不必要的错误。调试时,可以使用Debug.Log(),显示信息即可。更多用法参见:Debug使用
day7
1.Unity中Update,LateUpdate,FixedUpdate的区别:
1)Update():每一帧执行时,都会立即调用此方法。
2)LateUpdate():LateUpdate是在所有Update方法调用之后被调用,跟随物体的相机可以在LateUpdate里实现(虽然是在同一帧中执行的,但是Update会先执行,LateUpdate会晚执行)。
3)FixedUpdate():固定更新。默认情况下,系统每0.02秒调用一次,具体的间隔时间可以在 TimeManager 中配置。
Update() 和 LateUpdate() 属于立即更新,更新之间的频率是不固定的,比如某一帧有一个耗时操作时,就会影响到下一帧更新时间,所以对更新频率要求比较稳定的物理系统(如Rididbody)就不太适合在这里处理更新。
FixedUpdate() 虽然是固定更新,但是其实也是相对固定的,比如某一帧耗了好几秒,它依然会卡住。不过正常的程序会优化耗时操作,小范围的帧率波动是正常的,可以让它更新的时间间隔稍微长一点,这样它的更新是比较平滑的。在实际的开发中,例如以秒为单位的倒计时,并不需要每一帧去判断时间,所以用 FixedUpdate 就再合适不过了。
day8
1.Gameobject和Transform区别:Gameobject是一个父集,派生自Object。而Transform只是Gameboject的子集,它包含如位置、旋转、缩放信息,它派生自Component,属于组件。
day9
2.万向锁:
day10
2.在对预制体(Prefabs)的子对象进行操作时,在Inspector面板选择 Revert All,会撤销对当前子对象进行的所有修改,选择Apply All,则会把当前子对象的修改应用到Prefabs以及Prefabs的子对象上。
day11
1.关于UI系列组件:UI系列组件
2.脚本必然事件:
Awake():脚本加载时被调用。
Start():Update()第一次调用前调用。
Update():每帧调用。
LateUpdate():每帧调用一次(在Update()之后)。
Fixedpdate():每个固定物理时间间隔调用。
OnGUI():每帧调用两次。
day12
1.transform.localEulerAngles:使用localEulerAngles进行旋转的时候,我们要使用transform.localEulerAngles = new Vector3(x, y,z); 其中,new Vector(x,y,z)为游戏物体最终旋转到的目标角度,x.y,z的值分别都是以0为基准,假设游戏物体的初始角度为(x1,y1,z1),则游戏物体从(x1,y1,z1)旋转到(x,y,z),但是是以父游戏物体的坐标系为参考(自己是顶级游戏物体除外)。
2.transform.eulerAngles:
transform.eulerAngles= new Vector3(x,y,z)
new Vector(x,y,z)为游戏物体最终旋转到的目标角度,x.y,z的值分别都是以0为基准,假设游戏物体的初始角度为(x1,y1,z1),则游戏物体从(x1,y1,z1)旋转到(x,y,z),,同时也以世界坐标系为参考,而不是以父级游戏物体的坐标系为准。
3.transform.Rotate(参数):
transform.Rotate(x,y,z):以自身坐标系为参考,而不是世界坐标系,分别以x度y度z度绕X轴、Y轴、Z轴匀速旋转
transform.Rotate(轴,Space.Self):以自身坐标系为参考
Transform.Rotate(轴,Space.World):以世界坐标系为参考
旋转时,各个角度是累加的。
day13
在VS中调试Unity项目的时候,打开项目属性进行一些配置(比如框架版本切换)。但是发现点了项目属性之后闪了一下就立马自动关闭了,后来找了很久发现了问题。
解决方法如下:
打开工具菜单---选项---适用于Unity的工具---常规---杂项---访问项目属性:将false改为true。
day14
c#中的@作用:让转移bai字符"\"保持原意,不要转义,如一个地址字du符串
string path="c:\abc\";
让\n中的转义字符\失效,变为单独的字符串“\n”。