Unity3d面试题

本文汇总了Unity3D面试中的各类问题,包括基础知识、编程概念、Unity特性和实战经验,涵盖C#语言、游戏引擎机制、资源管理等多个方面,适合Unity开发者备考和复习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

第一部分:面试题 越甲天下

**

1.假设有八枚硬币,其中有一枚是假币,质量轻于其他七枚,给你一台天平,请问至少要多少次可以得到假币,并说明方法。

答:2次
将8枚硬币分为3份,分别为3,3,2 ,比较3,3的两堆 如果一样重,则说明假币在 2的这堆里面,再比较2枚硬币,轻的则为假币,如果 不一样重,则说明假币在轻的一方,从中再挑出2枚硬币,如果一样重,则另一枚则为假币,不一样重,则轻的那一枚为假币

2. 现有一个RGB颜色值,RGB三个分量分别为r=128,g=20,b=100,请将r g b三个变量写一个表达式,求出一个color值(转换为十六进制记法)
Byte r=128 g=20,b=100


3. C#中怎么使用引用,引用传递和值传递有什么区别

使用ref和out关键字传递,引用传递是传递地址,修改会改变原有的值, 值传递只传递值的副本。不会对原有的值进行改变。

4. 有这样一个字符串:“100|500;300|20;6|200;800|30”,每个分号隔开一组参数,总共4组,每组以|分割,请将这个字符串拆分并转换为key-value模式存储。

 string s = "100|500;300|20;6|200;800|30";
        Dictionary<string, string> d1 = new Dictionary<string, string>();
        string[] s1 = s.Split(';');
        string[] s2;
        for (int i = 0; i < s1.Length; i++)
        {
            s2 = s1[i].Split('|');
            d1.Add(s2[0], s2[1]);
        }

5. 简述泛型的优点,并列举一个实际应用场景

性能优化,类型安全,List和ArrayList相比较多了一个泛型约束,如果直接用ArrayList会将数据转化为Object再存储进去,使用的时候就多了一个装箱的操作,对性能消耗很大, 泛型在使用时就需要声明好类型。

6. Dictionary,list,SortedSet的区别及应用场景

dictionary是通过哈希表存储键值对的,可以通过键来访问值,比较适合用于频繁访问数据的时候,列表是通过数组来进行存储的,可以通过下标进行访问,比较适合用来存储相同类型数据。排序列表也是存储的键值对,不同的是它会根据键进行排序。在数据基本有序的情况下比较适用。

7.abstract,static,interface,where,virtual的区别。

abstract:抽象,修饰类或者方法,修饰类表示该类不可被实例化,抽象方法只能存在于抽象类中,抽象方法不能有具体方法。
static:静态的,声明属于类型本身而不是属于特定对象的静态成员
interface:声明为接口类型,即类或者构造必须声明的合同
where:基类类型约束
virtual:修饰方法属性等,使其可在派生类中被重写

8. 实现一个枚举,获取枚举的整型值及本身的字符串

  public enum color
    {
        red = 34,
        blue = 288,
        yellow
    }
        Debug.Log((int)color.red);
        Debug.Log(color.yellow);

9. 实现一个玩家对象的等级属性,并阐述属性的作用


10. 什么是多态,什么是虚函数,列举其应用场景

同样的操作作用于不同的对象,产生不同的效果,就是多态,虚函数表示父类方法使用virtual关键字修饰,继承该类的方法可以重写该方法。

11. 什么是不定参数,请实现一个带有不定参数的方法,并阐述其作用

 void testMethod(params int[] values)
    {
        for (int i = 0; i < values.Length; i++)
        {
            Debug.Log(values[i]);
        }
    }
    使用关键字params 输出该参数列表

12. 什么是协程,并谐剧应用场景

是一个特殊的函数,程序运行时暂停自身并且提交一个唤醒的条件,直到条件完成,就会继续运行。会在lateupdate之后执行。
应用场景:计时器,打字机效果,异步加载资源

13. 请实现一个基础的事件管理器,用于注册,删除,添加事件

using UnityEngine;
using System.Collections.Generic;
using System.Collections;
public class EventmanagerA
{
   
   
    //事件的存储方式,事件的添加  事件的移除(指定的某个事件)  移除所有事件 
    private static EventmanagerA _instance;
    public static EventmanagerA instance
    {
   
   
        get
        {
   
   
            if (_instance == null)
            {
   
   
                _instance = new EventmanagerA();
            }
            return _instance;
        }
    }
    public delegate void onactionhandler(object p);
    public Dictionary<int, List<onactionhandler>> dic = new Dictionary<int, List<onactionhandler>>();

    public void addeventlistener(int key, onactionhandler handler)
    {
   
   
        if (dic.ContainsKey(key))
        {
   
   
            dic[key].Add(handler);
        }
        List<onactionhandler> list = new List<onactionhandler>();

        list.Add(handler);
        dic.Add(key, list);
    }

