当前位置: 首页 > news >正文

Unity小游戏——使被砍中的怪物四处飞散

被武士砍中后,怪物将向四面八方飞散。

动作的不同将导致攻击力度的强弱表现不同,被攻击的各个对象的反应也有很大差异。在格斗游戏中,对对手一顿拳打脚踢后,看到其步履蹒跚的样子,往往可以感受到他的疼痛。相反如果对手显得从容不迫,即使动作再华丽也只能给人一种给攻击力很弱的印象。

有时候我们常常听到攻击反馈的说法。在玩游戏时大家应该都有过感觉按键和摇杆好像变重了的经历吧?可以说这种游戏通过通过视觉和听觉把攻击反馈完美地呈现了出来。

我们将通过怪物的四处飞散来表现武士的攻击强度。另外,我们也将实现上文提到的靠近斩杀怪物会获得高分的规则,并使“在多金的距离斩杀了怪物”影响怪物的飞散方式。

不过每次都采用同样的飞散方式未免有些单调,因此我们会调整飞散的方向使每次的效果都略有不同。


一、想象一下“圆锥体”

在考虑实现方法之前,我们首先整理一下“需要做什么”,用专业术语来说在这叫需求分析

  • 要让怪物华丽地四处飞散
  • 让每次的动作都各有不同

“华丽”这种描述对于变成来说是一个比较暧昧的说法,应该描述得更加具体一些。

之前已经提到过,把若干个怪物编成一个小组,并通过这个小组来执行被攻击判定。受到攻击时小组内的所有怪物都将四处飞散。而如果怪物们都向着同样的方向飞去,将毫无“华丽”可言。换句话说,所谓的“华丽”,应该是这些怪物尽量朝着不同的方向飞散开来。

这个被刀砍中后各自飞散的过程,更类似于炸弹爆炸的画面。由于怪物被刀砍中时受到了某一方向的作用力,因此往相反的一侧飞出才显得自然。武士具有右斩、左斩的动作,每个动作都将令怪物反方向飞出。

“靠近斩杀时怪物将更华丽地飞散开”这个要素也是必要的。虽然单纯改变速度也能达到类似的效果,但为了让玩家更容易地了解是否完美地看中了怪物,我们将飞散的方向改为前后方向。如果从前面飞来的怪物都按照相同的方向弹开,就能让玩家强烈地感受到攻击的力度。

那么我们再次细化需要完成的工作:

  • 怪物朝不同的方向飞出
  • 根据动作的不同往左或往右飞出
  •  根据斩杀时的距离远近调整为前后
  • 每次飞出的方式都有变化

 要是每次飞出的方式都不一样,很多人会想到使用随机数。不过如果仅对飞出的方向和速度进行随机化处理,虽然可以改变飞出的方向,但不保证怪物会按照我们期待的方向飞出。

像这样“想在随机化的同时进行某种程度的倾向控制”的时候,解决问题的关键就是先确定好关键性的原则,再使用随机数改变细节参数。

这里我们参考水管喷头喷水的情景,决定使怪物沿着圆锥的表面飞出,也就是说,圆锥的朝向基本上决定了飞散的方向,底面的半径则决定了飞散开的范围。

二、具体的计算方法

接下来,我们对各个参数进行详细的说明。

首先看看圆锥的底面半径如何决定了飞散的范围

怪物被砍中后飞出的方向是由武士攻击瞬间的速度向量决定的。所有怪物被击飞后的速度向量都以圆锥的顶点为起始点,终点位于圆锥底面的圆周上,按照一定间隔并列排开。

底面半径越大圆锥的开口范围越广,每个怪物的速度向量的方向也有很大差异,因此怪物飞散范围就比较广。反之如果半径比较小,则飞散开的范围就比较窄。

下面,我们通过圆锥的倾角来控制前后方向

这里的“前后”,指的是从武士的视角看到的前后。武士向画面右方前进,也就是+X方向,这样在画面上看起来就是左右倾斜。需要注意的是在计算时会变为围绕Z轴旋转。

最后,通过圆弧的中心角度来控制左右方向的飞散

