【unity实战】基于权重的随机事件(附项目源码)

文章目录

  • 前言
  • 开始
    • 一、简单的使用
    • 二、完善各种事件
      • 1. 完善生成金币事件
      • 2. 完善生成敌人事件敌人
      • 3. 完善生成药水事件
  • 最终效果
  • 参考
  • 源码
  • 完结

前言

随机功能和UnityEvent前面其实我们都已经做过了,但是随机+UnityEvent事件要怎么使用呢?这里就来举一个例子说明。

当然对之前随机功能和UnityEvent事件感兴趣的小伙伴也可以去看看,这里我贴出地址

  • 随机功能:
  • UnityEvent事件:适用于任何 2d 游戏的钥匙门系统和buff系统——UnityEvent的使用

ps:本篇为自己的学习记录,希望对你有帮助

开始

一、简单的使用

新增ChestInteractableEvents,定义宝箱交互事件

[System.Serializable]
public class ChestInteractableEvents
{[Header("宝箱事件名称")]public string EventName;[Range(0f, 1f), Header("掉落几率")]public float DropChance = 0.5f;[Header("宝箱交互事件")]public UnityEvent ChestInteractionEvent;
}

新增Box

public class Box : MonoBehaviour
{[Header("宝箱交互事件数组")][SerializeField] private ChestInteractableEvents[] _chestInteractionEvents;//测试执行private void Update(){if (Input.GetKeyDown(KeyCode.Space)){DetermineAndFireChestEvent();}}private void DetermineAndFireChestEvent(){// 计算总的掉落几率float totalChance = 0f;foreach (ChestInteractableEvents interactableEvents in _chestInteractionEvents)totalChance += interactableEvents.DropChance;float rand = Random.Range(0f, totalChance); // 生成一个随机数,范围是0到总掉落几率float cumulativeChance = 0f;foreach (ChestInteractableEvents interactableEvents in _chestInteractionEvents){cumulativeChance += interactableEvents.DropChance;if (rand < cumulativeChance){interactableEvents.ChestInteractionEvent.Invoke(); // 触发宝箱交互事件return;}}}// 生成金币public void SpawnCoins(){Debug.Log("生成了一个金币");}// 生成敌人public void SpawnEnemies(){Debug.Log("生成了敌人");}// 生成生命药水public void SpawnHealthPotion(){Debug.Log("生成了一个生命药水");}
}

箱子挂载脚本,配置事件
在这里插入图片描述
运行效果
在这里插入图片描述

二、完善各种事件

1. 完善生成金币事件

