Unity面试题F(Yanlz+...+F高薪就业+...+立钻哥哥+...)

《Unity面试题》

版本

作者

参与者

完成日期

备注

Unity_JobView_V01_1.0

严立钻

 

2018.07.26

 

 

 

 

 

 

 

 

 

 

 

#Unity面试题ABC:https://blog.csdn.net/VRunSoftYanlz/article/details/78630687

#Unity面试题D:https://blog.csdn.net/VRunSoftYanlz/article/details/78630838

#Unity面试题E:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913

#Unity面试题F:https://blog.csdn.net/VRunSoftYanlz/article/details/78630945

 

 

 

 

 

##《Unity面试题》发布说明:

++++“Unity面试题”是对在Unity职位面试中相关技术点的总结,立钻哥哥按照一个简单的章节分类进行整理。

++++当然,这些技术点有些是Unity常用的技术点,有些是各种面试题筛选整理,也有些是对Unity面试点的推断拓展。

++++“Unity面试题”将打造成Unity技术宝库,不但是面试的重要参考资料,也是对Unity知识点的汇总。

++++“Unity面试题”将采用简单概述,不拓展,将每个技术点限定在简短篇幅中。

 

 

 

++++Unity面试题ABChttps://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++Unity面试题Dhttps://blog.csdn.net/VRunSoftYanlz/article/details/78630838

++++Unity面试题Ehttps://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity面试题Fhttps://blog.csdn.net/VRunSoftYanlz/article/details/78630945

 

 

 

##《Unity面试题》目录:

#第一篇:Unity经典面试题

#第二篇:C#问题

#第三篇:Unity问题

#第四篇:Unity模拟面试

#第五篇:Unity面试进阶

#第六篇:立钻哥哥带您高薪就业

 

 

 

 

 

 

 

#第六篇:立钻哥哥带您高薪就业

#第六篇:立钻哥哥带您高薪就业

 

 

 

 

##6F.01、Unity高薪就业01

##6F.01、Unity高薪就业01

++6F.01、Unity高薪就业01

++++6F.01.01、写一个计时器工具,从整点开始计时,格式为00:00:00

++++6F.01.02、用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放?

++++6F.01.03、鼠标左键游戏对象使其旋转?

++++6F.01.04、写出一个人物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换?

++++6F.01.05、稳定排序和不稳定排序?

++++6F.01.06、欧拉角和四元数理解?

++++6F.01.07、什么是热更新? Unity如何实现热更新?

++++6F.01.08、UI框架的构建,请描述实现?

++++6F.01.09、NGUI和UGUI的区别对比?

++++6F.01.10、什么是装箱和拆箱?

++++6F.01.11、C#中的Dictionary字典遍历方式?

++++6F.01.12、NGUI的Sprite和UITexture使用的区别?

++++6F.01.13、Mono、.Net和L2Cpp分别是什么?

++++6F.01.14、6、8、10、14、14,有什么规律?

++++6F.01.15、四个数1,5,5,5,用加减乘除算出结果24,每个数字只能用一次?

++++6F.01.16、Unity文件是如何保存引用关系的? .meta文件到底有什么作用,这里边包含了什么内容?

++++6F.01.17、为什么使用多个Unity的摄像机这个功能可能非常重要?

 

 

 

 

 

 

 

 

###6F.01.01、写一个计时器工具,从整点开始计时,格式为00:00:00

###6F.01.01、写一个计时器工具,从整点开始计时,格式为00:00:00

++6F.01.01、写一个计时器工具,从整点开始计时,格式为00:00:00

++++立钻哥哥:创建工程后添加一个Cube物体,为其添加一个脚本;

using UnityEngine;

using System.Collections;

 

public class MyCube : MonoBehaviour{

    private float timer = 0f;

    private int h = 0;

    private int m = 0;

    private int s = 0;

    private string timeStr = string.Empty;

 

    //Update is called once per frame

