Unity面试总结-功能实现

1.从接到任务到完成任务,一共几个过程,每个过程注意什么?

  • 需求分析:确保理解和策划想法一致。
  • 搭建ui或场景:
  • 编写代码:
  • 测试功能:
  • 解决bug:

2.设计一个背包系统,格子500. 伪代码实现 增,删,改,查。struct sitem{ string uid,int index, int count, int itemcode }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PaiXu
{
    struct sitem {
       public string uid;     //唯一id
       public int index;      //位置
       public int itemCoad;   //物品id
       public int itemAmount; //物品数量
    }

    class Class2
    {
        public int bagCount = 500;

        //申请一个背包列表
        public List bagList = new List();


        //初始化单个背包格
        public void InitSimpBagItem(int index)
        {
            bagList[index] = new sitem();
        }
        //初始化整个背包
        public void InitBag() {
            for (int i = 0; i < bagCount; i++) {
                InitSimpBagItem(i);
            }
        }

        //检查格子是否为空
        public bool CheckNull(int index) {
            if (bagList[index].itemAmount == 0)
            {
                return true;
            }
            else {
                return false;
            }
        }
        //检查背包中是否含有这个物品(id),返回位置
        public int CheckItem(int id) {
            for (int i = 0; i < bagCount; i++) {
                if (bagList[i].itemCoad == id) {
                    return i;
                }
            }
            return -1;
        }
        //获取位置最小的空格子
        public int FindFull() {
            for (int i = 0; i < bagCount; i++) {
                if (bagList[i].itemAmount == 0) {
                    return i;
                }
            }
            return -1;  //满了
        }


        //增
        public void AddItem(sitem sitem) {
            //检查是否存在
            int bagIndex = CheckItem(sitem.itemCoad);
            if (bagIndex == -1)
            {
                int newBagIndex = FindFull();
                if (newBagIndex == -1)
                {
                    return;
                }
                else
                {
                    sitem.index = newBagIndex;
                    sitem.itemAmount = 1;
                    bagList[newBagIndex] = sitem;
                }
            }
            else {
                sitem.itemAmount = bagList[bagIndex].itemAmount + 1;
                bagList[bagIndex] = sitem;
            }
        }

        //删
        public void DelectItem(int id) {
            int bagIndex = CheckItem(id);
            if (bagIndex == -1)
            {
                return;
            }
            else {
                sitem item = bagList[bagIndex];
                item.itemAmount -= 1;
                if (item.itemAmount <= 0) {
                    InitSimpBagItem(bagIndex);
                }
                bagList[bagIndex] = item;
            }
        }
    }
}

3.描述一下背包如何实现?

使用MVC设计模式:

modle 和  control 层

  • 首先要定义背包的大小
  • 再定义格子类,包含的每个格子的数据,如:格子位子,物品id,数量,物品信息
  • 再搞一个背包管理类,申请一个 格子类的列表,初始化。
  • 包含一些方法,如初始化格子,判断格子是否为空,获取位置最小的空格子,增 删 改 查 等等。

view层

  • 获取背包信息,生成相应的格子,形成背包。

4.如何在UI上显示模型?

  • 使用RenderTexture 和 rawIamge。
  • 创建一个专门照射3D模型的相机,为了避免影响主视角,可以把相机位置设置到远一些的地方。
  • 创建一个RenderTexture,把它指定给该相机,然后指定给Rawimag
  • 该相机下的任何物体都会被渲染纹理记录并显示再RawIamg。
  • 注意事项:RenderTexture可以设置分辨率,最好和游戏一样。相机的Clear Flags设置为Solid Color。

5.Lua和C#是如何实现通信的?

交互过程:

  • C#  call  Lua :由C#文件调用Lua解析器底层dll库,由dll文件执行相应的Lua文件;C# -> dl l-> Lua
  • Lua call   C# :首先生成C#源文件所对应的Wrap文件,warp文件把字段方法注册到lua解释器中,就可以通过Warp文件调用C#文件了。  Lua ->Warp->C#

交互原理:

  • 主要通过虚拟栈实现。
  • C# call Lua:C#将数据放入栈顶,Lua去栈顶获取数据,在lua中做处理,然后把结果放回栈顶,再C#从栈顶取出数据,完成交互.
  • Lua call C#:巴拉巴拉巴拉巴拉

6.做ui过程中需要注意什么?如何避免

  • 画布Canvas是unity UI的基本组件。Canvas上有一个元素或多个元素变化时,会污染整个画布。解决:分离动态元素和静态元素。
  • 减少不必要的RayCast Target 。UGUI的点击事件也是一个效率损耗,所以如无必要,建议关掉控件的raycastTarget属性。
  • 如无必要关闭ricetext。
  • 避免使用Camera.main

  • 隐藏画布,禁用Canvas组件。

  • 只在频繁的动态元素上使用Animator组件,对于很少变化的元素,可以使用DoTween插件来完成动画。

7.伤害飘字怎么实现?

  • 首先制作飘字预制体,拥有出现动画,和自动销毁功能,可传出伤害参数。
  • 获取世界坐标内要显示飘字跟随的目标位置,转换为屏幕坐标。transfrom.position -> anchorPoint.
  • 创建一个父级容器,实例化飘字预制体。

你可能感兴趣的:(Unity3D开发,unity)