前言
欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中,我们将探索如何制作一个类似于七日杀和森林的生存游戏。
本篇内容会比较多,我会分几篇来实现,感兴趣的可以关注一下,以免错过内容更新。
本节主要实现了垃圾桶回收物品的功能。
回收物品
素材
绘制UI
垃圾桶UI
提示UI
代码控制垃圾桶回收功能
修改InventoryItem,新增变量
public class TrashSlot : MonoBehaviour, IDropHandler, IPointerEnterHandler, IPointerExitHandler { public GameObject trashAlertUI; // 垃圾桶警告界面 private TextMeshProUGUI textToModify; // 警告界面中的文本组件 public Sprite trash_closed; // 关闭状态的垃圾桶图片 public Sprite trash_opened; // 打开状态的垃圾桶图片 private Image imageComponent; // 垃圾桶的图片组件 private Button YesBTN; // 确认按钮 private Button NoBTN; // 取消按钮 // 被拖拽的物品 private GameObject draggedItem { get { return DragDrop.itemBeingDragged; } } GameObject itemToBeDeleted; public string itemName { get { string name = itemToBeDeleted.name; string toRemove = "(Clone)"; string result = name.Replace(toRemove, ""); return result; } } void Start() { imageComponent = transform.Find("Image").GetComponent<Image>(); textToModify = trashAlertUI.transform.Find("问题").GetComponent<TextMeshProUGUI>(); YesBTN = trashAlertUI.transform.Find("确认").GetComponent<Button>(); YesBTN.onClick.AddListener(delegate { DeleteItem(); }); NoBTN = trashAlertUI.transform.Find("取消").GetComponent<Button>(); NoBTN.onClick.AddListener(delegate { CancelDeletion(); }); } public void OnDrop(PointerEventData eventData) { if (draggedItem.GetComponent<InventoryItem>().isTrashable == true) // 如果被拖拽的物品可被丢弃 { itemToBeDeleted = draggedItem.gameObject; // 设置要删除的物品为被拖拽的物品 StartCoroutine(notifyBeforeDeletion()); // 开始删除前的警告流程 } } IEnumerator notifyBeforeDeletion() { trashAlertUI.SetActive(true); // 显示警告界面 textToModify.text = "确认丢弃 " + itemName + "?"; // 设置警告文本 yield return new WaitForSeconds(1f); } private void CancelDeletion() { imageComponent.sprite = trash_closed; // 设置垃圾桶图片为关闭状态 trashAlertUI.SetActive(false); // 隐藏警告界面 } private void DeleteItem() { imageComponent.sprite = trash_closed; // 设置垃圾桶图片为关闭状态 Destroy(itemToBeDeleted.gameObject); // 立即销毁要删除的物品 InventorySystem.Instance.ReCalculeList(); // 重新计算物品列表 CraftingSystem.Instance.RefreshNeededItems(); // 刷新需要的物品 trashAlertUI.SetActive(false); // 隐藏警告界面 } public void OnPointerEnter(PointerEventData eventData) { if (draggedItem != null && draggedItem.GetComponent<InventoryItem>().isTrashable == true) // 如果有被拖拽的物品且可被丢弃 { imageComponent.sprite = trash_opened; // 设置垃圾桶图片为打开状态 } } public void OnPointerExit(PointerEventData eventData) { if (draggedItem != null && draggedItem.GetComponent<InventoryItem>().isTrashable == true) // 如果有被拖拽的物品且可被丢弃 { imageComponent.sprite = trash_closed; // 设置垃圾桶图片为关闭状态 } } }
挂载脚本,配置参数
这里测试,勾选石头和树枝为可回收物品,并可以同步修改物品功能描述
效果
源码
源码不出意外的话我会放在最后一节