【unity learn】【Ruby 2D】角色发射飞弹

news2025/6/18 21:55:24

前面制作了敌人的随机运动以及动画控制,接下来就是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 update
    void Awake()
    {
        rigidbody2d = GetComponent<Rigidbody2D>();//获取飞弹刚体组件
    }

    // Update is called once per frame
    void 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 update
    void Start()
    {
        Rd = GetComponent<Rigidbody2D>();
        timer = changeTime;
        animator = this.GetComponent<Animator>();//动画控制
    }

    // Update is called once per frame
    private 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;

这样,我们就能够发射飞弹了。

成果演示如下

 

 

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

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

相关文章

同步I/O实现Reactor和Proactor的差异

有两种高效的事件处理模式&#xff1a;Reactor模式和Proactor模式 Reactor模式 主线程只负责监听socket上是否有事件发生&#xff0c;当有事件发生时&#xff0c;主线程就将该事件放进请求队列&#xff0c;通知工作线程进程处理&#xff1b;主线程不做实质性的工作&#xff0c…

使用颜色检测有向图中的循环

给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,您的函数应返回 true,否则返回 false。 例子: 输入: n = 4, e = 6 0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, 2 -> 3, 3 -> 3 输出:是 解释: <

计网之HTTP协议和Fiddler的使用

文章目录一. HTTP概述和fidder的使用1. 什么是HTTP2. 抓包工具fidder的使用2.1 注意事项2.2 fidder的使用二. HTTP协议格式1. HTTP请求格式1.1 基本格式1.2 认识URL1.3 方法2. 请求报头关键字段3. HTTP响应格式3.1 基本格式3.2 状态码一. HTTP概述和fidder的使用 1. 什么是HTT…

VueRouter路由模式解析

VueRouter路由模式解析 前端路由的实现方式主要有两种&#xff1a;hash模式和history模式。 hash模式 在window.location对象中有一个hash字段&#xff0c;可以获取地址栏中#字符及后边的所有字符。 hash也称作锚点&#xff0c;本身是用来做页面定位的&#xff0c;可以使对…

BGP联邦实验

实验目的&#xff1a; 实验拓扑&#xff1a; IP地址规划&#xff1a; AS2内部&#xff1a; 172.16.0.0/16 172.16.0.0/24---P2P网络 172.16.1.0/24----MA网络 172.16.1.0/29 172.16.1.8/29 172.16.1.16/29 172.16.1.24/29 172.16.1.32/29 172.16.1.40/29 172.16.2.0/24--…

Golang每日一练(leetDay0032) 二叉树专题(1)

目录 94. 二叉树的中序遍历 Binary Tree Inorder Traversal &#x1f31f; 95. 不同的二叉搜索树 II Unique Binary Search Trees II &#x1f31f;&#x1f31f; 96. 不同的二叉搜索树 Unique Binary Search Trees &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷…

基于 FPGA+DSP 的冲击波超压测试系统设计与实现-系统测试(二)

5 系统功能测试及仿真 在完成系统硬件电路板的设计和软件程序的开发后&#xff0c;本章分别对 A/D 采集模块、 DDR3 SDRAM 存储模块的读写波形进行了测试&#xff0c;并对千兆网卡传输模块通过 Wireshark 软件进行抓包测速&#xff0c;调试成功并确认无误后将各模块组装起来对系…

Unity之ASE实现根据ScreenPosition改变渲染效果

前言 我们知道ScreenPosition节点,代表了屏幕空间的坐标,那么它有哪些用处呢?今天我们就来给大家演示一个效果,如下图所示:我们拉远拉进摄像机的位置,任务的渲染会根据不同距离有一定变化。 ScreenPosition介绍 Screen Position 节点输出当前像素的屏幕位置。根据所选…

7nm+跨域计算+极致性价比,这家芯片厂商助攻车企「降本增效」

汽车芯片赛道的「卷」&#xff0c;或许超出了所有人的预期。对于单纯TOPS算力的比拼&#xff0c;已经翻篇&#xff0c;如何让车企有的用&#xff0c;用得上&#xff0c;还要用得好&#xff0c;已经是新风向。 实际上&#xff0c;在汽车智能化刚刚开始的2018年&#xff0c;彼时类…

2.4 随机变量函数的分布

