前言
欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中,我们将探索如何制作一个类似于七日杀和森林的生存游戏。
本篇内容会比较多,我会分几篇来实现,感兴趣的可以关注一下,以免错过内容更新。
本节主要实现了快捷栏选中和切换显示手臂的功能。
选中效果
修改EquipSystem,实现选中和取消选中状态切换
public GameObject selectedItem; // 当前选中物品 public int selectedNumber = -1;//当前选中索引 private void Update() { // 遍历数字1到7 for (int i = 1; i <= 7; i++) { // 检查是否按下对应的数字键 if (Input.GetKeyDown(KeyCode.Alpha0 + i)) { // 调用SelectQuickSlot方法,传递当前数字作为参数 SelectQuickSlot(i); } } } public void SelectQuickSlot(int number) { // 如果该物品已经选中则取消选中物品 if(selectedNumber == number){ selectedItem.GetComponent<InventoryItem>().isSelected = false; selectedItem = null; selectedNumber = -1; return; } // 如果该快捷栏格子已满,则选中该格子 if (CheckIfSlotIsFull(number) == true) { selectedNumber = number; // 如果已经有选中的物品则取消所有的选中物品 if (selectedItem != null) { selectedItem.GetComponent<InventoryItem>().isSelected = false; } // 选中当前快捷栏格子中的物品 selectedItem = GetSelectedItem(number); selectedItem.GetComponent<InventoryItem>().isSelected = true; } } // 获取指定快捷栏格子中的物品 private GameObject GetSelectedItem(int slotNumber) { return quickSlotsList[slotNumber - 1].transform.GetChild(0).gameObject; } // 检查指定的快捷栏格子是否有物品 private bool CheckIfSlotIsFull(int slotNumber) { if (quickSlotsList[slotNumber - 1].transform.childCount > 0) { return true; } else { return false; } }
修改InventoryItem,实现物品选中禁止拖拽功能,且开启关闭物品背景颜色提示框
[Header("是否选中")] public bool isSelected; void Update() { if (isSelected) { gameObject.GetComponent<DragDrop>().enabled = false; transform.Find("Background").gameObject.SetActive(true); } else { gameObject.GetComponent<DragDrop>().enabled = true; transform.Find("Background").gameObject.SetActive(false); } }
快捷栏显示对应的手臂工具
修改EquipSystem
[Header("手臂配置")] public GameObject armHolder;//手臂位置 public GameObject selectedArmModel;//当前选中的手臂 public List<GameObject> armList = new List<GameObject>();//手臂列表 //。。。 private void PopulateSlotList() { //。。。 // 遍历工具界面下的所有子物体 foreach (Transform child in armHolder.transform) { // 将子对象添加到slotList列表中 armList.Add(child.gameObject); } } public void SelectQuickSlot(int number) { // 如果该物品已经选中则取消选中物品 if(selectedNumber == number){ //。。。 SetNotEquippedModel(); return; } // 如果该快捷栏格子已满,则选中该格子 if (CheckIfSlotIsFull(number) == true) { //。。。 SetEquippedModel(selectedItem); } } //切换手臂装备 private void SetEquippedModel(GameObject selectedItem) { if(!selectedItem) return; string name = selectedItem.GetComponent<InventoryItem>().thisName; armList.ForEach(arm => { if(arm.name == name + "_Arm"){ arm.SetActive(true); selectedArmModel = arm; }else{ arm.SetActive(false); } }); } //关闭手臂装备 private void SetNotEquippedModel() { selectedArmModel.SetActive(false); }
配置参数
配置几个手臂模型预制体,记得默认隐藏,模型就自行去找和制作了,我也没找到免费的
效果
源码
源码不出意外的话我会放在最后一节