Unity常见面试题详解(持续更新...)

这篇具有很好参考价值的文章主要介绍了Unity常见面试题详解(持续更新...)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


 一丶声明、定义、实例化、初始化

1、首先我们来讨论在C/C++中的声明和定义..

1)我们先从函数声明和定义说起...

一般我们在C++里都会先定义一个函数,然后再Main函数前将函数声明,比如:

//函数声明
int Add(int);


int Main
{

}
//函数定义
int Add(int)
{
}

声明就是告诉编译器,咱这儿有一个名字叫Add,返回值和参数需要int的函数,就给你说一声

定义就是在内存中拓展出了这么一片空间给该函数分配内存

所以你看,定义只能定义一次吧,如果你稍微变了个啥,这函数就不是自己了,但是声明你随意,你想声明啥声明啥,我内存没有啊,也就不存在调用,就相当于你在那空喊,没人理你...

2)我们再来讨论变量的声明和定义...

在C++里面,我们是这么声明和定义的

//声明
extren int var;
typeof int INT;
struct Node;

//定义
extern int ble = 10;

所以声明是不开辟内存空间的,而定义必须占用内存空间...

因此,在C++中,常用到定义和声明的就是函数和变量。。。

3)实例化和初始化

在面向对象的编程中,通常把用类创建对象的过程成为实例化,注意,他一般用在类上

初始化可以理解为给声明的对象赋值的过程,也就相当于定义

2:C#中的定义和声明

        在C#中,其实和C++大概一样的,不过在C#中,你定义一个函数以后,可以直接进行使用,而不用在主函数体上方声明函数,至于变量的定义和声明,和C++一样,如果是int a ;只是声明,没有定义,使用int  a = 10;这样才算创建出来了变量。


二、属性(Get访问器和Set)和字段,static关键字

首先看看C#有哪些成员

Unity常见面试题详解(持续更新...)

 1:字段(field)

字段是一种表示与对象或类型关联的变量,也叫成员变量

看如下代码,可以看出字段是如何一步步变成属性

using UnityEngine;
using System;

public class GetSetProperty : MonoBehaviour
{
    
    private void Start()
    {
        //一、未使用Get/Set属性
        Student stu1 = new();
        Student stu2 = new();
        Student stu3 = new();

        stu1.Age = 20;
        stu2.Age = 20;
        stu3.Age = 20;

        //此时如果有一个年龄被不小心修改了,比如第三个学生年龄修改成200,这种字段被污染很难发现
        int avgAge = (stu1.Age + stu2.Age + stu3.Age) / 3;
        //Debug.Log(avgAge);


        //二、使用Get/Set方法
        Student1 stu4 = new();
        Student1 stu5 = new();
        Student1 stu6 = new();

        //此时如果不小心将年龄修改成200,程序就会报错
        //可以使用try catch,程序就不会崩溃

        stu4.SetAge(20);
        stu5.SetAge(20);
        //stu6.SetAge(200);
        int avgAge1 = (stu4.GetAge() + stu5.GetAge() + stu6.GetAge())/3;
        try
        {
            stu6.SetAge(200);
            Debug.Log(avgAge1);
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }

        //三、使用Get/Set访问器
        Student2 stu7 = new Student2();
        Student2 stu8 = new Student2();
        Student2 stu9 = new Student2();

        stu7.Age = 20;
        stu8.Age = 20;
        stu8.Age = 20;
        int avgAge2 = (stu7.Age + stu8.Age + stu9.Age) / 3;

        Debug.Log(avgAge2);
    }
}
class Student
{
    public int Age;
    public int Score;
}

/// <summary>
/// 二、此时使用Get,Set函数,可以对字段进行约束
/// </summary>
class Student1
{
    private int age;
    public int GetAge()
    {
        return this.age;
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="value"></param>
    public void SetAge(int value)
    {
        if (value >= 0 && value <= 120)
        {
            this.age = value;
        }
        else
            throw new System.Exception("value has error");
    }
}

    /// <summary>
    /// 三、使用微软的Get/Set访问器
    /// </summary>
class Student2
{
        private int age;
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (value >= 0 && value <= 120)
                {
                    this.age = value;
                }
                else
                {
                    throw new Exception("Age value has error");
                }
            }
        }
}

刚开始我们使用字段存储数据

但是考虑到暴露的缘故,我们引入了Get和Set函数来对字段进行约束

微软对Get/Set访问器进行了简化,就形成了Get/Set访问器

可以使用PropFull进行快速生成属性

2:属性(Prooerty)

属性是一种用于访问对象或类型的特征的成员,属性是字段的自然扩展

3:属性和字段的关系

属性和字段都是用于表示实体的状态

属性大多数情况是字段的包装器

建议:永远使用属性来暴露数据,即字段永远是private或protected的

4:static关键字