    public void removeeventlistner(int key, onactionhandler handler)
    {
   
   
        if (dic.ContainsKey(key))
        {
   
   
            List<onactionhandler> list = dic[key];
            list.Remove(handler);
            if (list.Count > 0)
            {
   
   
                dic.Remove(key);
            }
        }
    }

    public void Dispatch(int key, object p)
    {
   
   
        if (dic.ContainsKey(key))
        {
   
   
            List<onactionhandler> list = dic[key];
            if (list.Count > 0 && list != null)
            {
   
   
                for (int i = 0; i < list.Count; i++)
                {
   
   
                    if (list[i] != null)
                    {
   
   
                        list[i](p);
                    };
                }
            }
        }
    }

    public void Dispatch(int key)
    {
   
   
        Dispatch(key, null);
    }
}

14. 简述unity为什么能够实现跨平台特征。

主要使用了一种叫CIL的代码指令集,

**

第二部分:大梦龙图笔试题

**
1.简单描述prefab的用处和环境

预制体,通常是会被重复创建使用的同一对象,如子弹等。类似于一个模板,批量生成同类型的克隆体

2.简单描述AssetBundle的作用

热更新时使用assetbundle压缩资源从服务器进行更新传输。
打包压缩资源,减小安装包大小。

3.解释一下vertex shader 和pixel shader

定点着色器 和像素着色器 vertexshader 是改变物体模型外形的,由于模型是由点构成的,因此改变点就是改变外形
当模型顶点变换完之后,是需要填充颜色的,这些填充算法是针对屏幕上的每个像素的

4.通过脚本来删除一个GameObject

Destroy(gameobject)
DestroyImmediate(gameobject)

5.unity3d脚本从唤醒到销毁有一套比较完整的生命周期,请列出系统自带的几个重要的方法。

Awake onenable start  fixedupdate update lateupdate   ondisable ondestroy

6.如何计算vector3的长度

vector3.mangitude

7.vector3.normalize有什么意思,如何计算这个值

单位向量 长度为1

8.Application.datapath;Application.streamingassetspath;application.persistentdatapath在安卓和ios平台下,分别对应的位置是什么


Platform:   UNITY_ANDROID
Application.dataPath:               /data/app/com.Company.ProductName-1.apk
Application.streamingAssetsPath:    jar:file:///data/app/com.Company.ProductName-1.apk!/assets
Application.persistentDataPath:    data/com.Company.ProductName/files

Platform:   UNITY_IOS
Application.dataPath: ProductName.app/Data
Application.streamingAssetsPath:  ProductName.app/Data/Raw
Application.persistentDataPath:   /Documents

9.不使用foreach如何遍历一个字典

  var enumerator = dic.GetEnumerator();
        while (enumerator.MoveNext())
        {
            Debug.Log(enumerator.Current.Key+":"+enumerator.Current.Value);
        }

10.Animator的状态机有哪些类型的参数

Float int bool trigger

11.如何控制多个相机的显示顺序

摄像机的Depth参数控制

12.如何执行一个协程,如何停止一个协程

startcoroutine() stopcoroutine()

实现一个简单的计时器

float time = 0f;
    public Text hourtext;
    public Text minutetext;
    public Text secondtext;
    int hour;
    int min;
    int second;
    // Use this for initialization
    void Awake()
    {
        StartCoroutine(timecau());
    }

    IEnumerator timecau()
    {
        while (true)
        {
            time = time + Time.deltaTime;
            hour = (int)time / 3600;
            min = (int)time / 60;
            second = (int)time % 60;
            TimeTrans(hour, min, second);
            print(time);
            yield return null;
        }
    }

    void TimeTrans(int hour, int min, int second)
    {
        hourtext.text = hour.ToString();
        minutetext.text = min.ToString();
        secondtext.text = second.ToString();
    }

13.请指出下面代码的错误
using unityEngine
using system.collection
public class Test:MonoBehaviour{
void start(){
transform.position.x =10
}
}

因为position是vector3,vector3是结构体的类型的,这相当于对他的副本赋值,就算赋值也没有意义。

14.补全下面的update函数,让这个gameobject以speed的速度向target移动,当与target的距离小于等于1时停止
public Vector3 target;
public float speed;
private void Update()
{
}

 if (Vector3.Distance(target, transform.position) > 1f)
        {
            transform.position = Vector3.MoveTowards(transform.position, target, speed);
        }

**

第三部分:杂项

**

1.transform的localPosition 和position的区别

一个是相对于世界原点为中心 一个是相对于父节点为中心

2.如何销毁一个基类为UnityEngine.Object的实例

Destroy()方法
DestroyImmediate()方法

