前言
欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱等功能,我会附带项目源码,以便你更好理解它。
砍树功能
新增树健康控制脚本,死亡随机掉落物品
public class TreeHealth : MonoBehaviour { [SerializeField] private int currentHealth = 10; // 当前树的生命值 [SerializeField] private List<ItemDrop> itemDrops = new List<ItemDrop>(); // 掉落物品列表 // 受到伤害 public void takeDamage(int damage, GameObject player) { currentHealth -= damage; // 减少当前生命值 if (currentHealth <= 0) { // 根据掉落物品列表进行物品掉落 foreach (ItemDrop item in itemDrops) { int quantityToDrop = Random.Range(item.minQuantityToDrop, item.maxQuantityToDrop + 1); // 随机生成掉落物品数量 if (quantityToDrop == 0) return; // 如果掉落数量为0,则直接返回 Item droppedItem = Instantiate(item.ItemToDrop, transform.position, Quaternion.identity).GetComponent<Item>(); // 实例化掉落物品 droppedItem.currentQuantity = quantityToDrop; // 设置掉落物品的数量 player.GetComponent<Inventory>().addItemToInventory(droppedItem); // 将掉落物品加入玩家背包 Destroy(gameObject); // 销毁树对象 } } } } // 物品掉落类 [System.Serializable] public class ItemDrop { public GameObject ItemToDrop; // 要掉落的物品 public int minQuantityToDrop = 1; // 最小掉落数量 public int maxQuantityToDrop = 5; // 最大掉落数量 }
配置树掉落物品
再新增斧头控制脚本
public class AxeItem : MonoBehaviour { [SerializeField] private int axeDamage = 5; // 斧头造成的伤害值 private void Update() { if (Input.GetMouseButtonDown(0)) // 点击鼠标左键 { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 发射射线 RaycastHit hit; if (Physics.Raycast(ray, out hit, 4f)) // 如果射线碰撞到物体 { if (hit.collider.GetComponent<TreeHealth>()) // 如果碰撞到的物体有TreeHealth组件 { hit.collider.GetComponent<TreeHealth>().takeDamage(axeDamage, transform.root.gameObject); // 对该物体造成伤害 } } } } }
配置石斧伤害
效果
源码
源码不出意外的话我会放在最后一节