static关键字可以在类的定义,变量的声明,方法的定义中

变量前加上Static,变量成为静态变量,静态变量的内存分布在全局静态区,相当于它就是全局变量,Time.timescale就是静态变量

在函数前加上static,函数就变成了静态函数,直接类名+函数名就可以调用,比如Debug,或者Find函数都是静态函数

在类名的前面加上static,该类就变成了静态类,静态类不需要被实例化它不能继承,静态类内的成员都需要带上static关键字,但是静态函数不需要一定在静态类中

一般情况下,将工具函数或者工具类,做成静态类或者静态函数。


三、CPU和GPU的区别

CPU和GPU从名字上来说,一个是Central Processing Unit,一个是Graphic Processing Unit

后者是专门对图像进行处理的,为什么要针对图像处理要用专门的处理单元呢?

GPU(图形处理器)是图形系统结构的重要元件,是连接计算机和显示终端的纽带

就是说如果你要把图像显示在显示器上,必须要使用GPU,而GPU是如何工作的?可以参见下面的视频:

GPU工作原理_哔哩哔哩_bilibili

来看看CPU和GPU的内部结构

Unity常见面试题详解(持续更新...)

Unity常见面试题详解(持续更新...)

 从图中可以看出,我们GPU有大量的运算单元,而CPU只有简单的4个ALU,而我GPU有成百上千的计算单元,我们单论单线的计算能力,比如你把一个数学中的复杂运算交给CPU,效率会变得特别高,它也理所当然能够完成任务,但是在图形计算方面,我们并没有呢么多高级运算,而是要进行大量的矩阵运算变换,也就是所谓的顶点计算光栅化计算→纹理帖图→像素处理→最终输出

而在这样的运算中,都是一个一个像素点进行处理的,对于高像素的屏幕,有非常多的像素点,而对于每个像素点都得进行大量的计算,所以使用CPU效率实在太低,此时如果使用GPU,效率会变得很高,但是要注意的是:

光影都是CPU计算的,GPU只有2个工作,1多边形生成。2为多边形上颜色。

如下视频可以简单的告诉你CPU和GPU的区别...

NVIDIA现场形象展示CPU和GPU工作原理上的区别_哔哩哔哩_bilibili

这就是简单的CPU和GPU的区别介绍


四、堆和栈的区别

计算机的逻辑运算在CPU中进行,CPU中又有ALU(Arithmetic/Logic Unit)和CU(Control Unit)

ALU是由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算

而CU是负责程序的流程管理。正如工厂的物流分配部门,控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和操作控制器OC(Operation Controller)三个部件组成

问题就出在,在计算机进行计算时,并不是将所有的数据都放在CPU,而是放在内存中,CPU对其进行调用,将内存中的数据放在寄存器中,所以CPU根据计算需求对内存进行调用,而我们说的堆和栈就是在内存中的两个区域

栈内存(Stack):栈中存放的是对象的引用及对象方法中参数的值,由操作系统自动分配释放

                               栈内存是动态分配和静态分配结合,是局部的

                                入栈和出栈遵循弹夹原则,先进后出,后进先出

                                栈的生长方向向下,内存地址由高到低

堆内存(Heap):堆中存放的是实例对象及成员变量的值(属性的值),堆由开发人员分配和释放, 若开发人员不释放,程序结束时由 OS 回收

                                堆是动态分配的,是全局的

                                堆可以被看成是一棵树,如:堆排序

                                堆的生长方向向上,内存地址由低到高


五、值类型和引用类型/装箱和拆箱

值类型:C#的所有值类型均隐式派生自System.ValueType。值类型是直接存储该值的

              byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。

              值类型在声明后,不管有没有赋值,都已分配了内存

引用类型:引用类型是存储该类型的引用

              string 和 class,数组,接口,委托统称为引用类型。

               引用类型在声明后,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间;当使用 new 创建一个类的实例时,分配堆上的空间。

装箱和拆箱:

知道了值类型和引用类型以后,就牵扯一件事,这两种类型之间需要转换,比如

ArrayList arraylist = new ArrayList();
arraylist[0].add(1);
arraylist[1].add('a');
...

此时我们需要将值类型的1和字符类型的a放在引用类型的数组中arraylist中,我们知道所有数据类型的基类是object,所以要想把值类型的对象放在引用类型的对象中,需要将值类型转换为object,这种转化是隐式进行的,此时上面的数组中的0号元素就是引用类型的

再看下一段

int a  = (int)arraylist[0];

此时我们是把上面数组中的引用类型转化为值类型int,此时就进行了强转化文章来源地址https://www.toymoban.com/news/detail-483867.html


六、List/ArrayList/List,字典,队列,哈希表,Stack

1:List/ArrayList/List的区别和关系

2:字典的使用和举例

3:队列的使用和举例

4:哈希表的用法和举例

5:Stack(栈)


