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

news2024/9/30 13:22:02

文章目录

  • 前言
  • 开始
    • 一、简单的使用
    • 二、完善各种事件
      • 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.coloradmin.cn/o/1261635.html

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

相关文章

技术人如何实现颠覆式成长

前言 颠覆式成长要求个人不断创新、承担风险&#xff0c;并抓住机遇。通过创新的方法&#xff0c;充分发挥个人的优势&#xff0c;并在个人成长中突破传统、发挥独特的方式和思考&#xff0c;从而实现个人创造力和效能的突破。 颠覆式成长需要不断学习和个人发展&#xff0c;…

2015年五一杯数学建模A题不确定性条件下的最优路径问题解题全过程文档及程序

2015年五一杯数学建模 A题 不确定性条件下的最优路径问题 原题再现 目前&#xff0c;交通拥挤和事故正越来越严重的困扰着城市交通。随着我国交通运输事业的迅速发展&#xff0c;交通“拥塞”已经成为很多城市的“痼疾”。在复杂的交通环境下&#xff0c;如何寻找一条可靠、快…

(C++)字符串相乘

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 题目链接如下&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名…

Docker 容器日志查看和清理

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

山寨Stream API

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 一个需求 List<Per…

LeetCode [简单](非递归)二叉树的中序遍历

遍历左孩子&#xff0c;将他们放进栈中&#xff0c;左边走到尽头&#xff0c;出栈&#xff0c;root变为栈顶元素&#xff0c;存值&#xff0c;向右边走一个 再次遍历左孩子&#xff0c;将他们放入栈中&#xff0c;如果没有左孩子了&#xff0c;就出栈&#xff0c;root变为栈顶…

Rocky Linux 9.3 为 PowerPC 64 位带回云和容器镜像

导读RHEL 克隆版 Rocky Linux 9.3 今天发布了&#xff0c;作为红帽企业 Linux 发行版 CentOS Stream 和 Red Hat Enterprise Linux 的免费替代版本&#xff0c;现在可供下载。 Rocky Linux 9.3 是在 Rocky Linux 9.2 发布 6 个月之后发布的&#xff0c;它带回了 PowerPC 64 位…

Mysql锁实战详细分析

1.mysql回表查询 在这里提起主要是用于说明mysql数据和索引的结构&#xff0c;有助于理解后续加锁过程中的一些问题。 mysql索引结构和表数据结构是相互独立的&#xff0c;根据索引查询&#xff0c;只能找到索引列和主键聚簇索引。如果select语句中不包含索引列&#xff0c;m…

SpringBoot自动配置注入Bean工具autoconfigure

依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency> yml配置 student:red: com.ma.config.MinIOConfigProperties spring.factories org.springframework.…

Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf)

个人学习笔记&#xff0c;仅供参考。 需求&#xff1a;提取AUTOSAR SWS中所有的API接口信息&#xff0c;用于生成C代码。 此处以AUTOSAR_SWS_CANDriver.pdf为例&#xff0c;若需要提取多个SWS文件&#xff0c;遍历各个文件即可。 1.Python包 pdfplumber是一款完全用python开…

Mysql解决随机选取问题

常规的随机选取效率差的原因&#xff1a; 两种解决方法&#xff1a; 总结&#xff1a;

VUE语法--img图片不显示/img的src动态赋值图片显示

1、问题概述 常见情景1&#xff1a;在VUE中使用img显示图片的时候&#xff0c;通过传参的方式传入图片的路径和名称&#xff0c;VUE不加载本地资源而是通过http://localhost:8080/...的地址去加载网络资源&#xff0c;从而出现了图片无法显示的情况。 常见情景2&#xff1a;针…

C#使用WebSocket进行链接

C#使用WebSocket进行网络链接&#xff0c;和服务端搭建一个长连接进行通信。 有两种方式&#xff1a;串口方式&#xff08;SerialPort&#xff09;和网口方式&#xff08;Socket 包括&#xff1a;TcpClient和UdpClient&#xff09; 准备&#xff1a; 1.C#使用WebSocket的一种…

【vue_3】关于超链接的问题

1、需求2、修改前的代码3、修改之后&#xff08;1&#xff09;第一次&#xff08;2&#xff09;第二次&#xff08;3&#xff09;第三次&#xff08;4&#xff09;第四次&#xff08;5&#xff09;第五次 1、需求 需求&#xff1a;要给没有超链接的列表添加软超链接 2、修改前…

4.Spring源码解析-loadBeanDefinitions(XmlBeanDefinitionReader)

第一个点进去 发现是空 肯定走的第二个逻辑了 这里在这里已经给属性设置了值&#xff0c;所以肯定不是空能拿到。 1.ClassPathXmlApplicationContext 总结&#xff1a;该loadBeanDefinitions是XmlBeanDefinitionReader设置xml文件在哪。

4D雷达目标检测跟踪算法设计

1.算法流程 4D雷达点云跟踪处理沿用3D毫米波雷达的处理流程&#xff0c;如下图&#xff1a; 从接收到点云开始&#xff0c;先对点云做标定、坐标转换、噪点剔除、动静分离&#xff0c;再分别对动态目标和静态目标做聚类&#xff0c;然后根据聚类结果做目标的特征分析和检测等&a…

Linux - 动静态库(上篇)

Linux 当中的 内存管理模块 不管是操作系统对于进程之间的管理&#xff0c;还是 对于文件的访问和修改等等的操作&#xff0c;都是要把数据加载到内存当中的&#xff0c;所以&#xff0c;所有的工作都离不开 内存管理模块。 内存的本质其实是对数据的一种临时存储&#xff0c…

Linux shell for jar test

Linux shell 脚本&#xff0c;循环解析命令行传入的所有参数&#xff0c;并按照不同的传参实现对不同的 java jar文件 进行测试执行。 [rootlocalhost demo]# cat connTest.sh #!/bin/bash# Linux shell for qftool java jar test# modes DEFAULT_MODE2jarfiles[1]common-1.0…

Redis 两种持久化方式 AOF 和 RDB

目录 一、Redis 的持久化 二、Redis 的持久化方式 RDB RDB 介绍 RDB 的触发方式&#xff1a;. 三、RDB的文件生成策略 四、Save 和 Bgsave 命令的区别 六、RDB 最佳配置 七、触发机制-不容忽略方式 AOF 一、AOF介绍 二、RDB所存在的问题 三、AOF 三种策略 四、AOF…

linux zsh终端美化

目前的centos系统默认的shell还是bash&#xff0c;但是zsh被称为终极shell&#xff0c;国外有个程序员开发出了一个能够让你快速上手的zsh项目&#xff0c;叫做「oh my zsh」&#xff0c;Github 网址是&#xff1a;https://github.com/robbyrussell/oh-my-zsh 有了这玩意zsh用起…