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

这篇具有很好参考价值的文章主要介绍了Unity小游戏——使被砍中的怪物四处飞散。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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


一、想象一下“圆锥体”

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

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

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

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

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

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

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

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

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

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

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

二、具体的计算方法

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

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

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

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

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

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

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

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

下面我们结合代码来看看实际的计算过程:OniGroupControl.OnAttackedFromPlayer方法文章来源地址https://www.toymoban.com/news/detail-611850.html

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小游戏——使被砍中的怪物四处飞散的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity——2D小游戏笔记整理

    【每日一句:清晨和夜晚都请用尽全力去生活】 目录 一、环境搭建 二、人物 三、相机跟随人物移动 四、平铺精灵 五、血条跟随敌人行走 六、脚本逻辑 【玩家行走方法】 【玩家跳跃方法】 【改变玩家血量值方法】 【创建玩家子弹方法】 【主角血量,改变血条遮罩】 【敌

    2024年02月09日
    浏览(40)
  • 【Unity】小球吃方砖小游戏

    目录 游戏背景 游戏开发         2.1场景布置         2.2小球运动         2.3镜头跟踪         2.4吃掉方砖         2.5结束提示 游戏录制           用wasd(↑←↓→)操控小球进行平面滑动,小球触碰会原地打转的立方体后立方体会消失,消除5个小球后提示

    2024年02月09日
    浏览(30)
  • unity小球吃金币小游戏

    链接放在这里 unity小球吃金币小游戏-Unity3D文档类资源-CSDN下载 这是我在学完虚拟现实技术这门课程后利用unity所做的小球吃金币小游戏,里面有源码和作品源文件,用u更多下载资源、学习资料请访问CSDN下载频道. https://download.csdn.net/download/m0_57324918/85604051 1创建Roll A Ball小球吃

    2023年04月08日
    浏览(33)
  • Unity 开发微信小游戏

    今天给大家分享一下我近期用Unity开发微信小游戏的经过和踩坑; 微信小游戏就是微信小程序,小游戏是小程序的一个子集,小游戏是一种特殊的小程序;这篇文章建议大家收藏,干货满满 Unity开发微信小程序 Unity 3D下载官网 Unity转化小程序的Package包下载地址 微信开发者工

    2024年02月09日
    浏览(32)
  • unity开发微信小游戏1

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最开使用unity3d开发微信小游戏,遇到了一些问题,记录一下, 同时创建了一个交流群 QQ 641029627,现在应该没人,有需要的可以加入一起讨论,广告哥远离 提示:以下是本篇文章正文内容,下面案例可

    2023年04月08日
    浏览(34)
  • 现有Unity转微信小游戏

    关于微信小游戏开发的内容在《Unity WebGL 微信小游戏适配方案》中有详细,这里会忽略大部分更深入的细节,大家可以自行在下面的地址中找到答案。 此篇文章的目的是带着大家快速的把自己已有的游戏转成微信小游戏。 《Unity WebGL 微信小游戏适配方案》地址: https://gith

    2023年04月08日
    浏览(61)
  • Unity 开发微信小游戏初探

    最近因项目需要开始研究Unity开发微信小游戏相关的知识。期间遇到各种坑,网上查阅的资料基本类似,无法解决自己遇到的问题。特用本文记录下过程,方便其他人遇到同样的问题时能够参考。 Unity 版本 根据微信小游戏插件文档推荐使用2021.2.5版 。实测2021.3.x 以上版本均可

    2024年02月05日
    浏览(32)
  • unity转抖音小游戏笔记

    一.unity版本选择2019.4.8f1 二.需从BGDT内安装以下插件 StarkMini for Unity :基础小包改造 sdk,提供游戏改造小包的框架 Stark Asset Analyser :基于 starkmini 的自动化小包工具     https://microapp.bytedance.com/docs/zh-CN/mini-game/rd-to-SCgame/minify/overall 三.打开资源配置编辑器 ByteGame-StarkMini-Open

    2023年04月08日
    浏览(32)
  • unity开发微信小游戏步骤

    将Unity项目接入到微信小程序中需要通过微信开发者工具进行操作 1. 准备工作 在开始接入前,需要保证您的开发环境已经搭建完成。具体包括以下步骤: - 安装Unity编辑器,并确保您的项目能够正常运行。 - 下载微信小程序开发者工具,并登录微信开发者账号。 - 创建一个微

    2023年04月22日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包