12个基本的Unity或Unity3D面试问题 *

最好的Unity或Unity3D开发人员和工程师可以回答的基本问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.

聘请顶级Unity或Unity3D开发人员
Toptal logo是顶级自由软件开发人员的专属网络吗, designers, finance experts, product managers, 和世界上的项目经理. 顶级公司雇佣Toptal自由职业者来完成他们最重要的项目.

Interview Questions

1.

回答以下关于穿线的问题. Explain your answers:

  1. 线程可以用来修改纹理在运行时?
  2. 线程可以用来在场景中移动游戏对象吗?
  3. Consider the snippet below:
类RandomGenerator: MonoBehaviour
{
    public float[] randomList;

    void Start()
    {
        randomList = new float[1000000];
    }

    void Generate()
    {
        System.Random rnd = new System.Random();
        for(int i=0;i

使用线程改进这段代码, 因此,生成的1000000个随机数不会影响性能.

View answer
  1. No. 纹理和网格是存储在GPU内存中的元素,Unity不允许其他线程, besides the main one, 对这些数据进行修改.
  2. No. 在Unity中获取Transform引用不是线程安全的.
  3. 当使用线程时,我们必须避免使用原生Unity结构,比如 Mathf and Random classes:
类RandomGenerator: MonoBehaviour
{
    public float[] randomList;

    void Start()
    {
        randomList = new float[1000000];
        线程t = new Thread(delegate())
        {
            while(true)
            {
                Generate();
                Thread.Sleep(16); // trigger the loop to run roughly every 60th of a second
            }            
        });
        t.Start();
    }

    void Generate()
    {
      System.Random rnd = new System.Random();
      for(int i=0;i
2.

解释什么是顶点着色器,什么是像素着色器.

View answer

顶点着色器是一个脚本,运行在每个顶点的网格, 允许开发人员应用转换矩阵, and other operations, 来控制这个顶点在3D空间中的位置, 以及它将如何投影到屏幕上.

像素着色器是在网格三角形中处理三个顶点后对每个片段(待渲染的像素候选点)运行的脚本. 开发人员可以使用像 UV / TextureCoords 和样本纹理,以控制将在屏幕上渲染的最终颜色.

3.

解释为什么延迟照明优化了大量灯光和元素的场景.

View answer

During rendering, 计算每个像素点是否应被照明并接受闪电影响, 每一盏灯都重复这个过程. 在对场景中不同的灯光进行了大约8次重复计算之后, 开销变得非常大.

For large scenes, 渲染的像素数通常大于屏幕本身的像素数.

延迟照明使场景在没有照明的情况下渲染所有像素(这很快), 并且具有额外的信息(以低开销为代价), 它只计算屏幕缓冲区像素的照明步长(少于每个元素处理的所有像素)。. 这种技术允许在项目中有更多的光照实例.

申请加入Toptal的发展网络

并享受可靠、稳定、远程 自由Unity或Unity3D开发工作

Apply as a Freelancer
4.

Explain why Time.deltaTime 应该用来使依赖于时间的东西正确运行吗.

View answer

实时应用程序(如游戏)具有可变的FPS. 它们有时以60FPS运行,或者当遇到减速时,它们将以40FPS或更低的速度运行.

如果要更改 A to B in 1.0秒你不能简单地增加 A by B-A 在两个帧之间,因为帧可以运行得快或慢,所以一个帧可以有不同的持续时间.

纠正这种情况的方法是测量从帧中取走的时间 X to X+1 and increment A,利用帧持续时间的变化 deltaTime by doing A += (B-A) * DeltaTime.

When the accumulated DeltaTime reaches 1.0 second, A will have assumed B value.

5.

解释为什么矢量在用于移动物体时应该规范化.

View answer

归一化使向量成为单位长度. 它的意思是,例如,如果你想以20的速度移动.0, multiplying speed * vector will result in a precise 20.0 units per step. 如果向量的长度是随机的,则步长将不同于20.0 units.

6.

考虑下面的代码片段:

class Mover : MonoBehaviour
{
  Vector3 target;
  float speed;

  void Update()
  {
  
  }
}

Finish this code so the GameObject 包含此脚本的常量移动 speed towards target,当达到1时停止移动.0或更小的距离单位.

View answer
class Mover : MonoBehaviour
{

  Vector3 target;
  float speed;

  void Update()
  {
      float distance = Vector3.Distance(target,transform.position);

      //只有当距离大于1时才会移动.0 units
      if(distance > 1.0f)
      {
        Vector3 dir =目标-变换.position;
        dir.Normalize();                                    // normalization is obligatory
        transform.position += dir * speed * Time.deltaTime; // using deltaTime and speed is obligatory
      }     
  }
}
7.

Can two GameObjects, each with only an SphereCollider, both set as trigger and raise OnTrigger events? Explain your answer.

View answer

No. 两个对象之间的碰撞事件只能在其中一个对象具有 RigidBody attached to it. 在实现使用“物理”的应用程序时,这是一个常见的错误.”

8.

下面哪个示例运行得更快?

  1. 1000 GameObjects, each with a MonoBehaviour implementing the Update callback.
  2. One GameObject with one MonoBehaviour 一个包含1000个类的数组,每个类实现一个自定义 Update() callback.

Explain your answer.

View answer

The correct answer is 2.

The Update 使用c#反射调用回调, 哪个比直接调用函数要慢得多. In our example, 1000 GameObjects each with a MonoBehaviour 意味着每帧有1000个反射调用.

Creating one MonoBehaviour with one Update,并使用这个回调来 Update 给定数量的元素,由于直接访问该方法,速度要快得多.

9.

Explain, in a few words, what roles the inspector, Unity编辑器中的项目和层次面板. 哪一个负责引用将包含在构建过程中的内容?

View answer

检查器面板允许用户修改数值(例如位置, rotation and scale), 拖放场景对象的引用(如预制件), Materials and Game Objects), and others. 它还可以显示用户通过使用Editor脚本创建的定制UI.

项目面板包含来自项目根文件夹中资产文件夹的文件系统的文件. 它显示了项目中可用的所有脚本、纹理、材料和着色器.

层次面板显示当前的场景结构,以及它的GameObjects和子对象. 它还可以帮助用户根据GameObject兄弟的名称和顺序来组织它们. 与顺序相关的特性(如UI)利用了这种分类.

负责在构建过程中引用内容的面板是层次结构面板. 面板包含对现有对象的引用, or will exist, 当应用程序执行时. 当构建项目时,Unity会在项目面板中搜索它们,并将它们添加到bundle中.

10.

按照关闭应用程序时调用事件函数的顺序排列下面列出的事件函数:

Update()
OnGUI()
Awake()
OnDisable()
Start()
LateUpdate()
OnEnable()
OnApplicationQuit()
OnDestroy()
View answer

The correct execution order 当应用程序关闭时,这些事件函数如下:

Awake()
OnEnable()
Start()
Update()
LateUpdate()
OnGUI()
OnApplicationQuit()
OnDisable()
OnDestroy()

注意:您可能不同意的位置 OnApplicationQuit() in the above list, 但它是正确的,可以通过记录应用程序关闭时调用发生的顺序来验证.

11.

用下面的代码解释问题,并提供一个可以纠正问题的替代实现.

using UnityEngine;
using System.Collections;

公共类TEST: MonoBehaviour {
    void Start () {
        transform.position.x = 10;
    }
}
View answer

The issue is that 你不能直接从变换中修改位置. 这是因为这个位置实际上是a property (not a field). 因此,当调用getter时,它会调用一个返回a的方法 Vector3 copy 它把哪个放到堆栈中.

所以基本上,你在上面的代码中所做的就是给结构体的一个成员赋值,这个值在堆栈中,然后被删除.

Instead, the proper solution is to replace the whole property; e.g.:

using UnityEngine;
using System.Collections;

公共类TEST: MonoBehaviour {
   void Start () {
        Vector3 newPos =新Vector3(10,变换.position.y, transform.position.z);
        transform.position = newPos;
    }
}
12.

使用可视化模式进行渲染优化的好处是什么, 如下图所示?

View answer

“透支”模式帮助用户配置在同一“区域”中渲染的像素数量。. 黄色到白色的区域是渲染过多像素的“热点”区域.

开发人员可以使用这些信息来调整他们的材料,并更好地利用 Z-Test and optimize the rendering.

面试不仅仅是棘手的技术问题, 所以这些只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能回答所有的问题, 回答所有问题也不能保证成为A级考生. At the end of the day, 招聘仍然是一门艺术,一门科学,需要大量的工作.

Why Toptal

厌倦了面试候选人? 不知道该问什么才能让你得到一份好工作?

让Toptal为你找到最合适的人.

聘请顶级Unity或Unity3D开发人员

我们的独家网络Unity或Unity3D开发人员

希望找到一份Unity或Unity3D开发人员的工作?

让Toptal为你找到合适的工作.

作为Unity或Unity3D开发者应用

工作机会从我们的网络

提出面试问题

提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.

* All fields are required

寻找Unity或Unity3D开发人员?

Looking for Unity or Unity3D Developers? 看看Toptal的Unity或Unity3D开发者.

Jean Simonet

自由Unity或Unity3D开发人员
United StatesToptal Member Since April 8, 2019

Jean已经在游戏和互动媒体领域工作了15年, 最初是在大型工作室,现在是独立开发者. Jean是Unity开发专家,拥有从移动游戏到VR/AR再到物理设备的许多项目. 他编写奇特的着色器就像编写AI算法或设计有趣且引人入胜的益智游戏一样轻松自如.

Show More

David Draper

自由Unity或Unity3D开发人员
United StatesToptal Member Since August 2, 2022

David是一名软件和视频游戏开发者,专门从事Unity开发. 他参与过各种各样的项目, including game development, web development, augmented reality, and virtual reality. David使用ShaderLab, Cg和hsl开发了着色器和后处理效果. 他对图形和着色器开发充满热情.

Show More

Christopher Ellis

自由Unity或Unity3D开发人员
United StatesToptal Member Since September 15, 2022

Christopher是一名Unity开发人员,在各种项目上拥有超过十年的经验, 从游戏到商业应用, including mobile, PC, 以及HoloLens和Vuforia等混合现实解决方案. 他的两个应用程序已经进入了各自类别的前十名, and one of them, Yumi Story Dice, 也得到了苹果的推荐. Christopher正在寻找使用Unity引擎的任何领域的兼职自由工作.

Show More

Toptal Connects the Top 3% 世界各地的自由职业人才.

Join the Toptal community.

Learn more