隐式转化:编译器自动识别, 指小盒子数据可以自动放入大盒子中 。从小到大依次为byte short int long
char 可以自动转为int long float double
float 自动转化为double
显示转化: 强制转化 。大盒子中数据需显示转化赋值给小盒子中
---------------------
1.unity 中 pivot 和center
pivot 旋转中心点,是物体围绕其自身旋转的中心点,默认是几何中心点,是旋转,缩放,等其他变换操作的基准点。
center 几何中心点,也叫包围盒的中心点,用于计算碰撞检测,物体模拟等与物体位置相关的计算。
-----------------------------
2local global
local;局部,物体的自身坐标,可以理解为上下左右
global : 全局,物体的世界坐标,可以理解为东南西北
-----------------------------
3.Input.GetAxis("") 获取在键盘或者游戏手柄上输入的某个轴(Axis)的值,""参数,表示要获取轴的名称
Horizontal:水平轴 Vertical 垂直轴 Mouse X 鼠标水平滚轮值 Mouse Y 鼠标垂直滚轮值、 数值都是在-1 导1 之间
Horizontal 向左为负数。向右为正数 默认由A、 D 或者方向键的左右键来触发
Vertical 默认由W,S 或者方向键的上下键来触发
Mouse X mouse Y 按住鼠标的任何一个键在水平 垂直方向的滚动值
--------------------------------
7.unity 基础概念
1.世界坐标系(左手系) x向右,y向上,z向里 对应position
2.unity尺寸的单位是1m
3.Camera组件:透视perspective 近大远小。 正交视图 Orithographic 也叫等距视图,这种情况下物体的显示与距离无关
4.网格Mesh,存储模型的形状数据,包括模型的顶点的位置,面的个数,方向等数据
模型是中空的,任何物体表面都是有若干三角面围成。mesh中记录了面和顶点的数据,面越多,物体表面越精细,gpu负担也越重
5.材质 material:定义物体的表面细节,比如颜色;金属/非金属;光滑粗糙;透明/半透明/不透明;凹陷/凸起
材质中的albedo:是反照率,定义物体的基本颜色
6.纹理 texture,也叫贴图,是表面材质的贴图,就是用一张图定义物体的表面颜色,对应于材质的albedo前的小方框
7.外部模型就是建模软件导出的fbx文件
8.平面plane:是没有厚度,正面可见,背面透明,所有平面的背面不会被渲染
9.轴心:pivot,指一个物体的操作(比如旋转等)基准点,坐标position为4,0,0,是指她的轴心点是4.0.0,默认就是几何中心点,但是可以指定为任何点
10.global模式:世界坐标系,6个方向分别是上下,东西 ,南北
Local:本地坐标系,已物体自身为轴,6个方向分别是上下前后 左右
11.子视图的坐标是相对于父物体而言的
12.空物体: 用于节点的管理和组织;用于标记一个位置
---------------------------------------------
5.变量特殊修饰符:
public 变量不在面板中显示: [HideInInspector]
private变量显示在面板中: [SerializeField]
变量的权限默认是private,可以省略不写
--------------------------------------
脚本声明周期
AWake(在里面可以实现单利,只调用一次) ---》 onEnable(激活时调用) --》 start (只调用一次)
--》 fixedUpdate(每个0.02s调用一次此方法)---》 update(每帧调用一次) --》 LateUpdate
--》 onDisable(与onEnable相反,未激活时调用) --》 onDestory
fixedUpdate ---- update ---------- LateUpdate
--------------------------------
多个脚本的执行顺序
方法1:先执行完所有脚本的awake,然后是所有脚本的start方法
方法2: projectSetting 中脚本执行顺序中设置
--------------------
事件的添加方法:
方法1:物体添加Event Trigger组件,然后加相关事件
方法2:(编写一个类,实现相关接口,然后把编写组件添加到物体上)脚本中添加IPointerClickHandler协议,实现相关方法onPointerClick。把脚本挂到obj上即可
方法3:程序动态添加:
事件系统的三要素: Graphic raycaster(在canvas中,事件监测) EventSystem ,Standolone Input Module 标准输入 缺一不可,否则UI元素就无法接收到事件
根据源码知道,添加输入Standolone Input Module 必须添加在enventSystem 节点上
有叠加的控件,是根据depth来决定谁响应事件
b区域大,a区域小 如果B是a的子对象,那如果a范围内的点击在a不处理是会传递给b
如果b跟a是兄弟关系,则a范围内的点击事件,就算a不处理,也不会传递给b
---------------------------------
游戏场景scene管理
同步加载 SceneManeger.LoadScene(参数1,参数2)
参数1: 场景在build setting中的编号 或者场景路径名称,如“scene/122”
参数2:场景加载模式LoadSceneMode,默认值是Single(此时参数2可以不写), additive 意思是两个场景同时存在
异步加载 SceneManeger.LoadSceneAsync()
参数与loadScene相同,返回AsyncOperation。通常写在携程中
AsyncOperation 相关参数:
.allowSceneActivation: 加载完成后是否跳转
progress 加载进度
.isDone 加载完并可跳转时为true
保留旧场景的物体gameobject。gameobject下的子物体等也一起被保留
DoneDestoryOnLoad(gameobject);
-----------------------------------
游戏物体GameObject
GameObject 表示空间的属性组件是Transform。用于控制物体的位置,旋转,做饭
2D空间下的物体就UI存在于Canvas下,表示空间的属性组件是RectTranasform矩形变化,用于改变物体的位置。旋转。缩放
gameobject的加载方式有哪些
方式1: 如果baseobj直接存在于cs脚本中,则直接克隆base
GameObject.Instantiate(baseObj)
方式2:1.从prefab中加载base物体
GameObject baseObj= Resources.Load<GameObject>("Hero/meigong");
Resources.Load是从Resources文件夹中加载各种资源,可以是prefab 图片等
例子的文件路径是Resources/Hero/meigong
2.克隆base
方式3:从ab包中加载
-------------------------------
------------------------------------------------------------
GameObject 移动
mx 是移动值。比如 mx = Input.GetAxis("Mouse X");
方法1.RigidBody.Velocity = transform.right *mx* speed
方法2 gameobject.transform.postion += new Vector3(0,0.1f,0);
方法3 gameobject.transform.Translate(vector3.up * Time.DeltaTime, space.Self);
GameObject旋转
方法1:RigidBody.angularVelocity = Random.onUnitSphere * 1f;(vector3)
方法2: gameobject.transfrorm.Rotate(vector3.right, space,world);
方法3:gameobject.transform.enlerAngles = new Vector3(100,3,1);
GameObject 缩放
gameobject.transform.localScale = new Vector3(3,1,3);
--------------
画布 Canvas :用于承载所有UI元素
画布有三种渲染模式Canvas 的RenderMode
1.Screen space-overlay 屏幕空间覆盖模式,UI永远在最前面
2.Screen space -camera 屏幕空间摄像机模式,则可以设置UI离相机的距离,如果cube等物体距离相机比UI近。就会穿透UI
3.wordSpace 不在相机可视范围内的画布就不会显示
画布的适配方式UIScaleMode
1Constant Pixel Size UI在任何分辨率下都不会缩放拉伸
2.Scale With Screen Size 根据屏幕分辨率自动调整ScaleFactor的值,它里面的Screen Match Mode 是设置根据高或者宽在不同的屏幕上缩放
------------------------------------------
脚本优化:
1.可能需要使用object pool(对象池),需要反复创建,销毁的对象可存入对象池,
2.是否必须写在update?分帧
3. 确保一直存在的进来写在start。少在update中写
4.少用find,直接用public来定义
5.尽量少用复杂的物理引擎,比如刚体等
6.尽量少用复杂的数学运算
6.尽量避免全局缓存资源
7.profiler多要用,多分析
---------------------------------------------------
局部光照:现实世界中会有物体的表面反光影子,有所有物体相互直接的光照效果,unity中的光照只是自身的光照情况,所以是局部光照
全局光照: unity5开始出现,物理上是不存在全局光照, 利用的技术有lightmap(预计算的离线光照)
light probe (光照探头,表现被静态物体照射的静态物体)
refiection probe (反射探头,动态物体对周围物体的反射) 自反光物体Emission
---------------------
移动平台图形渲染上可做的优化
1.顶点数控制在80k以下,指全屏可见的顶点数
2.最多用一盏实时光
3.不用阴影
4.少用粒子系统,发射器数量30以下,粒子数200以下
5.用animation 不用animator
6.不用跟骨骼动画(是animator中的一种动画)
7.减少光滑组(跟美术沟通,会导致顶点数增多)
8.不使用法线贴图,静态物体使用法线贴图,需提前烘焙
9.不使用flog(雾),好处是遮住远处的物体
10.不使用alaha test(alpha test 就是shader 为Legacy shaders -》Transparent -》 cutout下的所有),ios设备不支持alpha test
需改为Legacy shaders -》Transparent -》 Bumped Diffuse。
11.移动设备的shader尽量在Mobile中选择
12.远处物体绘制到skybox上
13.合批
14.骨骼数控制在30一下