【unity learn】【Ruby 2D】角色发射飞弹
前面制作了敌人的随机运动以及动画控制,接下来就是Ruby和Robot之间的对决了!
世界观背景下,小镇上的机器人出了故障,致使全镇陷入了危机,而Ruby肩负着拯救小镇的职责,于是她踏上了修复机器人的旅途。
之前其实一直挺好奇的,fps是怎么样发射子弹的呢?
现在我终于明白了,方法就是
先设置我们的飞弹零件预制体
首先创建一个预制体

将图片拖到Hierarchy窗口再拖到prefabs文件夹就可以做到了,然后我们进行一些基本的设置

添加碰撞体和刚体组件,使其能够与机器人发生碰撞
然后我们应该设置脚本了
脚本的内容有三点
1、Awake生命周期内需要获取这个刚体组件(不用start是因为在你创建对象时 Unity 不会运行 Start,而是在下一帧才开始运行。因此,在飞弹上调用 Launch 时,只实例化 (Instantiate),不调用 Start,因此 Rigidbody2d 仍然为空。
2、Launch发射方法:使用了AddForce方法,为其施加一个方向与力的乘积(不得不说做游戏物理很重要)
3、发生撞击删除自己还有飞行一定距离后删除自己
下面是飞弹的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Myprojectile : MonoBehaviour
{Rigidbody2D rigidbody2d;// Start is called before the first frame updatevoid Awake(){rigidbody2d = GetComponent<Rigidbody2D>();//获取飞弹刚体组件}// Update is called once per framevoid Update(){if (transform.position.magnitude > 1000.0f)//向量长度大于1000销毁该飞弹{Destroy(gameObject);}}public void Launch(Vector2 direction,float force){rigidbody2d.AddForce(direction * force);//施加一个力}void OnCollisionEnter2D(Collision2D other)//这一段是击中了机器人后的代码,fix在Robot控制里面,下文会提到{MyEnemyController e = other.collider.GetComponent<MyEnemyController>();获取机器人对象if(e != null)//没撞到机器人{e.Fix();调用撞击}Destroy(gameObject);//发生撞击后删除自己}}
接下来是机器人被击中后的代码
不太多
主要是建立一个bool 变量broken
然后在每个生命周期内都添加判断条件
if (!broken){return;}
然后就是fix函数
public void Fix(){broken = false;//被击中Rd.simulated = false;//将rigidbody2d的这个属性关闭以后,刚体会从物理系统中移除animator.SetTrigger("Fixed");//这个是被打中后跳舞的动作smokeEffect.Stop();//这个是关闭粒子特效,我们下文再讲解}
完整代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyEnemyController : MonoBehaviour
{public float Speed = 0.1f;public bool vertical;public float changeTime = 3.0f;Rigidbody2D Rd;float timer;int direction = 1;private float _timer = 0f;private Animator animator;public bool broken = true;public ParticleSystem smokeEffect;// Start is called before the first frame updatevoid Start(){Rd = GetComponent<Rigidbody2D>();timer = changeTime;animator = this.GetComponent<Animator>();//动画控制}// Update is called once per frameprivate void Update(){if (!broken)//被击中{return;}timer -= Time.deltaTime;if(timer < 0){direction = -direction;timer = changeTime;}}void FixedUpdate()//这一段主要是运动,看不懂可以翻我之前的博客{if (!broken)//判断,如果是被击中后的状态,就直接跳出{return;}float dt = Time.fixedDeltaTime;_timer -= dt;if (_timer < 0){_timer = Random.Range(0.3f, 2.0f);vertical = !vertical;}Vector2 position = Rd.position;if (vertical){position.y = position.y + Time.deltaTime * Speed * direction;animator.SetFloat("MoveX", 0);animator.SetFloat("MoveY", direction);}else{position.x = position.x + Time.deltaTime * Speed * direction;animator.SetFloat("MoveX",direction );animator.SetFloat("MoveY",0 );}Rd.MovePosition(position);//MovePosition:导入一个vector向量来修改当前position位置}void OnCollisionEnter2D(Collision2D other){MyRubyController player = other.gameObject.GetComponent<MyRubyController>();if (player != null){player.ChangeHealth(-1);}}public void Fix()//被击中{broken = false;Rd.simulated = false;animator.SetTrigger("Fixed");smokeEffect.Stop();}
}
险些离题,最后我们来写Ruby发射飞弹的代码
这里我们会使用Instantiate方法
参数的话,或许我们看代码会更加易懂
void Launch(){GameObject projectileObject = Instantiate(projectilePrefab/*我们要创建的预制体*/, rb2d.position//创建初始位置 + Vector2.up *0.5f//离初始位置有多远, Quaternion.identity//这里表示不旋转);Myprojectile projectile = projectileObject.GetComponent<Myprojectile>();//获取飞弹projectile.Launch(lookDirection, 300);//为飞弹添加力animator.SetTrigger("Launch");//播放Ruby攻击动画}
我们Instantiate方法这里是不是会报错呢,报错就对了,因为我们还没有获取飞弹组件
这里给出的方法是创建GameObject公共变量,然后让飞弹挂载在Ruby身上
操作如下
public GameObject projectilePrefab;


这样,我们就能够发射飞弹了。
成果演示如下

相关文章:
【unity learn】【Ruby 2D】角色发射飞弹
前面制作了敌人的随机运动以及动画控制,接下来就是Ruby和Robot之间的对决了! 世界观背景下,小镇上的机器人出了故障,致使全镇陷入了危机,而Ruby肩负着拯救小镇的职责,于是她踏上了修复机器人的旅途。 之前…...
C++模板基础(九)
完美转发与 lambda 表达式模板 void f(int& input) {std::cout << "void f(int& input)\t" << input << \n; }void f(int&& input) {std::cout << "void f(int&& input)\t" << input << \n;…...
【剑指 Offer】(1)
文章目录前言一、 数组中重复的数字:fire: 解决方法:dog: 代码二、二维数组中的查找:fire:思路:dog:代码三、替换空格:fire:思路:dog: 代码四、从尾到头打印链表:fire:思路:dog:代码:dog: 代码五、重建二叉树:fire:思路:dog: 代码总结前言 剑指offer系列是一本非常著名的面试题…...
每日一题 leetcode1026 2023-4-18
1026. 节点与其祖先之间的最大差值 力扣题目链接 给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V |A.val - B.val|,且 A 是 B 的祖先。 (如果 A 的任何子节点之一为 B,或者 A 的任何…...
【Python_Scrapy学习笔记(十二)】基于Scrapy框架实现POST请求爬虫
基于Scrapy框架实现POST请求爬虫 前言 本文中介绍 如何基于 Scrapy 框架实现 POST 请求爬虫,并以抓取指定城市的 KFC 门店信息为例进行展示 正文 1、Scrapy框架处理POST请求方法 Scrapy框架 提供了 FormRequest() 方法来发送 POST 请求; FormReques…...
《花雕学AI》02:人工智能挺麻利,十分钟就为我写了一篇长长的故事
ChatGPT最近火爆全网,上线短短两个多月,活跃用户就过亿了,刷新了历史最火应用记录,网上几乎每天也都是ChatGPT各种消息。国内用户由于无法直接访问ChatGPT,所以大部分用户都无缘体验。不过呢,前段时间微软正…...
做程序员累了想要转行?我想给大家分享一下看法
今天早上起床时,我看到有粉丝评论说关于程序员的话题,如果做着觉得累了,就会觉得自己不适合这个工作,想转行。我想给大家分享一下我的看法。 在我刚开始工作时,有人说我不适合做这个工作,但是我坚持了下来…...
如果你想从事人工智能职业,学习Python吧
人工智能并不会抢走你的工作,至少目前还不会。人工智能和机器学习(AI/ML)最好的应用是补充人类的创造力,而不是取代它。具有讽刺意味的是,最好的大型语言模型(LLMs)可能是通过使用受版权保护的人…...
百模大战,谁是下一个ChatGPT?
“不敢下手,现在中国还没跑出来一家绝对有优势的大模型,上层应用没法投,担心押错宝。”投资人Jucy(化名)向光锥智能表示,AI项目看得多、投的少是这段时间的VC常态。 ChatGPT点燃AI大爆炸2个月中࿰…...
Revit中怎么绘制多面坡度的屋顶及生成墙
一、Revit中怎么绘制多面坡度的屋顶 像这种坡屋顶我们可以观察到,它的屋顶轮廓都是带有坡度的,那我可以通过添加定义坡度的方式来绘制出该屋顶。 点击建筑选项卡中的屋顶按钮,选择迹线屋顶。 选择使用拾取线工具,在选项栏中将偏…...
【jvm系列-07】深入理解执行引擎,解释器、JIT即时编译器
JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…...
【GCU体验】基于PaddlePaddle + GCU跑通模型并测试GCU性能
一、环境 地址:启智社区:https://openi.pcl.ac.cn/ 二、计算卡介绍 云燧T20是基于邃思2.0芯片打造的面向数据中心的第二代人工智能训练加速卡,具有模型覆盖面广、性能强、软件生态开放等特点,可支持多种人工智能训练场景。同时具备灵活的可…...
解析hash(散列)数据结构
前言 在学习完map、set这两个由红黑树构成的容器后,我们来到了这里hash,首先我们要有一个基础的认知——哈希和map与set的仅在使用时的差别区别:前者内部的元素没有序,而后者有序,其它的都相同,这里我们可…...
《2023金融科技·校园招聘白皮书》新鲜出炉|牛客独家
数智创新时代,科技人才为先。 眼下,在建设“数字中国”的时代背景下,金融行业全面数智化转型已箭在弦上。政策端,金融行业为中共中央、国务院印发《数字中国建设整体布局规划》的7大重点行业之一。 资本端,仅2022年三…...
文明的标志:书写系统、修建城市、使用金属器
文章目录 引言I 预备知识1.1 文明”和“文化”概念1.2 文明的标志1.3 应对水患II 定居开启了人类文明2.1 书写系统2.2 陶器2.3 家畜引言 一切和开启文明相关的技术都是围绕着两根主线展开: 多获取能量,以便于生存,信息能够管理起酋邦,总结、记录并传授经验。I 预备知识 1.…...
算法:将一个数组旋转k步
题目 输入一个数组如 [1,2,3,4,5,6,7],输出旋转 k 步后的数组。 旋转 1 步:就是把尾部的 7 放在数组头部前面,也就是 [7,1,2,3,4,5,6]旋转 2 步:就是把尾部的 6 放在数组头部前面,也就是 [6,7,1,2,3,4,5]… 思路 思…...
使用大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据
记录一下使用Java的SpringBoot大华SDK在智慧公厕项目中使大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据 首先根据说明书登录摄像头,一般摄像头都有自己的账号和密码(可能是admin admin 也可能是admin 888888 还有可能是admin 12345),…...
DC插装式流量阀压力阀
Cartridge Valves 电磁阀 止回阀 运动控制阀 流量控制阀 溢流阀 压力控制阀 顺序阀 梭阀 方向阀 配件 Zero Profile Valves 止回阀 运动控制阀 流量控制阀 溢流阀 梭阀 In-Line Valves 止回阀和梭阀 方向阀 配件 微型系列 AB20S APIDC-30S C10B C10S C10S…...
NumPy 数组学习手册:6~7
原文:Learning NumPy Array 协议:CC BY-NC-SA 4.0 译者:飞龙 六、性能分析,调试和测试 分析,调试和测试是开发过程的组成部分。 您可能熟悉单元测试的概念。 单元测试是程序员编写的用于测试其代码的自动测试。 例如&…...
【笔试强训选择题】Day6.习题(错题)解析
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、Day6习题(错题)解析 二、Day6习题(原题)练习 总结 前言 一、Day6习题(错题)解析…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