七、泛型


八、Unity中AB包何时使用以及如何使用


九、Unity中的数据加载方式有几种?


十、射线检测,碰撞检测


十一、图形学的渲染流程是什么?有哪些常见的渲染算法


十二、容器/迭代器

到了这里,关于Unity常见面试题详解(持续更新...)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Boot自动装配原理详解与常见面试题】—— 每天一点小知识

                                                                  💧 S p r i n g B o o t 自动装配原理详解与常见面试题 color{#FF1493}{Spring Boot自动装配原理详解与常见面试题} Sp r in g B oo t 自动装配原理详解与常见面试题 💧           🌷 仰望天空

    2024年02月16日
    浏览(43)
  • unity移动端性能优化技术整理(持续更新)

    本文主要针对一些常见的性能优化的点进行总结。属于一个high level的overview。需要注意只有当这些模块确定成为制约帧时间的瓶颈时,才能够进行针对性地优化,否则可能会适得其反,事倍功半。 一般来说,移动端性能优化,如果同时支持ios和android,建议先从ios开始优化,

    2024年02月06日
    浏览(39)
  • 【持续更新中】Unity常见问题及其解决

    否则会出现以下错误: 错误: error CS0103: The name ‘gameobject’ does not exist in the current context 解决: 脚本中获取游戏对象使用gameObject。 注:Debug.Log(“”);表示调试时输出引号中的内容。 错误: error CS1061: ‘Vector2’ does not contain a definition for ‘X’ and no accessible extension method ‘

    2024年02月01日
    浏览(90)
  • unity发布WebGL遇到的坑(持续更新)

    1、unity默认字体在网页中不会显示 解决方法:自己新导入一个字体,使用导入的字体 2、之前打过包并运行过,后面又在unity中进行了修改,重新打包,运行发现还是修改之前的效果,虽然是新包, 解决方法:这是因为网页中有缓存, 点击浏览器右边的三个点,选择设置–隐

    2024年02月12日
    浏览(44)
  • 【unity造轮子】Unity ShaderGraph使用教程与各种特效案例(持续更新)

    ShaderGraph官方案例:https://github.com/UnityTechnologies/ShaderGraph_ExampleLibrary 最近在玩ShaderGraph,决定把我自己实验的所有效果记录到这篇博客中,附带完整高清的连线动态图,希望对想要学习ShaderGraph的同学有所启发。后续有发现一些新的ShaderGraph我还会继续进行更新。 这里我就不对

    2024年02月11日
    浏览(39)
  • 【Unity开发必备】100多个 Unity 学习网址 资源 收藏整理大全【持续更新】

    众所周知,工欲善其事必先利其器,有一个好的工具可以让我们事半功倍,有一个好用的网站更是如此! 但是好用的网站真的太多了,收藏夹都满满的(但是几乎没打开用过😁)。 所以本文是对Unity相关的网站进行一个资源整合,可以让我们更方便的去学习Unity的更多知识内容

    2024年02月16日
    浏览(62)
  • 【Unity引擎技术整合】 Unity学习路线 | 知识汇总 | 持续更新 | 保持乐趣 | 共同成长

    前言 本文对 Unity引擎 的知识进行了一个整理总结,基本包含了Unity中大部分的知识介绍。 网上也有很多Unity相关的学习资料,但大多数都不成体系,学起来的时候难免会东奔西走的摸不着头脑。 本文整理的多数文章都是有对应的 系列性文章专栏 ,可以更方便的进行系统学习

    2024年02月03日
    浏览(61)
  • jmeter使用详解(持续更新中......)

    Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试 JMeter官方文档:http://jmeter.apache.org/index.html 如果是小白同学,建议先查看 【P1】Jmeter 准备工作,里面包含了 Jmeter 下载、环境变量配置、设置语言、设置日志级别等等,可以更方便后续学习 Jmeter

    2024年02月01日
    浏览(37)
  • Unity打包与编译,后处理以及自动化等等(持续更新)

    官网地址:https://docs.unity3d.com/cn/2022.1/ScriptReference/index.html C:UserssongzhewenAppDataLocalUnityEditor C:UserssongzhewenAppDataLocalLowlongtuNRJ 然后打包,拉跨,各种失败 我也是碰到了这个错误,用的Unity 2020.3.22。Gradle文件选择的是Unity下载的,应该是6.11的版本。Android SDK下载了31.0.0。但

    2023年04月22日
    浏览(41)
  • springboot常见面试题

    Spring Boot是一个开源Java-based框架,用于创建微服务。它是由Pivotal团队创建的,用于快速开发生产级的Spring应用。Spring Boot让你可以不用或者只需要很少的Spring配置就能创建一个应用。 与Spring Framework相比,Spring Boot具有以下特点: 自动配置 :Spring Boot可以根据在类路径上的j

    2024年02月12日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包