【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。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/197668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Open Feign 源码解析(一) --- FactoryBean的妙用

什么是Open Feign? OpenFeign 是 Spring Cloud 全家桶的组件之一&#xff0c; 其核心的作用是为 Rest API 提供高效简洁的 RPC 调用方式 搭建测试项目 服务接口和实体 项目名称 cloud-feign-api 实体类 public class Order implements Serializable {private Long id;p…

windows中打开psql命令行

一、第一种方式 1.点击下方的psql&#xff0c;打开命令行窗口 2.中括号中的是默认值&#xff0c;直接回车就行 3.成功 二、第二种方式 双击安装目录中的执行文件 “D:\soft\postgresql\catalogue\scripts\runpsql.bat” 三、第三种方式 1.加到环境变量 把“D:\soft\postg…

ubuntu vmware开启3d加速画面异常

在ubuntu上开启vmware&#xff0c;进入全屏就会出现左上角和右下角两个不同的画面&#xff0c;并来回闪&#xff0c;不使用3d加速&#xff0c;一切正常&#xff0c;但是画面模糊。在ubuntu18 20 22上测试&#xff0c;vmware 15 16 17问题依旧。 原因 经过测试&#xff0c;原…

【Java】认识异常

文章目录 一、异常的概念和体系结构1.异常的概念2.异常的体系结构3.异常的分类 二、异常的处理1.防御式异常2.异常的抛出3.异常的捕捉 三、异常的处理流程四、自定义异常类 一、异常的概念和体系结构 1.异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为…

麒麟操作系统光盘救援模式

麒麟操作系统光盘救援模式 Kylin V4 桌面版&#xff1a; 启动主机后&#xff0c;插入系统光盘&#xff0c;在 BIOS 启动项里设置成从光盘启动后保存退出重启主机。 稍等片刻就会到启动菜单选项&#xff0c;到启动菜单界面后选择第一项试用银河麒麟操作系统而不安 装&#xff…

6.2 Windows驱动开发:内核枚举SSSDT表基址

在Windows内核中&#xff0c;SSSDT&#xff08;System Service Shadow Descriptor Table&#xff09;是SSDT&#xff08;System Service Descriptor Table&#xff09;的一种变种&#xff0c;其主要用途是提供Windows系统对系统服务调用的阴影拷贝。SSSDT表存储了系统调用的函数…

3.前端--HTML标签-文本图像链接【2023.11.25】

1.HTML常用标签(文本图像链接&#xff09; 文本标签 标题 <h1> - <h6> 段落<p> 我是一个段落标签 </p> 换行 <br /> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta ht…

C++进阶篇5---番外-位图和布隆过滤器

哈希的应用 一、位图 情景&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中&#xff1f;&#xff1f;&#xff1f; 看到查找元素的范围&#xff0c;暴力肯定是过不了的&#xff0c;我们要么…

什么游戏搬砖挣钱,还不费时间?

游戏搬砖的项目挺多的&#xff0c;但是不费时间&#xff1f;估计就Steam搬砖或叫CSGO搬砖。 正常的游戏搬砖的项目&#xff0c;想要挣钱&#xff0c;没有不费时间的。因为游戏搬砖是需要耗费大量的时间去玩游戏&#xff0c;熟悉游戏&#xff0c;利用自己的时间和技巧手段在游戏…

TDA4VM MCUSW

文章目录 1. 原文概述2. 如何配置MCUSW?2.1 向TI申请EB安装包2.2 安装EB配置工具3. MCAL支持的外设注意:本篇主要参考的文档在这里哈:ti-processor-sdk-rtos-j721e-evm-09_00_01_01/mcusw/mcal_drv/docs/drv_docs/mcusw_c_ug_top.html 1. 原文概述 J721E/J7200/J721S2/J78…

高中生分科考试--座位编排系统

这个系统是帮我一同学的哥哥的做的座位编排系统&#xff0c;他是某个学校的教育从事者 基本需求&#xff1a;就是能够根据他提供的各个分科班级同学的成绩单来选择相同分科的考场编排&#xff08;按成绩高低&#xff09;&#xff0c;同时输入相应的考场数&#xff0c;和每个考…

MPPT工作流程及算法和硬件的选择

MPPT算法选择 目前&#xff0c;MPPT算法有开路电压比率(离线)、短路电流比率(离线)、观察调节(在线)、极限追踪控制法(在线)。 在光伏控制系统中&#xff0c;因为日照、温度等条件的变化&#xff0c;光伏电池的输出功率也是在不断变化的&#xff0c;为保证使得光伏电池的输出功…

Python基础语法之学习运算符

Python基础语法之学习运算符 一、代码二、效果 一、代码 print("1 1 ", 1 1) print("1 - 1 ", 1 - 1) print("1 * 1 ", 1 * 1) print("11 / 5 ", 11 / 5) print("11 // 5 ", 11 // 5) print("9 % 5 ", 9…

【单调栈】最大二叉树

题目&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…

linux用户身份切换su和 sudo

su 切换root&#xff0c;但是&#xff0c;环境变量是之前用户的 可以看到利用su切换&#xff0c;根目录还是pro1的 su - 连同环境一起切换成root&#xff0c;切换后工作目录都不一样了&#xff0c;看输入内容左侧信息&#xff0c;和第一个图片比较 -c仅执行一次命令&#xff0…

INFINI Gateway 与华为鲲鹏完成产品兼容互认证

何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务&#xff08;含公有云、私有云、混合云、桌面云&#xff09;推出的一项合作伙伴计划&#xff0c;旨在为构建持续发展、合作共赢的鲲鹏生态圈&#xff0c;通过整合华为的技术、品牌资源&#xff0c;与合作伙伴共享商机和利…

脚本绑邦引流脚本拓客软件短视频获客直播间截流抖音快手小红书自动引流关注点赞私信评论截流涨粉

一、引流脚本是什么&#xff1f; 引流脚本是一种自动化的工具&#xff0c;可以帮助你在各​种短视频、​社交媒体平台上进行批量关注、点赞、私信、评论等操作&#xff0c;从而吸引更多的流量和粉丝。通过引流脚本&#xff0c;你可以自动化地执行各种操作&#xff0c;解放双手…

kafka如何保证消息不丢失 不重复消费 消息的顺序

如何保证消息的不丢失 消息为什么会丢失 想要保证消息不丢失就要首先知道消息为什么会丢失,在哪个环节会丢失,然后在丢失的环节做处理 1.生产者生产消息发送到broker,broker收到消息后会给生产者发送一个ack指令.生产者接收到broker发送成功的指令,这个时候我们就可以认为消息…

RPG项目01_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

Spring Boot 3.2.0 Tomcat虚拟线程初体验 (部分装配解析)

写在前面 spring boot 3 已经提供了对虚拟线程的支持。 虚拟线程和平台线程主要区别在于&#xff0c;虚拟线程在运行周期内不依赖操作系统线程&#xff1a;它们与硬件脱钩&#xff0c;因此被称为 “虚拟”。这种解耦是由 JVM 提供的抽象层赋予的。 虚拟线程的运行成本远低于平…