当前位置:   article > 正文

【在Unity中创建生存游戏 】7~9_unity如何制作生存类游戏

unity如何制作生存类游戏

# Day4(3)

目标:制作一个物品制作系统,首先是UI界面

操作


像这样就行,会有两个界面(主要用到Image,Text,Button),具体操作与库存界面一样

未完待续

后来的补充:教程中需要的合成材料(比如上面的红色晶石)用的英文,名字与预制体名字/拾取物体名字均一致,这样才方便后面根据名字直接实例化预制体。

Day5


目标:

1)解决bug:当同时打开背包和制作菜单后关闭任意一个会导致鼠标光标锁定

2)实现在工具制作界面显示我们已经拥有的材料数量,并保证在可以合成物品的时候才显示制作按钮

3)点击制作按钮后生成对应预制体的同时移除消耗的合成材料(难)

操作


1)在执行锁定光标前检测另一个面板是否在打开状态,若打开着就不锁定光标

2)预制体想要实例化需要把预制体放在更目录的文件夹中

3)当前的画布Canvas中有

  • 准心

  • 显示准心所对物体名字的文本

  • 背包UI(包含多个插槽Image,每个插槽下都有一个Image为显示拥有物品)

  • 制作方向选择UI(包含Button指向工具制作UI,以及指示用图像)

  • 工具制作UI(包含Button指向预制件实例,以及指示用图像)

4)为了方便合成物品创建了BluePrint 蓝图类(BluePrint的代码在后面)

提要:我们根据传入的名字来实例化预制体,根据名字和数量来移除背包内的对应材料,所以将这些参数提前创建蓝图对象,后续只要从蓝图对象上获取数据就可以直接实现添加item到库存系统和从库存系统移除制作物品所消耗的材料

注意:这意味这我们每多一种可以实例化的预制体,就要在CraftingSystem中的Start()内创建新的对应蓝图

图表*2

InventorySystemHaveinventorySreenUI 背包UIslotList 包含所有插槽的列表itemList 包含所有项目/物品对象的列表itemToAdd 将要被添加进背包的物品对象whatSlotToEquip 物品添加的目标插槽isOpen 背包面板已经被打开isFull 背包已经满了/所有插槽都有子元素Awake_f实现单例Start_f初始化PopulateSlotList_f初始化背包插槽的列表AddToInventory_f根据名字添加游戏对象的预制体 包含实例化对象FindNextEmptySlot_f返回下一个空的插槽Update_f检查背包键是否按下 控制背包UI显示和光标锁定CheckIfFull_f遍历查找背包中的空插槽RemoveItem_f根据nameToRemove与amonutToRemove从背包中移除同名的物品ReCalculateList_f更新itemList并去除因为实例化预制体而出现的Clone后缀

CraftingSystemHavecraftingScreenUI 制作方向选择面板/包含工具 药水 等等toolsScreenUI 工具制作面板inventoryItemList 复制InventorySystem.Instance.itemList,在RefreshNeededItems_f中使用toolsBTN 制作方向选择面板的按钮,这个按钮指向进入工具制作面板craftAxeBTN 工具制作面板的按钮,这个按钮指向制作AxeAxeReq1 制作Axe的要求文本1要求文本的数量取决于制作的对象,这里仅为制作Axe要的2个文本AxeReq2 制作Axe的要求文本2isOpen 制作方向选择面板or工具制作面板被打开AxeBLP Axe的蓝图 蓝图是由另一个脚本BluePrint所产生的类Awake_f实现单例Start_f初始化开关状态,按钮,制作要求文本,蓝图 并且建立委托来添加制作的新物品到背包OpenToolsCategory_f开启制作栏的方法CraftAnyItem_f先前在Start中所用的委托,通过蓝图获取制作对象的名字及要求Update_f和InventorySystem中的一样RefreshNeededItems_f检查InventorySystem中各种物品的数量,判断进阶物品是否可以制作,然后显示制作按钮IEnumerator cacilate_f这个方法解决了在一次制作后原材料没有真正减少的问题 使用逻辑不懂 详见代码

  1. public class BluePrint : MonoBehaviour
  2. {
  3. public string itemName;
  4. public string req1 = "";
  5. public string req2 = "";
  6. public string req3 = "";
  7. public string req4 = "";
  8. public int req1Amount=0;
  9. public int req2Amount=0;
  10. public int req3Amount=0;
  11. public int req4Amount=0;
  12. public int numOfRequirements;
  13. public BluePrint(string name,int reqNum,string R1,int R1num,string R2,int R2num)//后面可以重载
  14. {
  15. itemName = name;
  16. numOfRequirements = reqNum;
  17. req1 = R1;
  18. req2 = R2;
  19. req1Amount = R1num;
  20. req2Amount = R2num;
  21. }
  22. }

Day 6


目标:

  1. 对上次的代码进行一些修改

  1. 新增获取提示界面

操作


修改游戏中的鼠标光标

  • 导入光标图片,设置为Custor类型

  • 在Project Settings -->Player-->Default Custor中添加图片

实现当准心落在在可拾取的物品上时,准心外观改变--> 和当初显示物品文本的逻辑一样,在画布中添加新的图片(手的图片),当检测到物品可拾取就禁用原来的准心,激活新的那个

实现警报装置,在获取东西后屏幕上出现提示,一段时间后自己淡出然后自毁-->在库存系统中添加这三个引用

public GameObject pickupAlert;

public Text pickupName;//拾取对象的名字所要显示的文本对象

public Image pickupImage;//拾取对象的图片所要显示的图片对象

通过方法实现把引用对象内容修改为拾取物品的相关内容,并把这个方法添加到AddToInventory中

对上一次代码的更正:CraftingSystem的RefreshNeededItems()方法不应该在CraftingSystem的update中保持运行,它只需要在有物品添加或移除时候在InventorySystem中的添加或移除方法里调用就好

发现新bug:只要准心瞄准过物品,物品的onTarget就会被修改为真,之后玩家只要在范围内按'E'就可以不用瞄准拾取物品,或许可以在InteractableObject中添加计时器,一旦onTarget为真就开始倒计时,除非一致传入信号,否则很快时间内自动置为false.(不对)

  1. //在InventorySystem中新添的代码
  2. void TriggerPickupPopUP(string itemName,Sprite itemsprite)
  3. {
  4. pickupAlert.SetActive(true);
  5. pickupName.text = itemName;
  6. pickupImage.sprite = itemsprite;
  7. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/111414
推荐阅读
相关标签
  

闽ICP备14008679号