[Header("生成金币")]
[SerializeField] private Rigidbody2D _coinToSpawn; // 要生成的金币刚体
[SerializeField] private int _numberofCoinsTospawn = 100; // 要生成的金币数量
[SerializeField] private float _explosionForce = 10f; // 金币爆炸力度
[SerializeField, Range(0f, 0.5f)] private float _explosionArc = 0.5f; // 金币爆炸角度范围
[SerializeField] private bool _delayBetweenspawns = false; // 是否延迟生成金币
[SerializeField] private Transform _spawnTransform; // 生成金币的位置/// <summary>
/// 生成金币
/// </summary>
public void SpawnCoins()
{if (!_delayBetweenspawns){// 直接生成金币for (int i = 0; i < _numberofCoinsTospawn; i++){Rigidbody2D coinRB = Instantiate(_coinToSpawn, _spawnTransform.position, Quaternion.identity);Explosion(coinRB);}}else{// 延迟生成金币StartCoroutine(SpawnCoinsWithDelay());}
}/// <summary>
/// 延迟生成金币
/// </summary>
/// <returns></returns>
private IEnumerator SpawnCoinsWithDelay()
{for (int i = 0; i < _numberofCoinsTospawn; i++){Rigidbody2D coinRB = Instantiate(_coinToSpawn, _spawnTransform.position, Quaternion.identity);Explosion(coinRB);yield return null;}
}/// <summary>
/// 金币爆炸效果
/// </summary>
/// <param name="rb"></param>
private void Explosion(Rigidbody2D rb)
{Vector2 randDir = new Vector2(Random.Range(-_explosionArc, _explosionArc), 1f);Vector2 force = randDir.normalized * _explosionForce;rb.AddForce(force, ForceMode2D.Impulse);
}

效果,金币飞出
在这里插入图片描述

2. 完善生成敌人事件敌人

[Header("生成敌人")]
[SerializeField] private GameObject[] _enemiesToSpawn; // 要生成的敌人数组
[SerializeField] private GameObject _enemySpawnParticles; // 敌人生成时的粒子效果
[SerializeField] private int _numofEnemiesToSpawn = 3; // 要生成的敌人数量
[SerializeField, Range(0f, 15f)] private float _enemySpawnoffset = 2f; // 敌人生成的偏移距离/// <summary>
/// 生成敌人
/// </summary>
public void SpawnEnemies()
{for (int i = 0; i < _numofEnemiesToSpawn; i++){int randIndex = Random.Range(0, _enemiesToSpawn.Length);float randX = Random.Range(-_enemySpawnoffset, _enemySpawnoffset);float randY = Random.Range(-_enemySpawnoffset, _enemySpawnoffset);Vector2 spawnPos = ((Vector2)_spawnTransform.position + new Vector2(randX, randY)).normalized;GameObject enemy = Instantiate(_enemiesToSpawn[randIndex], spawnPos, Quaternion.identity);//生成粒子效果GameObject enemySpawnParticles = Instantiate(_enemySpawnParticles, spawnPos, Quaternion.identity);//粒子效果和敌人大小一致enemySpawnParticles.transform.localScale = enemy.transform.localScale;}
}

效果
在这里插入图片描述

3. 完善生成药水事件

[Header("生成生命药水")]
[SerializeField] private Rigidbody2D _healthPotionToSpawn; // 要生成的生命药水刚体
[SerializeField] private float _upwardForce = 5f; // 生命药水向上的力度/// <summary>
/// 生成生命药水
/// </summary>
public void SpawnHealthPotion()
{Rigidbody2D rb = Instantiate(_healthPotionToSpawn, _spawnTransform.position, Quaternion.identity);Vector2 force = Vector2.up * _upwardForce;rb.AddForce(force, ForceMode2D.Impulse);
}

效果
在这里插入图片描述

最终效果

在这里插入图片描述

参考

【视频】https://www.youtube.com/watch?v=UeTlJyBz7h8

源码

https://gitcode.net/unity1/unity-randomevent
在这里插入图片描述

完结

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由于找不到steam_api64.dll如何修复?steam_api64.dll丢失多种解决方法

steam_api64.dll文件介绍 steam_api64.dll是Steam平台的一个关键组件&#xff0c;主要用于支持Steam客户端和相关游戏的应用程序。这个文件缺失或损坏会导致Steam及相关游戏无法正常运行。它位于Steam安装目录的bin子文件夹中。 steam_api64.dll丢失的原因 系统误删&#xf…

爬虫代理技术与构建本地代理池的实践

爬虫中代理的使用&#xff1a; 什么是代理 代理服务器 代理服务器的作用 就是用来转发请求和响应 在爬虫中为何需要使用代理&#xff1f; 隐藏真实IP地址&#xff1a;当进行爬取时&#xff0c;爬虫程序会发送大量的请求到目标网站。如果每个请求都使用相同的IP地址&#xff…

修复 MyBatis 中空值引起的 SQL 语法错误

修复 MyBatis 中空值引起的 SQL 语法错误 背景 最近在查看别人的项目代码时&#xff0c;遇到了一个问题&#xff1a;数据库中的数据为空。在调试过程中&#xff0c;发现问题出现在调用 MyBatis 中的方法&#xff1a;listByIds(Collection<? extends Serializable> idL…

.net core 封装一个统一的返回结果

public class ApiResponse<T> { public bool Success { get; set; } public T? Data { get; set; } public string? Message { get; set; } public ApiResponse(bool success, T? data, string errorMessage "") { …

矩阵快速幂及应用实战[C/C++]

矩阵快速幂 矩阵快速幂可以用来优化递推问题&#xff0c;如状态机DP&#xff0c;需要一丢丢线性代数里面矩阵的概念&#xff0c;只需要知道简单的矩阵乘法&#xff0c;结合我们普通的二分快速幂就能很快的掌握矩阵快速幂。 问题引入 三步问题。有个小孩正在上楼梯&#xff0c;楼…

一文学会Aiohttp

一、什么是aiohttp库 aiohttp库官网&#xff1a;https://docs.aiohttp.org/en/stable/ aiohttp是一个Python的HTTP客户端/服务器框架&#xff0c;它基于asyncio库实现异步编程模型&#xff0c;可以支持高性能和高并发的HTTP通信。aiohttp用于编写异步的Web服务器、Web应用程序…

【Vulnhub 靶场】【Coffee Addicts: 1】【简单-中等】【20210520】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/coffee-addicts-1,699/ 靶场下载&#xff1a;https://download.vulnhub.com/coffeeaddicts/coffeeaddicts.ova 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年5月20日 文件大小&#xff1a;1.3 …

【数值计算方法(黄明游)】常微分方程初值问题的数值积分法:欧拉方法(向后Euler)【理论到程序】

文章目录 一、数值积分法1. 一般步骤2. 数值方法 二、欧拉方法&#xff08;Euler Method&#xff09;1. 向前欧拉法&#xff08;前向欧拉法&#xff09;2. 向后欧拉法&#xff08;后向欧拉法&#xff09;a. 基本理论b. 算法实现 常微分方程初值问题的数值积分法是一种通过数值方…

webpack如何处理文件、图片

webpack5之前是通过&#xff0c;file-loader、raw-loader、url-loader处理文件 webpack5是通过使用资源模块类型&#xff08;asset module type&#xff09;处理文件 资源模块类型(asset module type)&#xff0c;通过添加 4 种新的模块类型&#xff0c;来替换所有这些 loade…

Linux常用命令——rm 命令

文章目录 Linux系统中的rm命令是一个非常强大且危险的工具&#xff0c;用于删除文件和目录。由于其具有不可逆的特性&#xff0c;了解其参数和正确使用非常重要。 1. 基本用法 rm命令的基本格式是rm [选项] 文件或目录。不带任何选项时&#xff0c;rm命令仅删除文件。 示例&a…

python读取excel自动化生成sql建表语句和java实体类字段

1、首先准备一个excel文件&#xff1a; idtypenameidint学号namestring姓名ageint年龄sexstring性别weightdecimal(20,4)体重scoredecimal(20,4)分数 2、直接生成java字段和注释&#xff1a; import pandas as pddf pd.read_excel(test.xlsx, sheet_nameSheet1)for i in ran…

java 对象大小计算

说明&#xff1a; 对于64位机&#xff1a;一个对象由三部分组成 对象头(object header) mark word &#xff1a;64bitkclass pointer &#xff1a;32bit(默认使用指针压缩)&#xff0c;如果取消指针压缩( XX:-UseCompressedOops)&#xff0c;则占用64bit数组长度&#xff1a;数…

Zynq-Linux移植学习笔记之67- 国产ZYNQ上通过GPIO模拟MDC/MDIO协议

1、背景介绍 模块上有9个PHY&#xff0c;其中两个PHY通过ZYNQ PS端的MDIO总线连接&#xff0c;其余7个PHY单独通过GPIO进行控制&#xff0c;需要实现GPIO模拟MDC/MDIO协议。 2、vivado工程设计 vivado工程内为每个PHY建立两个GPIO IP核&#xff0c;分别用来代表MDC和MDIO&…

基于BP神经网络的手写体数字识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 filename dir(images\*.bmp); %图像文件格式 load BP.matfilename dir(test\*.bmp); …

PyQt基础_009_ 按钮类控件QSlider

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class SliderDemo(QWidget):def __init__(self, parentNone):super(SliderDemo, self).__init__(parent)self.setWindowTitle("QSlider 例子") self.resize…

Google play开发者账号付款资料暂停的原因及解决方案

相信大多数Google play开发者都收到过这封邮件 邮件内容的大致意思是“由于可疑的活动&#xff0c;我们暂停了你的付款资料。” “要恢复您的帐户&#xff0c;请转到您的帐户并执行所要求的操作。” 这是触发了谷歌的付款风控机制&#xff0c;根据开发者们的反馈&#xff0c;账…

滴滴打车崩了!全过程

滴滴发布致歉10元补偿券&#xff0c;文末可领取 。 事情发生于 2023年11月27日晚~28日中午&#xff0c;滴滴打车服务出现大面积故障&#xff0c;登上微博热搜。 许多用户在使用滴滴出行时遇到了无法叫车、订单异常等问题&#xff0c;导致大量用户滞留在外&#xff0c;出行受阻…

2023年11月编程语言排行榜——你的编程语言上榜了吗?

编程语言的流行度是一个热门的话题&#xff0c;不同的机构和平台有不同的评判标准和排名方法。本文将以 TIOBE 编程社区指数为例&#xff0c;介绍 2023 年 11 月的编程语言趋势榜单&#xff0c;分析各种编程语言的表现和原因&#xff0c;以及对未来的展望。 TIOBE 编程社区指数…

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

上一课&#xff1a; 【小黑嵌入式系统第一课】嵌入式系统的概述&#xff08;一&#xff09;——概念、特点、发展、应用 下一课&#xff1a; 【小黑嵌入式系统第三课】嵌入式系统硬件平台&#xff08;一&#xff09;——概述、总线、存储设备&#xff08;RAM&ROM&FLASH…

QDoubleSpinBox的使用示例

QDoubleSpinBox即可以做为数值型输入框使用&#xff0c;也可以使用只读型数据显示框&#xff0c;在作为输入框使用时比QLineEdit有以下几个方面的优势 1.可以设置范围&#xff0c;并且范围精确&#xff0c; 2.输入数据精确&#xff0c;自动屏幕非数值以外的字符。 3.设置步长后…