学习目标&#xff1a; 学习随机变量函数的分布&#xff0c;我会采取以下步骤&#xff1a; 熟悉随机变量的基本概念和分布&#xff1a;在学习随机变量函数的分布之前&#xff0c;需要先掌握随机变量的基本概念和分布&#xff0c;包括离散型随机变量和连续性随机变量的概率密度…

《Java8实战》第4章 引入流

集合是 Java 中使用最多的 API。 4.1 流是什么 流是 Java API 的新成员&#xff0c;它允许你以声明性方式处理数据集合&#xff08;通过查询语句来表达&#xff0c;而不是临时编写一个实现&#xff09;。可以看作是遍历数据集的高级迭代器&#xff0c;而且还可以并行的处理。…

语音识别实战(python代码)(一)

语音识别实战 &#xff08;python &#xff1a;pyttsx、SAPI、SpeechLib实例代码&#xff09;(一&#xff09; 本文目录&#xff1a; 一、语音识别的基本原理 &#xff08;1&#xff09;、语音识别的起源与发展 &#xff08;2&#xff09;、语音识别的基本原理 &#xff0…

吸烟行为检测系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;吸烟行为检测软件用于日常场景下吸烟行为监测&#xff0c;快速准确识别和定位吸烟位置、记录并显示检测结果&#xff0c;辅助公共场所吸烟安全报警等。本文详细介绍吸烟行为检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码、训练数…

BGA封装与PCB差分互连结构的设计与优化

摘要&#xff1a;随着电子系统通信速率的不断提升&#xff0c;BGA封装与PCB互连区域的信号完整性问题越来越突出。 针对高速BGA封装与PCB差分互连结构进行设计与优化&#xff0c;着重分析封装与PCB互连区域差分布线方式&#xff0c;信号布局方式&#xff0c;信号孔/地孔比&…

Unity编写Shader内置各种矩阵和方法介绍

返回目录 大家好&#xff0c;我是阿赵。 这里记录一下Unity编写Shader内置各种矩阵和方法 一、Unity内置转换矩阵 1、MVP类矩阵 UNITY_MATRIX_MVP:Current model * view * projection matrix. UNITY_MATRIX_MV:Current model * view matrix. UNITY_MATRIX_V:Current view m…

静态库与动态库

库是已经写好的、成熟的、可复用的代码。在我们的开发的应用中经常有一些公共代码是需要反复使用的&#xff0c;就把这些代码编译为库文件。库可以简单看成一组目标文件的集合&#xff0c;将这些目标文件经过压缩打包之后形成的一个可执行代码的二进制文件。库有两种&#xff1…

uniapp页面后退时更改页面内容【uniapp如何区分页面是跳转来的还是后退来的】【伸手党福利】

目录应用场景实现目标分析技术难点解决方法另附&#xff1a;自动登录判断跳转页面ps2 这个案例的实际简单的解决方法应用场景 建立一个自动登录的中间页&#xff0c;如果自动登录&#xff0c;则自动跳转到内部应用。如果自动登录失败&#xff0c;则显示用户名密码输入页。 发现…

文心一言对于宣传文案理解

前言 前段时间对于文心一言开放部分内测邀请&#xff0c;有幸获得邀请内测权限&#xff01;抱着试一试的态度对其进行了使用&#xff0c;结果还是比较满意的。我们来看一下我所说的满意是否能够达到你的要求&#xff01;&#xff01;&#xff01; 使用逻辑 文心一言的使用还…

静态路由的原理和配置(理论详细实验全面)

第五章&#xff1a;静态路由 目录 第五章&#xff1a;静态路由 5.1路由器的工作原理 5.1.1路由器根据路由表转发数据 5.1.2 路由信息获取的方式 5.2路由选路原则 5.2.1最长匹配原则 5.2.2路由优先级 5.2.3路由度量值 5.3静态路由 5.3.1静态路由实验 5.3.2缺省路由实…

多模态模型技术综述

多模态架构导语1. Image2Text1.1 图像数据集准备1.2 图像to文本的生成模型1.2.1 M2 模型&#xff08;Meshed—Memory Transformer&#xff09;Memory-Augmented EncoderMeshed Decoder2. text2Image2.1 生成对抗网络&#xff08;GAN&#xff09;2.1.1 文本生成图像基础GAN2.1.2…