Unity面试总结

Wesley13
• 阅读 787

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<sitem> bagList = new List<sitem>();


        //初始化单个背包格
        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.
  • 创建一个父级容器,实例化飘字预制体。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这