    void Update(){

        timer += Time.deltaTime;

    

        if(timer >= 1f){

            s++;

            timer = 0;

        }

 

        if(s >= 60){

            m++;

            s = 0;

        }

 

       if(m >= 60){

            h++;

            m = 0;

        }

 

        if(h >= 99){

            h = 0;

        }

    }    //立钻哥哥:void Update(){}

 

    void OnGUI(){

        timeStr = string.Format({0:D2}:{1:D2}:{2:D2}, h, m, s);

        GUI.Label(new Rect(10, 10, 100, 200), timeStr);

    }    //立钻哥哥:void OnGUI(){}

 

}    //立钻哥哥:public class MyCube:MonoBehaviour{}

 

 

 

 

 

 

 

###6F.01.02、用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放?

###6F.01.02、用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放?

++6F.01.02、用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放?

++++立钻哥哥:在场景中添加Plane,Camera,Directional Light,Cube。添加两个脚本ScrollerScript(挂在Camera上),CubeDragScript(挂在Cube上);

++++1、鼠标滚轮实现缩放:将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现:

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;

        }

    }

 

}    //立钻哥哥:void Update(){}

 

++++2、鼠标实现在场景中拖动物体:解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Coroutine)来处理:

void Start(){

    StartCoroutine(OnMyMouseDown());

}    //立钻哥哥:void Start(){}

 

IEnumerator OnMyMouseDown(){

    //将物体由世界坐标系转换为屏幕坐标系

    Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);

 

    //完成两个步骤:

    //步骤1:由于鼠标的坐标系是二维,需要转换成三维的世界坐标系

    //步骤2:只有三维坐标情况下才能来计算鼠标位置与物理的距离,offset即距离

 

    //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离

    Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));

    while(Input.GetMouseButton(0)){

        //得到现在鼠标的二维坐标系位置

        Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);

 

        //将当前鼠标的二维位置转换成三维位置,再加上鼠标的移动量

        Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;

 

        //curPosition就是物体应该的移动向量赋给transform的position属性

        transform.positon = curPosition;

    

        yield return new WaitForFixedUpdate();    //这个很重要,循环执行

    }

 

}    //立钻哥哥:IEnumerator OnMyMouseDown(){}

 

 

 

 

 

 

 

 

###6F.01.03、鼠标左键游戏对象使其旋转?

###6F.01.03、鼠标左键游戏对象使其旋转?

++6F.01.03、鼠标左键游戏对象使其旋转?

++++立钻哥哥:

using UnityEngine;

using System.Collections;

 

public class MyDragRotate : MonoBehaviour{

    private bool onDrag = false;    //是否被拖拽

    public float speed = 5f;    //旋转速度

    private float tempSpeed;    //阻尼速度

    private float axisX;    //鼠标沿水平方向移动的增量

    private float axisY;    //鼠标沿垂直方向移动的增量

    private float cXY;    //鼠标移动的距离

 

    //接收鼠标按下的事件

    void OnMouseDown(){

        axisX = 0f;    //为移动的增量赋初值

        axisY = 0f;

    }    //立钻哥哥:void OnMouseDown(){}

 

    //鼠标拖拽时的操作

    void OnMouseDrag(){

        onDrag = true;    //被拖拽

        axisX = Input.GetAxis(Mouse Y);    //获取鼠标增量

        axisY = -Input.GexAxis(Mouse X);

        cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY);    //计算鼠标移动的长度

 

        if(cXY == 0f){

            cXY = 1f;

        }

    }

 

    //Count TempSpeed:计算阻尼速度

    float MyRigid(){

        if(onDrag){

            tempSpeed = speed;

        }else{

            if(tempSpeed > 0){

                //通过除以鼠标移动长度实现拖拽越长速度减缓越慢

                tempSpeed -= speed * 2 * Time.deltaTime / cXY;

            }else{

                tempSpeed = 0;

            }

        }

 

        return tempSpeed;    //返回阻尼的值

    }

 

    void Update(){

        gameObject.transform.Rotate(new Vector3(axisX, axisY, 0) *MyRigid(), Space.World);

 

        if(!Input.GetMouseButton(0)){

            onDrag = false;

        }

    }    //立钻哥哥:void Update(){}

 

}    //立钻哥哥:public class MyDragRotate:MonoBehaviour{}

 

 

 

 

 

 

 

 

