1.从接到任务到完成任务,一共几个过程,每个过程注意什么?
- 需求分析:确保理解和策划想法一致。
- 搭建ui或场景:
- 编写代码:
- 测试功能:
- 解决bug:
2.设计一个背包系统,格子500. 伪代码实现 增,删,改,查。struct sitem{ string uid,int index, int count, int itemcode }
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace PaiXu 8{ 9 struct sitem { 10 public string uid; //唯一id 11 public int index; //位置 12 public int itemCoad; //物品id 13 public int itemAmount; //物品数量 14 } 15 16 class Class2 17 { 18 public int bagCount = 500; 19 20 //申请一个背包列表 21 public List<sitem> bagList = new List<sitem>(); 22 23 24 //初始化单个背包格 25 public void InitSimpBagItem(int index) 26 { 27 bagList[index] = new sitem(); 28 } 29 //初始化整个背包 30 public void InitBag() { 31 for (int i = 0; i < bagCount; i++) { 32 InitSimpBagItem(i); 33 } 34 } 35 36 //检查格子是否为空 37 public bool CheckNull(int index) { 38 if (bagList[index].itemAmount == 0) 39 { 40 return true; 41 } 42 else { 43 return false; 44 } 45 } 46 //检查背包中是否含有这个物品(id),返回位置 47 public int CheckItem(int id) { 48 for (int i = 0; i < bagCount; i++) { 49 if (bagList[i].itemCoad == id) { 50 return i; 51 } 52 } 53 return -1; 54 } 55 //获取位置最小的空格子 56 public int FindFull() { 57 for (int i = 0; i < bagCount; i++) { 58 if (bagList[i].itemAmount == 0) { 59 return i; 60 } 61 } 62 return -1; //满了 63 } 64 65 66 //增 67 public void AddItem(sitem sitem) { 68 //检查是否存在 69 int bagIndex = CheckItem(sitem.itemCoad); 70 if (bagIndex == -1) 71 { 72 int newBagIndex = FindFull(); 73 if (newBagIndex == -1) 74 { 75 return; 76 } 77 else 78 { 79 sitem.index = newBagIndex; 80 sitem.itemAmount = 1; 81 bagList[newBagIndex] = sitem; 82 } 83 } 84 else { 85 sitem.itemAmount = bagList[bagIndex].itemAmount + 1; 86 bagList[bagIndex] = sitem; 87 } 88 } 89 90 //删 91 public void DelectItem(int id) { 92 int bagIndex = CheckItem(id); 93 if (bagIndex == -1) 94 { 95 return; 96 } 97 else { 98 sitem item = bagList[bagIndex]; 99 item.itemAmount -= 1; 100 if (item.itemAmount <= 0) { 101 InitSimpBagItem(bagIndex); 102 } 103 bagList[bagIndex] = item; 104 } 105 } 106 } 107}
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.
- 创建一个父级容器,实例化飘字预制体。