【Unity实战】按物品掉落率,随机掉落战利品物品系统(附项目源码)

前言

当开发游戏时,一个常见的需求是实现一个物品随机掉落系统。这个系统可以让玩家在击败敌人或完成任务后获得随机的物品奖励,增加游戏的可玩性和乐趣。

在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
在这里插入图片描述

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向宇it

创作不易,感谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值