编辑代码

隐式转化:编译器自动识别, 指小盒子数据可以自动放入大盒子中 。从小到大依次为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一下