3.写出几个U3D脚本自带函数的执行顺序

Awake()->OnEnable()->Start()->fixedupdate()->update()->lateupdate()->OnGui()->OnDisable()->OnDestroy()

4.Unity动态加载资源有哪些接口,有什么区别?

答:
1.resource.load(),加载Resources 的目录中的资源
2.www(可以加在任意处的资源(服务器)已被弃用)
3.unitywebrequest (www的升级版本,)
4.AssetDatebase.load(只能加载assets目录下的资源,只能用于editor)
5.assetbundle(只能加载ab资源,当前设备允许访问的路径都可以)
加载资源,同步和异步的特点
同步:管理方便,资源准备好可以及时返回,缺点,没有异步快
异步:加载资源快,与主线程无关,缺点:调用比较麻烦,最好的方法是使用回调

5.什么是协同程序,与C#的线程有什么区别?

答:协同程序:在主线程运行的同时开启一段逻辑处理,来协助当前的程序执行。
协程避免了无意义的调度,由此可以提高性能,需要自己调度自己的协程,失去了标准线程对cpu使用的能力例如单核情况下,有ab两个线程需要处理,那么先a再切换到b
协程常用于多任务的同时处理,线程多用于单任务时的分时处理。

6.unity3d中的drawcall有几种合并方式?
答:

7.简单描述c#中关键字abstarct,virtual override 和sealed的含义

答:
Abstract:抽象,修饰类表示该类为抽象类,不可被实例化,具体派生类必须覆盖基类的抽象方法。修饰方法,表示该方法为抽象方法,不能实现该方法,只包含声明。
Virtual:虚方法,修饰方法,表示该方法可以被重写
Override:修饰方法,表示重写
Overload:重载
Sealed:修饰方法,表示该方法仅该类可访问,修饰类表示该类不可被继承。

8.抽象类和接口的区别

答:
相同点:
都不能被实例化,都可以被继承
都可以包含方法声明
派生类必须实现未实现的方法
区别:1.抽象类可以定义字段,属性,方法实现。接口可以实现方法,事件,属性,索引器,但不能定义字段。
2.抽象类是一个不完整的类,需要进一步实现(继承,并实现方法)。接口是一个行为规范,可以直接继承引用
3,接口可以被多重实现,抽象类只能被单一继承。
4.抽象类更多的定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类间
5.抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性,接口是为了满足外部调用而定义的一个功能约定,因此反映的事物的外部特性。
6.接口基本不具备继承的特性,仅仅能够调用而已。
7.接口可以用于支持回调,而继承并不具备这个特点。
8.抽象类中实现具体方法默认为虚的,而实现接口的类中的接口方法却默认为非虚,当然也可以声明为虚。
9如果抽象类中实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口方法

8.以下代码片段有什么问题
Int[] a = new int[128];
foreach(int aa in a){
Foreach(int bb in a){
Foreach(int cc in a){
cc=0;
}}}

答:foreach取值是只读的,不能给元素赋值。

Public class test: MonoBehaviour{
Void start(){
Transform.position.x =10;
}
}

答:上述代码是没有意义的 因为transform.position 返回值是vector3 vector3的类型是结构体,transform.position.x只是他的副本,并不能真真修改到他的值。所以不能赋值。

9.arrylist 和list的区别?

答:arrylist相比较list是一种非类型安全的,在装箱和拆箱操作过程中可能遇到数据类型不匹配造成一些性能损耗

10.以下哪些是值类型,哪些是引用类型
Object class enum struct bool int string float interface delegate

答:object class interface string delegate 是引用类型  其他是值类型 所有的类型都指向object  值类型继承valuetype

10.请指出下面代码中,哪些地方会发生装箱或者拆箱
Int a =10; object obj =a; obj =100; int b =(int)obj; Type type = b.GetType()
String str = b.ToString() Console.Write(obj) Console.Write(b);

答:object obj =a 装箱obj =100装箱  int b = (int)obj 拆箱 Type type = b.GetType()装箱 
string str = b.ToString(); 虽然ToString()是object的方法,但int已经对它进行了重写,并且值类型都是密封的,所以将会直接调用int的ToString()方法;
而最后两句:Console.Write()共有18个重载的方法,其中有Console.Write(object value)及Console.Write(int value)两个重载方法,所以不会产生装箱。

11.列举2个以上你熟悉的C#容器(List,Dictionary等),描述其适用场景,并简述其底层数据结构。

在这里插入代码片

12.c#中struct 和class的区别,作为参数是有何优劣?Unity中常见的struct类型有哪些?

答: struct 是值类型, 他的引用对象在栈上,引用对象时,会取他的副本,不会改变本身,class是引用类型,对象在堆内存上,会使用他的引用, struct的话 空间较小,访问速度快,class 空间较大,访问速度慢,结构适合表示一个轻量级对象。
Unity中常见的结构体 有 vector3 vector2 vector4  Rect  Color Color32  Bounds Touch