###6F.01.04、写出一个人物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换?

###6F.01.04、写出一个人物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换?

++6F.01.04、写出一个人物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换?

++++立钻哥哥:有限状态机(Finite-State machine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

++++有限状态机(FSM)是游戏AI的一种常见模型

++++FSM的结构和逻辑:

--1、AIController:用于实现各种行为动作,它作为AI行为动作的控制器;

--2、FSM:用于存放判断参数和统一调用各状态机;

--3、IState:状态机接口,等待各种状态机实现其功能;

--4、MoveState,AttackState,IdleState,DieState:各种State,每个状态机内部实现开关逻辑;

 

++++【1、创建一个AIController】:创建一个AIController,绑定在怪物身上,用于控制怪物动作

public class AIController : MonoBehaviour{

    public FSM fsm;

 

    void Start(){

        fsm = GetComponent<FSM>();

        fsm.ac = this;

    

        //立钻哥哥:初始化一个默认状态机

        fsm.ChangeState(new MoveState());

    }

 

    public void Move(){

        Debug.Log(立钻哥哥:----move----);

    }

 

    public void Attack(){

        Debug.Log(立钻哥哥:----attack----);

    }

 

}    //立钻哥哥:public class AIController:MonoBehaviour{}

 

++++【2、创建一个FSM】:FSM用于传递状态机,创建一个FSM绑定在怪物身上

public class FSM : MonoBehaviour{

    public IState currentState{  get;  private set;  }

    public bool isCanAttack;

    public bool isCanMove;

    public AIController ac;

 

    void Start(){

    }

 

    public void ChangeState(IState newState){

        currentState = newState;

    }

 

    void Update(){

        if(currentState != null && ac != null){

            currentState.Execute(ac);

        }

    }

 

}    //立钻哥哥:public class FSM : MonoBehaviour{}

 

++++【3、创建一个状态机接口:IState】

public interface IState{

    void Execute(AIController ac);

}    //立钻哥哥:public interface IState{}

 

++++【4、创建多个状态机】:在状态机中实现判断和调用AIController的行为方法:

//4.1、MoveState.cs

public class MoveState : IState{

    public void Execute(AIContoller ac){

        if(ac.fsm.isCanMove){

            ac.Move();

        }else{

            ac.fsm.ChangeState(new IdleState());

        }

 

    }    //立钻哥哥:public void Execute(AIController ac)

 

}    //立钻哥哥:public class MoveState:IState{}

 

//4.2、AttackState.cs

public class AttackState : IState{

    public void Execute(AIController ac){

        if(ac.fsm.isCanAttack){

            ac.Attack();

        }else{

            as.fsm.ChangeState(new MoveState());

        }

    }    //立钻哥哥:public void Execute(AIController ac){}

 

}    //立钻哥哥:public class AttackState:IState{}

 

 

 

 

 

###6F.01.05、稳定排序和不稳定排序?

###6F.01.05、稳定排序和不稳定排序?

++6F.01.05、稳定排序和不稳定排序?

++++立钻哥哥:排序,就是整理文件中的记录,使之按关键字递增(或递减)的顺序排列起来;

++++排序算法的稳定性,通俗地讲:就是能保证排序前2个相等的数其在序列的前后位置和排序后它们两个的前后位置顺序相同;

++++常见排序算法稳定性分析:

++++【冒泡排序】:就是把小的元素往前调或者把大的往后调;(是稳定排序算法

++++【选择排序】:给么个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余位置里面给第二个元素选择第二小的,以此类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了;(不是稳定排序算法

++++【插入排序】:是在一个已经有序的小序列的基础上,一次插入一个元素;(是稳定排序算法

++++【快速排序】:有两个方向,左边的i下标一直往右走,右边的j下标一直往左走;(不是稳定排序算法

++++【归并排序】:是把序列递归地分成短序列,不断合并直到原序列全部排好序;(是稳定排序算法

++++【基数排序】:是按照低位先排序,然后收集;再按照高位排序,然后再收集;以此类推,直到最高位;(是稳定的排序算法

++++【希尔排序】:是按照不同步长对元素进行插入排序;(不是稳定排序算法

++++【堆排序】不是稳定的排序算法

++++总结:

--稳定排序:冒泡排序、插入排序、归并排序、基数排序

--不稳定排序:选择排序、快速排序、希尔排序、对排序

 

 

 

 

 

###6F.01.06、欧拉角和四元数理解?

###6F.01.06、欧拉角和四元数理解?

++6F.01.06、欧拉角和四元数理解?

++++立钻哥哥:

++++【欧拉角】:就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度;

    --欧拉角,优点:三个角度组成,直观,容易理解;缺点:死锁问题

--“heading-pitch-bank”约定:表示物体绕Y轴,X轴,Z轴旋转;

--物体的任何一种旋转都可以分解为绕三个轴的旋转,但分别方式不唯一;

--万向锁的避免方式,限制旋转的角度范围(heading-pitch-bank):

    ----1、heading:绕Y轴,限制范围在+-180度;

    ----2、pitch:绕X轴,限制范围在+-90度;

    ----3、bank:绕Z轴;

++++【四元数】:用于物体的旋转,是一种较为复杂,但是效率较高的旋转方式;

    --四元数,优点:四元旋转不存在万向节死锁问题;缺点:四元数的数字表示不直观

--在三种坐标变换:旋转,平移,缩放当中,旋转应该算是比较复杂的存在;

--使用四元素旋转注意点:

    ----1、用于旋转的四元数必须是单位四元素(即模为1);

    ----2、实际参与旋转的四元数由两个:p和p的逆;

 

 

 

 

 

###6F.01.07、什么是热更新? Unity如何实现热更新?

###6F.01.07、什么是热更新? Unity如何实现热更新?

++6F.01.07、什么是热更新? Unity如何实现热更新?

++++立钻哥哥:热更新:无需关闭服务器,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码;(iOS热更新:无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即不用下载app而自动更新程序。)

++++补充:苹果iOS静止了C#的部分反射操作,禁止JIT(即时编译,程序运行时创建并运行新代码),不允许逻辑热更新,只允许使用AssetBundle进行资源热更新;

++++为什么要热更新:缩短用户获取新版应用的客户端的流程,改善用户体验;App Store的审核周期难控制;不重新下载、不停机状态下完全变换一个应用的内容;

++++如何实现热更新:

--1、将执行代码编译为Assemblydll;将代码作为TextAsset打包进AssetBundle

--2、热更新方案:Unity+Lua插件

--3、需要更新的代码、资源,都必须打包成AssetBundle(建议使用未压缩的格式打包)

 

 

 

 

 

###6F.01.08、UI框架的构建,请描述实现?

###6F.01.08、UI框架的构建,请描述实现?

++6F.01.08、UI框架的构建,请描述实现?

++++立钻哥哥:

 

 

 

 

 

###6F.01.09、NGUI和UGUI的区别对比?

###6F.01.09、NGUI和UGUI的区别对比?

++6F.01.09、NGUI和UGUI的区别对比?

++++立钻哥哥:

++++【NGUI】

--NGUI的渲染前后顺序是通过WidgetDepth,而UGUI渲染顺序根据Hierarchy顺序,越下面渲染在顶层;

--NGUI还保留着图集,需要进行图集的维护;而NGUI没有图集的概念,可以充分利用资源,避免重复资源;

--NGUI支持图文混排;UGUI暂未发现支持此功能;

++++【UGUI】

--UGUICanvas有世界坐标和屏幕坐标;

--UGUIImage可以使用material;

--UGUI通过Mask来裁剪;而NGUI通过PanelClip

--UGUI不需要绑定CollidersUI可以自动拦截事件;

--UGUIAnchor是相对父对象,没有提供高级选项,操作比NGUI更方便;

--UGUI没有Atlas,使用Sprite Packer

--UGUINavigationScene中能可视化;

--UGUI的事件需要实现事件系统的接口,但写起来也算简单;

--UGUI出现了锚点的概念,更方便屏幕自适应;

--UGUI没有UIWrap来循环scrollView内容;

--UGUI暂时没有Tween组件;

 

 

 

 

 

###6F.01.10、什么是装箱和拆箱?

###6F.01.10、什么是装箱和拆箱?

++6F.01.10、什么是装箱和拆箱?

++++立钻哥哥:装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念;通过装箱和拆箱操作,能够在值类型和引用类型中架起一座桥梁。

++++C#语言中所有类型都是由基类System.Object继承过来的,就是说所有的事物都是对象;

++++装箱和拆箱是值类型和引用类型之间相互转换时要执行的操作:

--A、装箱在值类型向引用类型转换时发生

--B、拆箱在引用类型向值类型转换时发生

//立钻哥哥:装箱和拆箱分析

 

//A、装箱:

//这行代码将整型常量666赋给object类型的变量obj;

//666是值类型,值类型是放在栈上的;

//object是引用类型,放在堆上;

object obj = 666;

 

//B、拆箱

//代码首先会执行一次装箱操作:将整型数字常量888装箱成引用类型object变量;

//然后执行拆箱操作,将存储在堆上的引用变量obValue存储到局部值类型变量value中

object objValue = 888;

int value = (int)objValue;

 

 

++++执行装箱操作时不可避免的要在堆上申请内存空间,并将栈上的值类型数据复制到申请的堆内存空间上,这肯定是要消耗内存和CPU资源的。

++++装箱操作和拆箱操作是要额外耗费CPU和内存资源的,所以在C#2.0之后引入了泛型来减少装箱操作和拆箱操作消耗;

 

 

 

 

 

###6F.01.11、C#中的Dictionary字典遍历方式?

###6F.01.11、C#中的Dictionary字典遍历方式?

++6F.01.11、C#中的Dictionary字典遍历方式?

++++立钻哥哥:Dictionry的遍历方式:

--foreach(var item in myDic){}

--foreach(KeyValuePair<string, int> kv in myDic){}

--foreach(string key in myDic.Keys){}

--foreach(int val in myDic.Values){}

--for(int i = 0;  i < myDic.Count;  i++){}

//立钻哥哥:C#中Dictionary字典遍历方式

 

Dictionary<string, int> myDic = new Dictionary<string, int>();

myDic.Add(立钻哥哥, 666);

 

//A、3.0以上版本

foreach(var item in myDic){

    Console.WriteLine(item.Key + item.Value);

}

 

//B、KeyValuePair<T, K>

foreach(KeyValuePair<string, int> kv in myDic){

    Console.Writeline(kv.Key + kv.Value);

}

 

//C、通过键的集合取

foreach(string key in myDic.Keys){

    Console.WriteLine(key + myDic[key]);

}

 

//D、直接取值

foreach(int val in myDic.Values){

    Console.WriteLine(val);

}

 

//E、采用for方法也可以

List<string> myKeys = new List<string>(myDic.Keys);

for(int i = 0;  i < myDic.Count;  i++){

    Console.WriteLine(myKeys[i] + myDic[myKeys[i]]);

}

 

 

 

 

 

 

###6F.01.12、NGUI的Sprite和UITexture使用的区别?

###6F.01.12、NGUI的Sprite和UITexture使用的区别?

++6F.01.12、NGUI的Sprite和UITexture使用的区别?

++++立钻哥哥:NGUI的三大组件:UILabelUISpriteUITexture,它们三个同时都继承UIWidget

++++【UISprite】NGUI引入图集的概念,不考虑ABA叠层的情况下,一个图集的图片用UISprite,那么它就是一个DrawCall;但一张1024*1024图集就是4M内存;

++++【UITexture】:它完全没有图集的概念,使用起来非常的灵活,只要把图片挂上去就行了,这样内存只会占用这一张图的大小,内存虽然小,但是DrawCall就上去了;

++++补充:界面中重复性比较高的图片最好打成图集,而一些原画,或者背景图建议直接使用UITexture;(NGUI的图集其实很占用内存,也很占用空间)

 

 

 

 

 

###6F.01.13、Mono、.Net和L2Cpp分别是什么?

###6F.01.13、Mono、.Net和L2Cpp分别是什么?

++6F.01.13、Mono、.Net和L2Cpp分别是什么?

++++立钻哥哥:

++++Unity3D最大的一个特点是:一次制作,多平台部署;而这一核心功能是靠Mono实现的;(Mono是Unity3D核心的核心,是Unity3D跨平台的根本)

++++C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。(C#C语言和C++派生而来,继承了其强大的性能,同时又以.NET框架类库作为基础,拥有快速开发能力)

++++Mono不仅可以运行于Windows系统上,还可以运行于LinuxUnixOSX等;(Mono使得C#这门语言有了很好的跨平台能力

++++IL(Intermediate language)CIL(Common Intermediate Language,特指在.Net平台下的IL标准):中间语言。(它是一种属于通用语言架构和.Net框架的低价(lowest-level)的人类可读的编程语言。)(CIL类似一个面向对象的汇编语言,并且它是完全基于堆栈的,它运行在虚拟机上(.Net Framework, Mono VM)的语言)

++++C#等遵循CLI规范的高级语言,被先被各自的编译器编译成中间语言:IL(CIL),等到需要真正执行的时候,这些IL会被加载到运行时库,也就是VM虚拟机中,由VM动态的编译成汇编代码(JIT),然后再执行;

++++IL2CPP(将IL再弄回静态的CPP)

--1、Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成;(不同新平台,VM就得移植;让WebGL支持Mono的VM几乎不可能)

--2、Mono版本授权受限;(很多C#的新特性无法使用);

--3、提高运行效率;(有1.5~2.0倍的提升)

++立钻哥哥:使用Mono的时候,脚本的编译运行

++++3大脚本被编译成IL,在游戏运行的时候,IL和项目里其他第三方兼容的DLL一起,放入Mono VM虚拟机,由虚拟机解析成机器码,并且执行;

 

 

++立钻哥哥:IL2CPP编译运行(红色部分是IL2CPP做的改变)

++++在得到中间语言IL后,使用IL2CPP将他们重新变回C++代码,然后再由各个平台的C++编译器直接编译成执行的原生汇编代码;

 

++++1、将IL变回CPP的目的除了CPP的执行效率快以外,还可以利用现成的在各个平台的C++编译器对代码执行编译器优化,这样可以进一步减小最终游戏的尺寸并提高游戏运行速度;

++++2、由于动态语言的特性,程序员无需关心内存管理,所有的内存分配和回收都由GC(Garbage Collector)组件完成;(通过IL2CPP以后代码变成了静态的C++,但是内存管理这块还是遵循C#的方式,最后还要有一个IL2CPP VM:它负责提供诸如GC管理,线程创建这类的服务性工作。 由于去除了IL加载和动态解析的工作,使得IL2CPP VM可以做的很小,并且使得游戏载入时间缩短;)

+++3、由于C++是一门静态语言,这就意味着我们不能使用动态语言的那些炫酷特性。(运行时生成代码并执行肯定是不可能的)(Unity的AOT(Ahaed Of Time)编译,非JIT(Just In Time)编译)

 

 

 

 

 

 

 

###6F.01.14、6、8、10、14、14,有什么规律?

###6F.01.14、6、8、10、14、14,有什么规律?

++6F.01.14、6、8、10、14、14,有什么规律?

++++立钻哥哥:规律是:单数+4;双数+3;

 

 

 

 

 

###6F.01.15、四个数1,5,5,5,用加减乘除算出结果24,每个数字只能用一次?

###6F.01.15、四个数1,5,5,5,用加减乘除算出结果24,每个数字只能用一次?

++6F.01.15、四个数1,5,5,5,用加减乘除算出结果24,每个数字只能用一次?

++++立钻哥哥:24 = 5 * (5 - 1/5)

 

 

 

 

 

###6F.01.16、Unity文件是如何保存引用关系的? .meta文件到底有什么作用,这里边包含了什么内容?

###6F.01.16、Unity文件是如何保存引用关系的? .meta文件到底有什么作用,这里边包含了什么内容?

++6F.01.16、Unity文件是如何保存引用关系的? .meta文件到底有什么作用,这里边包含了什么内容?

++++立钻哥哥:Unity中每个资源文件都会对应生成一个.meta文件;

++++.meta文件是用来区分项目中不同资源的;

++++Unity引用的资源都会生成对应的唯一的GUID,用来标示这些资源。(GUID是按照一定策略生成的,但是在不同的机器上可能生成的并不一致。)(做版本控制的时候,一定要保证.meta文件的一致)

++++.meta文件记录了一些对应资源非常重要的信息。(比如:Texture.meta会有相关mipmapsbumpmaptextureFormat等信息)

++++提示:隐藏.meta文件状态:【Edit -> Project Settings -> Editor】=>【Version control:Hidden Meta Files】

fileFormatVersion: 2

guid: 7cf05f955a098834990e145a1f74d29d

timeCreated: 1483457126

licenseType: Pro

TextureImporter:

  fileIDToRecycleName: {}

  serializedVersion: 2

  mipmaps:

  bumpmap:

  textureSettings:

  spriteSheet:

  spritePackingTag:

  userData:

  assetBundleName:

  assetBundleVariant:

 

 

 

 

 

 

###6F.01.17、为什么使用多个Unity的摄像机这个功能可能非常重要?

###6F.01.17、为什么使用多个Unity的摄像机这个功能可能非常重要?

++6F.01.17、为什么使用多个Unity的摄像机这个功能可能非常重要?

++++立钻哥哥:在同一场景中同一方向上使用多个摄像机,很容易创造非常震撼的视觉效果,这些效果是一个摄像机很难完成的;

++++在Unity渲染场景的时候,需要大量的重要信息被设置好:

--A、要渲染的物体的列表;(每个摄像机只会渲染那些对它来说是可见的物体以及那些实际在指定摄像机可见的层上的物体;)

--B、摄像机的视角(以及摄像机的位置、旋转、缩放、视野、裁剪等等)

++++剔除遮罩:使用层有选择地渲染一组对象。(【Culling Mask: Everything】

++++摄像机的顺序和清理屏幕:

--在渲染场景的内容到颜色缓冲区和深度缓冲区之前,摄像机可以清除两个缓冲区的内容或者单独清理深度缓冲区的内容。默认:【Clear Flags: Skybox】:将颜色缓冲区的内容清除到天空盒的缓冲区里面去;

++++提示:如果想要移动某个摄像机的话,可能需要一次移动所有的摄像机(可以将所有的摄像机作为一个游戏物体的子对象)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

++立钻哥哥推荐的拓展学习链接(Link_Url)

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

++++Unity面试题ABChttps://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++Unity面试题Dhttps://blog.csdn.net/VRunSoftYanlz/article/details/78630838

++++Unity面试题Ehttps://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity面试题Fhttps://blog.csdn.net/VRunSoftYanlz/article/details/78630945

++++Unity知识点0001https://blog.csdn.net/vrunsoftyanlz/article/details/80302012

++++Unity知识点0008https://blog.csdn.net/VRunSoftYanlz/article/details/81153606

++++Unity引擎基础https://blog.csdn.net/vrunsoftyanlz/article/details/78881685

++++Unity面向组件开发https://blog.csdn.net/vrunsoftyanlz/article/details/78881752

++++Unity物理系统https://blog.csdn.net/vrunsoftyanlz/article/details/78881879

++++Unity2D平台开发https://blog.csdn.net/vrunsoftyanlz/article/details/78882034

++++UGUI基础https://blog.csdn.net/vrunsoftyanlz/article/details/78884693

++++UGUI进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78884882

++++UGUI综合https://blog.csdn.net/vrunsoftyanlz/article/details/78885013

++++Unity动画系统基础https://blog.csdn.net/vrunsoftyanlz/article/details/78886068

++++Unity动画系统进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78886198

++++Navigation导航系统https://blog.csdn.net/vrunsoftyanlz/article/details/78886281

++++Unity特效渲染https://blog.csdn.net/vrunsoftyanlz/article/details/78886403

++++Unity数据存储https://blog.csdn.net/vrunsoftyanlz/article/details/79251273

++++Unity中Sqlite数据库https://blog.csdn.net/vrunsoftyanlz/article/details/79254162

++++WWW类和协程https://blog.csdn.net/vrunsoftyanlz/article/details/79254559

++++Unity网络https://blog.csdn.net/vrunsoftyanlz/article/details/79254902

++++C#事件https://blog.csdn.net/vrunsoftyanlz/article/details/78631267

++++C#委托https://blog.csdn.net/vrunsoftyanlz/article/details/78631183

++++C#集合https://blog.csdn.net/vrunsoftyanlz/article/details/78631175

++++C#泛型https://blog.csdn.net/vrunsoftyanlz/article/details/78631141

++++C#接口https://blog.csdn.net/vrunsoftyanlz/article/details/78631122

++++C#静态类https://blog.csdn.net/vrunsoftyanlz/article/details/78630979

++++C#中System.String类https://blog.csdn.net/vrunsoftyanlz/article/details/78630945

++++C#数据类型https://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity3D默认的快捷键https://blog.csdn.net/vrunsoftyanlz/article/details/78630838

++++游戏相关缩写https://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++设计模式简单整理https://blog.csdn.net/vrunsoftyanlz/article/details/79839641

++++专题:设计模式(精华篇)https://blog.csdn.net/VRunSoftYanlz/article/details/81322678

++++U3D小项目参考https://blog.csdn.net/vrunsoftyanlz/article/details/80141811

++++UML类图https://blog.csdn.net/vrunsoftyanlz/article/details/80289461

++++U3D_Shader编程(第一篇:快速入门篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372071

++++U3D_Shader编程(第二篇:基础夯实篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372628

++++框架知识点https://blog.csdn.net/VRunSoftYanlz/article/details/80862879

++++游戏框架(UI框架夯实篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80781140

++++游戏框架(初探篇)https://blog.csdn.net/VRunSoftYanlz/article/details/80630325

++++Lua快速入门篇(基础概述)https://blog.csdn.net/VRunSoftYanlz/article/details/81041359

++++Lua快速入门篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502

++++Lua快速入门篇(Xlua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

 

 

--_--VRunSoft:lovezuanzuan--_--

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,`AudioSource`组件没有提供类似于`EndWithAudioPlay`的事件或委托来监听音频播放结束。但是,你可以使用其他方法来检测音频播放的结束。 一种常见的方法是使用`AudioSource.clip.length`属性和协程来检测音频的播放时间。以下是一个示例: ```csharp using UnityEngine; public class AudioLoader : MonoBehaviour { public string audioFilePath; // 音频文件路径 private AudioSource audioSource; private AudioClip audioClip; void Start() { audioSource = GetComponent<AudioSource>(); StartCoroutine(LoadAudio()); } IEnumerator LoadAudio() { string audioFileLocation = "file://" + Application.dataPath + "/" + audioFilePath; using (WWW www = new WWW(audioFileLocation)) { yield return www; if (www.error == null) { audioClip = www.GetAudioClip(); audioSource.clip = audioClip; audioSource.Play(); yield return new WaitForSeconds(audioClip.length); // 音频播放结束后执行的操作 EndWithAudioPlay(); } else { Debug.LogError("Failed to load audio file: " + www.error); } } } void EndWithAudioPlay() { // 音频播放结束后的逻辑处理 Debug.Log("Audio playback ended"); } } ``` 在上述示例中,使用`yield return new WaitForSeconds(audioClip.length)`来等待音频播放完毕。然后,在协程继续执行之前,调用`EndWithAudioPlay`方法来执行音频播放结束后的逻辑处理。 请注意,在使用协程等待音频播放结束时,应确保脚本的生命周期足够长,以便协程能够正常完成。 希望这可以帮助你在音频播放结束后执行相应的操作!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值