怪物飞散的方向,也就是速度向量分布在圆锥的表面上。但它们并没有完全分布在1周360°的各个角落,而是集中在了大约半个圆周的范围内。这里将通过排列着的各个速度向量的圆弧的中心点的角度控制左右方向。程序中使用y_angle_swing变量来表示。

下面我们结合代码来看看实际的计算过程:OniGroupControl.OnAttackedFromPlayer方法

public void OnAttackedFromPlayer(){// 累加被击倒的怪物数量// (后续部分也会进行计算评价,不过这里先执行一次)this.scene_control.AddDefeatNum(this.oni_num);// 怪物向四处飞散//// 在圆锥表面的形状上决定各个怪物飞散开的方向// 评价越高则圆锥的开口越大,这样就能飞散到更广的区域// 玩家的速度如果较快,圆锥会向前倾斜一些Vector3			blowout;				// 怪物飞散的方向(速度向量)Vector3			blowout_up;				// ↑的垂直分量Vector3			blowout_xz;				// ↑的水平分量float			y_angle;float 			blowout_speed;float			blowout_speed_base;float			forward_back_angle;		// 圆锥的前后倾斜角度float			base_radius;			// 圆锥的地面半径float			y_angle_center;float			y_angle_swing;			// 圆弧的中心(根据动作左右决定该值)float			arc_length;				// 圆弧的长度(圆周)switch(this.scene_control.evaluation) {default:case SceneControl.EVALUATION.OKAY:{base_radius = 0.3f;blowout_speed_base = 10.0f;forward_back_angle = 40.0f;y_angle_center = 180.0f;y_angle_swing  = 10.0f;}break;case SceneControl.EVALUATION.GOOD:{base_radius = 0.3f;blowout_speed_base = 10.0f;forward_back_angle = 0.0f;y_angle_center = 0.0f;y_angle_swing = 60.0f;}break;case SceneControl.EVALUATION.GREAT:{base_radius = 0.5f;blowout_speed_base = 15.0f;forward_back_angle = -20.0f;y_angle_center = 0.0f;y_angle_swing = 30.0f;}break;}forward_back_angle += Random.Range(-5.0f, 5.0f);arc_length = (this.onis.Length - 1)*30.0f;arc_length = Mathf.Min(arc_length, 120.0f);// 根据玩家的动作(左斩,右斩),改变左右飞散的方向y_angle = y_angle_center;y_angle += -arc_length/2.0f;if(this.player.attack_motion == PlayerControl.ATTACK_MOTION.RIGHT) {y_angle += y_angle_swing;} else {y_angle -= y_angle_swing;}y_angle += ((OniGroupControl.count*7)%11)*3.0f;// 让组内的怪物全部被击倒foreach(OniControl oni in this.onis) {//blowout_up = Vector3.up;blowout_xz = Vector3.right*base_radius;blowout_xz = Quaternion.AngleAxis(y_angle, Vector3.up)*blowout_xz;blowout = blowout_up + blowout_xz;blowout.Normalize();// 圆周向前后倾斜blowout = Quaternion.AngleAxis(forward_back_angle, Vector3.forward)*blowout;// 飞散开的速度blowout_speed = blowout_speed_base*Random.Range(0.8f, 1.2f);blowout *= blowout_speed;if(!SceneControl.IS_ONI_BLOWOUT_CAMERA_LOCAL) {// 全局坐标系下飞散开(不和摄像机发生连动)时,// 要加上玩家的速度blowout += this.player.GetComponent<Rigidbody>().velocity;}// 旋转Vector3	angular_velocity = Vector3.Cross(Vector3.up, blowout);angular_velocity.Normalize();angular_velocity *= 3.14f*8.0f*blowout_speed/15.0f*Random.Range(0.5f, 1.5f);//angular_velocity = Quaternion.AngleAxis(Random.Range(-30.0f, 30.0f), Vector3.up)*angular_velocity;//oni.AttackedFromPlayer(blowout, angular_velocity);//Debug.DrawRay(this.transform.position, blowout*2.0f, Color.white, 1000.0f);//y_angle += arc_length/(this.onis.Length - 1);}// 播放被击倒的音效// 太多的音效同时播放不容易听清,只播放一个//if(this.onis.Length > 0){AudioClip[]	yarareSE = null;if( this.onis.Length >= 1 && this.onis.Length < 3 ){yarareSE = this.YarareLevel1;}else if( this.onis.Length >= 3 && this.onis.Length < 8 ){yarareSE = this.YarareLevel2;}else if( this.onis.Length >= 8 ){yarareSE = this.YarareLevel3;}if( yarareSE != null ){int index = Random.Range( 0, yarareSE.Length );this.onis[0].GetComponent<AudioSource>().clip = yarareSE[index];this.onis[0].GetComponent<AudioSource>().Play();}}OniGroupControl.count++;// 删除实例//// 执行Destroy(this) 后, 删除的不是OniGroupPrefab 实例,而是脚本(OniGroupControl)// 请注意//Destroy(this.gameObject);}

相关文章:

Unity小游戏——使被砍中的怪物四处飞散

被武士砍中后&#xff0c;怪物将向四面八方飞散。 动作的不同将导致攻击力度的强弱表现不同&#xff0c;被攻击的各个对象的反应也有很大差异。在格斗游戏中&#xff0c;对对手一顿拳打脚踢后&#xff0c;看到其步履蹒跚的样子&#xff0c;往往可以感受到他的疼痛。相反如果对…...

hive之文件格式与压缩

hive文件格式&#xff1a; 概述&#xff1a; 为Hive表中的数据选择一个合适的文件格式&#xff0c;对提高查询性能的提高是十分有益的。Hive表数据的存储格式&#xff0c;可以选择text file、orc、parquet、sequence file等。 文本文件&#xff1a; 文本文件就是txt文件&…...

云原生容器内的一次pg_repack排错和解决过程

postgresql的pg_repack 这个cronjob一直执行不了。 排错过程: 用命令 kubectl describe job pg-repack-scheduler-manual-wv82r -n xxx没有查看用有用信息想办法进它启动的pod查看&#xff0c;于是在执行pg_repack.sh命令前&#xff0c;先加一个睡眠时间&#xff0c;如下: - …...

Centos Certbot 使用

安装 可选配置&#xff1a;启动EPEL存储库 非必要项 yum install -y epel-release yum clean all yum makecache #启用可选通道 可以不配置 yum -y install yum-utils yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional必要配置…...

VL163的基本信息

VL163是2:4差分通道多路复用/demux开关USB 3.1应用&#xff0c;为交换机信号性能支持高达USB 3.1&#xff0c;并使用QFN-28 3.5x4.5mm绿色封装。 VL163 QFN28 只能处理2Lane数据信号。自己没有CC识别沟通协议&#xff0c;如果要做USB-C Swtich&#xff0c;就要通过别的USB-C协…...

IntelliJ IDEA 2023.2 新版本,拥抱 AI

IntelliJ IDEA 近期连续发布多个EAP版本&#xff0c;官方在对用户体验不断优化的同时&#xff0c;也新增了一些不错的功能&#xff0c;尤其是人工智能助手补充&#xff0c;AI Assistant&#xff0c;相信在后续IDEA使用中&#xff0c;会对开发者工作效率带来不错的提升。 以下是…...

softmax回归

模型 softmax回归是多类分类模型&#xff0c;用于获取每个分类的置信度&#xff0c;置信度计算方式如下 经过全连接层&#xff0c;得到输出O&#xff0c;将O作为softmax的输入 O是输出向量&#xff0c;每个分量表示一个类别&#xff0c;y_hat_i表示i类别的置信度&#xff0…...

.NET 8 Preview 5推出!

作者&#xff1a;Jiachen Jiang 排版&#xff1a;Alan Wang 我们很高兴与您分享 .NET 8 Preview 5 中的所有新功能和改进&#xff01;此版本是 Preview 4 版本的后续版本。在每月发布的版本中&#xff0c;您将看到更多新功能。.NET 6 和 7 用户可以密切关注此版本&#xff0c;而…...

Spring核心概念、IoC和DI的认识、Spring中bean的配置及实例化、bean的生命周期

初始Spring 一、Spring核心概念1.1IoC(Inversion of Contral)&#xff1a;控制反转1.2IoC代码实现1.2DI代码实现 二、bean的相关操作2.1bean的配置2.1.1bean的基础配置2.1.2bean的别名配置2.1.3bean的作用范围配置 2.2bean的实例化 - - 构造方法2.3bean的实例化 - - 实例工厂与…...

git冲突“accept theirs”和“accept yours”

Accept Yours 就是直接选取本地的代码&#xff0c;覆盖掉远程仓库的 Accept Theirs 是直接选取远程仓库的&#xff0c;覆盖掉自己本地的 我们选择Merge,自己手动行进选择、修改。 这里左边部分是你本地仓库的代码&#xff0c;右边部分是远程仓库的代码&#xff0c;中间的res…...

Vision Transformer (ViT)

生成式模型与判别式模型 生成式模型,又称概率模型,是指通过学习数据的分布来建立模型P(y|x),然后利用该模型来生成新的数据。生成式模型的典型代表是朴素贝叶斯模型,该模型通过学习数据的分布来建立概率模型,然后利用该模型来生成新的数据。判别式模型,又称非概率模型,…...

OpenGL Metal Shader 编程:解决图片拉伸变形问题

前面发了一些关于 Shader 编程的文章&#xff0c;有读者反馈太碎片化了&#xff0c;希望这里能整理出来一个系列&#xff0c;方便系统的学习一下 Shader 编程。 由于主流的 Shader 编程网站&#xff0c;如 ShaderToy, gl-transitions 都是基于 GLSL 开发 Shader &#xff0c;加…...

[SQL挖掘机] - 字符串函数 - concat

介绍: concat函数用于连接字符串的函数。它接受多个字符串作为参数&#xff0c;并将它们按顺序连接起来形成一个新的字符串。 用法: 以下是concat函数的语法&#xff1a; concat(string1, string2, ...)其中&#xff0c;string1, string2, …是要连接的字符串参数。你可以传…...

Rust之所有权

1、所有权的概念&#xff1a; 程序需要管理自己在运行时使用的计算机内部空间。Rust语言采用包含特定规则的所有权系统来管理内存&#xff0c;这套规则允许编译器在编译的过程中执行检查工作&#xff0c;而不会产生任何的运行时开销。 (1)、所有权规则&#xff1a; Rust中的…...

RabbitMQ帮助类的封装

RabbitMQ帮助类的封装 基本部分 public class RabbitMQInvoker {#region Identy private static IConnection _CurrentConnection null;private readonly string _HostName null;private readonly string _UserName null;private readonly string _Password null;#endreg…...

mac 移动硬盘未正常退出,再次链接无法读取(显示)

&#xff08;1&#xff09;首先插入自己的硬盘&#xff0c;然后找到mac的磁盘工具 &#xff08;2&#xff09;打开磁盘工具&#xff0c;发现自己的磁盘分区在卸载状态&#xff1b;点击无法成功装载。 &#xff08;3&#xff09;打开终端&#xff0c;输入 diskutil list查看自…...

短视频账号矩阵系统源码开发部署路径

一、短视频批量剪辑的开发逻辑算法 1.视频剪辑之开发算法 自己研发视频剪辑是指通过对视频素材进行剪切、调整、合并等操作&#xff0c;利用后台计算机算法&#xff0c;进行抽帧抽组抽序进行排列以达到对视频内容进行修改和优化的目的。自己研发的视频剪辑工具可以通过后台码…...

前端 | ( 十一)CSS3简介及基本语法(上) | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 系列笔记&#xff1a; 【HTML4】&#xff08;一&#xff09;前端简介【HTML4】&#xff08;二&#xff09;各种各样的常用标签【HTML4】&#xff08;三&#xff09;表单及HTML4收尾…...

Kafka入门到起飞系列 - 副本机制,什么是副本因子呢?

我们一直在讲一个主题会有多个分区&#xff0c;这多个分区可以分布在一台服务器上&#xff0c;也可以分布在多台服务器上&#xff0c;还可以增加分区&#xff08;Kafka目前只支持分区&#xff09;&#xff0c;这是Kafka提供的一种横向扩展的手段 比如我们创建了一个主题&#x…...

2023年基准Kubernetes报告:6个K8s可靠性失误

云计算日益成为组织构建应用程序和服务的首选目的地。尽管一年来经济不确定性的头条新闻主要集中在通货膨胀增长和银行动荡方面&#xff0c;但大多数组织预计今年的云使用和支出将与计划的相同&#xff08;45%&#xff09;&#xff0c;或高于计划的&#xff08;45%&#xff09;…...

程序员面试系列,k8s常见面试题

原文链接 一、什么是 Kubernetes&#xff1f;解释其主要功能和用途。 Kubernetes&#xff08;通常简称为K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌开发&#xff0c;并于2014年捐赠给了云原生计算基金会&a…...

docker版jxTMS使用指南:站点的调整

本文讲解4.4版jxTMS中的站点的调整&#xff0c;整个系列的文章请查看&#xff1a;[docker版jxTMS使用指南&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请…...

element ui input 深层循环v-model绑定默认数据删除不了的情况

例子&#xff1a; 在项目开发中遇到的&#xff0c;简单记录一下 <el-input style"width: 180px"v-model"item.dataForm"input"handleChangeDataForm($event)"type"number"placeholder"请输入1-2的数值"size"smal…...

GBDT的参数空间与超参数优化

目录 1. 默认参数下的GBDT与其它算法的对比 2. 基于TPE对GBDT进行优化 step1&#xff1a;建立benchmark step2&#xff1a;定义参数init需要的算法 step3&#xff1a;定义目标函数、参数空间、优化函数、验证函数 step4&#xff1a;训练贝叶斯优化器 step5&#xff1a;修…...

多线程练习——抽奖箱

题目&#xff1a; 分析以下需求&#xff0c;并用代码实现&#xff1a; 有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,900,2,80,300,700};创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”&#xff0c;“抽奖箱2”&#xff0c;随…...

RK3399平台开发系列讲解(内核调试篇)Valgrind 内存调试与性能分析

🚀返回专栏总目录 文章目录 一、为什么要学会Valgrind二、什么是内存泄露三、Valgrind的移植四、Valgrind相关参数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使…...

Windows 11的最新人工智能应用Windows Copilot面世!

Windows Copilot是Windows 11预览版中的一项AI辅助功能。 Windows 11还包括设置应用程序的更改&#xff0c;更广泛的支持压缩文件格式。 上个月&#xff0c;微软宣布将继续其将ChatGPT应用于所有产品的冒险之旅&#xff0c;推出了名为Copilot的新Windows 11功能。几个月前&…...

Mac 预览(Preview)丢失PDF标注恢复

感谢https://blog.csdn.net/yaoyao_chen/article/details/127462497的推荐&#xff01; 辛苦用预览在pdf上做的阅读标记&#xff0c;关闭后打开全丢失了&#xff0c;推荐尝试下网站导入文件进行恢复&#xff1a; 直接使用该网页应用PDF Annotation Recovery 或者访问该项目&a…...

4.5. 方法的四种类型

文章目录 1、无参数无返回值的方法2、有参数无返回值的方法3、有返回值无参数的方法4、有返回值有参数的方法5、return 在无返回值方法的特殊使用 1、无参数无返回值的方法 // 无参数无返回值的方法(如果方法没有返回值&#xff0c;不能不写&#xff0c;必须写void&#xff0c…...

四旋翼无人机使用教程

文章目录 前言一、检查遥控器电源开关混控拨码开关微调开关飞行模式刹车开关行程开关接收机对码 二、检查飞机检查接线 三、解锁并飞行 前言 PX4固件 QGC地面站 Pixhwak飞控 Mc6c遥控器 开源飞控博大精深&#xff0c;欢迎广大爱好者加博主微信名片&#xff0c;一起学习交流。…...