MIL8——模拟面试题

问题

C#

  1. 如果我们想为 Unity 中的 Transform​ 类添加一个自定义的方法,应该如何处理?

  2. 请说出 using​ 关键字的两个作用

  3. C# 中 Dictionary​ 不支持相同键存储 如果想要一个键对应多个值如何处理?

  4. 请问下面代码的最终打印结果是什么?为什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    static void Main(string[] args)
    {
    Action action = null;
    for (int i = 10; i < 10; i++)
    {
    action += () =>
    {
    Console.WriteLine(i);
    };
    }
    action();
    }
  5. 上题中的代码,如果我们希望打印出0~9,应该如何修改代码?

Unity

  1. Unity中如何将本地坐标转为世界坐标?
  2. Unity中如何计算出两个向量之间的夹角,请说出两种方式
  3. 请写出UGUI中两种处理异形按钮的具体方法
  4. 请说出Unity中如何进行数据持久化,至少说出5种方式
  5. 在Unity中如何控制渲染优先级?(谁先渲染谁后渲染,分情况回答)

答案

C#

  1. 如果我们想为 Unity 中的 Transform​ 类添加一个自定义的方法,应该如何处理?

    答案: 通过C#的拓展方法相关知识点进行添加

  2. 请说出 using​ 关键字的两个作用

    答案:

    1. 引入命名空间
    2. 安全使用引用对象
  3. C# 中 Dictionary​ 不支持相同键存储 如果想要一个键对应多个值如何处理?

    可以设置字典的值类型为复杂数据类型或者数据集合,如:

    1
    2
    3
    4
    5
    Dictionary<string, List<Player>> dic1 = new Dictionary<string, List<Player>>();
    Dictionary<string, Player[]> dic2 = new Dictionary<string, Player[]>();
    Dictionary<string, LinkedList<Player>> dic3 = new Dictionary<string, LinkedList<Player>>();
    Dictionary<string, Stack<Player>> dic4 = new Dictionary<string, Stack<Player>>();
    Dictionary<string, Queue<Player>> dic5 = new Dictionary<string, Queue<Player>>();
  4. 请问下面代码的最终打印结果是什么?为什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    static void Main(string[] args)
    {
    Action action = null;
    for (int i = 10; i < 10; i++)
    {
    action += () =>
    {
    Console.WriteLine(i);
    };
    }
    action();
    }

    答案: 全是10,当委托最终执行时,他们使用的 i​,都是 for​ 循环中声明的那一个 i​,此时的 i​ 已经变成了10

  5. 上题中的代码,如果我们希望打印出0~9,应该如何修改代码?

    答案:

    不是在 for​ 声明语句内声明要在委托中调用的变量,而是在每次循环开始时声明要在委托中调用的变量,这样这十个变量就是不同的内存空间

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static void Main(string[] args)
    {
    Action action = null;
    for (int i = 10; i < 10; i++)
    {
    int num = i;
    action += () =>
    {
    Console.WriteLine(num);
    };
    }
    action();
    }

Unity

  1. Unity中如何将本地坐标转为世界坐标?

    答案:

    1. 用本地坐标加上父对象相对世界的坐标(如果有多层父子关系,不停地往上加即可)
    2. 利用 Transform​ 中的 TransformPoint​ 方法
  2. Unity中如何计算出两个向量之间的夹角,请说出两种方式

    答案:

    1. 利用 Vector3​ 中的API:Vector3.Angle
    2. 先使用 Vector3.Dot​ 算出方向向量点乘结果,再通过 Mathf.Acos​ 反三角函数算出弧度,再将弧度转为角度
  3. 请写出UGUI中两种处理异形按钮的具体方法

    答案:

    1. 方法一:异形按钮,自带的像素检测阈值
    2. 方法二:异形按钮,通过子对象拼凑

    详见:UG3L16——异形按钮

  4. 请说出Unity中如何进行数据持久化,至少说出5种方式

    • PlayerPrefs
    • 2进制文件存储
    • xml文件存储
    • json文件存储
    • 数据库存储(本地、远端、通过服务器存储到数据库)
  5. 在Unity中如何控制渲染优先级?(谁先渲染谁后渲染,分情况回答)

    答案:

    1. 不同摄像机渲染时,摄像机深度(Camera depth)控制优先级
    2. 相同摄像机时,排序层级(Sorting Layer)控制优先级
    3. 相同排序层级时,层中的顺序(Order in Layer)控制优先级
    4. 相同摄像机,无排序层级属性时,Shader 中的 RenderQueue(渲染队列)控制优先级