前言
当开发游戏时,一个常见的需求是实现一个物品随机掉落系统。这个系统可以让玩家在击败敌人或完成任务后获得随机的物品奖励,增加游戏的可玩性和乐趣。
在Unity中,我们可以通过编写代码来实现这样的战利品系统。具体而言,我们可以创建一个包含多个战利品的列表,并为每个战利品设置一个掉落率。然后,在适当的时机,根据掉落率随机选择一个战利品进行掉落。
在本教程中,我们将探索如何在Unity中灵活地设计和实现这样一个战利品系统。我们将学习如何生成随机数、选择掉落物品、实例化战利品物体以及给物体施加力等技术。通过完成本教程,您将能够自由定制并添加战利品系统到您的游戏中。
让我们开始吧!在接下来的教程中,我将为您提供详细的代码示例和解释,帮助您一步步完成这个灵活的战利品系统。无论您是初学者还是有经验的开发者,都能轻松跟随本教程进行开发。
开始
新增Loot,定义战利品配置
[CreateAssetMenu] public class Loot : ScriptableObject { [Header("战利品图像")] public Sprite lootSprite; [Header("战利品的名称")] public string lootName; [Range(0, 100), Header("此战利品掉落的概率")] public int dropChance; public Loot(string lootName, int dropChance) { this.lootName = lootName; this.dropChance = dropChance; } }
配置,dropChance=100则100%会掉落
定义物品预制体
新增LootBag,背包中战利品的容器
public class LootBag : MonoBehaviour { [Header("掉落的物品预制体")] public GameObject droppedItemPrefab; [Header("存储战利品的列表")] public List<Loot> lootList = new List<Loot>(); //获取掉落物品 Loot GetDroppedItem() { int randomNumber = Random.Range(1, 101); // 生成1-100之间的随机数 List<Loot> possibleItems = new List<Loot>(); // 从战利品列表中选择可能掉落的物品 foreach (Loot item in lootList) { if (randomNumber <= item.dropChance) { possibleItems.Add(item); } } // 如果有可以掉落的物品,则从可能物品列表中随机选择一件掉落 if (possibleItems.Count > 0) { Loot droppedItem = possibleItems[Random.Range(0, possibleItems.Count)]; return droppedItem; } // 如果没有物品掉落,则在控制台中输出日志并返回null Debug.Log("没有物品掉落"); return null; } public void InstantiateLoot(Vector3 spawnPosition) { Loot droppedItem = GetDroppedItem(); // 如果存在掉落的物品 if (droppedItem != null) { GameObject lootGameObject = Instantiate(droppedItemPrefab, spawnPosition, Quaternion.identity); // 设置战利品物体的精灵为掉落物品的精灵 lootGameObject.GetComponent<SpriteRenderer>().sprite = droppedItem.lootSprite; float dropForce = 3.0f; // 掉落力度 Vector2 dropDirection = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f)); // 给战利品物体添加向随机方向施加的力 lootGameObject.GetComponent<Rigidbody2D>().AddForce(dropDirection * dropForce, ForceMode2D.Impulse); } } }
新增Enemy,测试敌人死亡爆出战利品
public class Enemy : MonoBehaviour { //测试人物死亡 private void Update() { if(Input.GetKeyDown(KeyCode.Space)){ Die(); } } private void Die(){ //生成战利品 GetComponent<LootBag>().InstantiateLoot(transform.position); Destroy(this); } }
挂载配置数据
效果
参考
【视频】https://www.youtube.com/watch?v=KjvvRmG7PBM
源码
https://gitcode.net/unity1/unity-randomlootsystem