13.ref参数和out参数是什么?有什么区别?

答:使用ref参数需要在 使用前先声明初始化 ,将值类型作为引用类型传递
使用out参数不需要在使用前初始化,但需要在传递过程(方法)中对其赋值,也是将值类型作为引用类型传递。

14.heap与stack有何区别?

答:堆内存是用来存储引用类型的也可以存储值类型,栈是用来存储值类型的,栈有自动清理功能,堆则是需要使用GC清理, 当我们使用引用类型时,我们在和指向引用类型的指针打交道,而不是引用类型本身。当我们使用值类型时,我们就是在和值类型本身打交道。

15.如何在list中删除多个数据,在dictionary中呢?

答:RemoveAll  使用tolist 将dictionary转化为list进行操作

16.匿名委托是什么?什么是闭包?

答:匿名委托:委托的一种简单化声明方式,通过delegate 关键字声明
闭包:闭包是一个包含了上下文环境的匿名函数,匿名函数内可以使用上层作用域的变量。

17.C#中什么是反射?反射的实现原理?

答:反射指程序可以访问、检测和修改它本身状态或行为的一种能力。

18.数据序列化的方式有哪些?简述实现序列化的原理与用途?

xml ,json

19.求下面二叉树的前序遍历,中序遍历的输出结果。

答:给定了二叉树的任何一种遍历序列,都无法唯一确定相应的二叉树。但是如果知道了二叉树的中序遍历序列和任意的另一种遍历序列,就可以唯一地确定二叉树。
前序遍历:6 4 2 3 5 1 7 根左右 
中序遍历:3 2 4 6 1 5 7  左根右
后序遍历:3 2 4 1 7 5 6  左右根

20.平时使用过哪些设计模式?有何作用与缺陷?

答:单例模式  观察者模式 工厂模式 

21. MVC模式的理解?

MVC:使用数据-控制显示分离的工作方式,目的使代码结构清晰化
M 数据层; 提供两种函数接口:操作。 获取数据, 并可以发送更新消息
V 视图层 接受消息并控制界面显示,跳转效果等。
C 实现必要逻辑

22.MonoBehaviour的函数执行顺序?

答:Awake  start onenable  fixedupdate  update  lateupdate  ongui  ondisable  ondestroy

23.向量的点乘,叉乘以及归一化的意义?

答:点乘:一条边在另一条边上的投影乘以另一条边的长度
叉乘:求向量在平面的法向量
归一化的意义:计算时我们无需考虑具体的模长带来的影响,只考虑向量的方向

24.简述四元数的作用,四元数对欧拉角的优点?

答:四元数用于表示旋转,相对于欧拉角
1.能进行增量旋转
2.避免万向锁
3.给定方位的表达有两种,互为负(欧拉角有无数种表达方式)

25.什么是prefab,有什么用处?

答:预制体  类似声明了一种模板,是一种可以被重复使用的对象,使用该物体创建的对象都是被克隆的,修改预制体对象,可以同步修改所有使用该预制体创建出来的对象。

26.UGUI的常用类有哪些,常用的优化方式有哪些?

答:
Button Slider  Text Image Toggle ScrollBar InputField Canvas EventSystem
优化方式:
1.检查空image 
2.优化九宫格 Image
3.检查Mask组件
4.检查错误透明材质
5.错误的UI设置

https://www.cnblogs.com/lan-yt/p/9470157.html

27.怎么样在UGUI上显示模型,特效?

答:使用RenderTexture渲染在RawImage后显示在UI上。

28.怎么样在UGUI上实现无限滑动列表?
答:

29.简单描述一下使用过的热更新,实现原理与流程?

答:tolua,访问服务器 比对本地的files.txt文件 的md5值 如果一样则不会进行更新 ,加载本地资源,如果不一样 会把服务器上的ab文件加载到本地,并且更新files.txt文本 加载下载下来的文件。

30.简单介绍一下之前使用的资源加载管理策略?有何优化方向?

31.MeshRender中material与sharedmaterial的区别?

答:Material:只会改变当前对象的材质设置
Sharedmaterial:共享的,改变这个设置,所有用到这个材质的都会被改变

32.什么是LOD,MipMap?

答:LOD Level of Detail,多层次细节,添加LOD Group 目的是让一个物体距离不同的时候渲染不同的资源,但是会加大内存。 针对模型资源
MiniMap:类似LOD,对象离摄像机越远的时候像素越低,越模糊 针对纹理资源

33.什么是DrawCall?如何降低Drawcall?
答:

34.TextureType选项分别选为“Texture”和“Sprite”有什么区别?

1.texture用在rawimage组件上 sprite用在image组件上
2.
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值