Unity 实现鼠标左键进行射击

发射脚本实现思路

  1. 分析
    • 确定用户交互方式:通过鼠标左键点击发射子弹。
    • 确定子弹发射逻辑:每次点击后有一定时间间隔才能再次发射。
    • 确定子弹发射源和方向:子弹从枪口(Transform)位置发射,沿枪口方向前进。
  2. 变量设定
    • 设定子弹预制体引用:用于在游戏中实例化子弹。
    • 设定枪口位置引用:子弹从这个Transform的位置出发。
    • 设定子弹发射速率和间隔:定义子弹发射速度和两次发射之间的最小时间间隔。
  3. 事件监听与触发
    • 使用Unity的Update函数,实时检测用户的输入,即监测鼠标左键的点击事件。
    • 根据发射间隔,控制能否发射子弹,确保不会连续快速发射。
  4. 子弹发射逻辑
    • 当满足发射条件时,调用FireBullet函数。
    • 实例化子弹预制体到枪口位置,并沿枪口方向赋予初速度。
    • 设置子弹存在一段时间后自动销毁,避免占用过多内存资源。
控制发射脚本
using UnityEngine;
using UnityEngine.InputSystem;public class ZiDanFaShe : MonoBehaviour
{// 公共变量声明public GameObject bulletPrefab; // 子弹预制体,用于在游戏中实例化子弹public Transform gunMuzzle; // 枪口位置,子弹将从这个Transform的位置发射public float bulletSpeed = 20f; // 子弹飞行速度public float fireRate = 0.2f; // 子弹发射间隔时间(秒)// 私有变量声明private float nextFireTime = 0f; // 下一次允许发射子弹的时间点// Unity的Update方法会在每一帧被调用void Update(){// 检查鼠标左键是否按下if (Input.GetMouseButtonDown(0)){// 若满足发射间隔(当前时间大于等于下一次允许发射的时间点)if (Time.time >= nextFireTime){FireBullet(); // 调用发射子弹的方法nextFireTime = Time.time + fireRate; // 更新下一次允许发射的时间点}}}// 发射子弹的方法void FireBullet(){// 检查子弹预制体和枪口位置是否有效if (bulletPrefab != null && gunMuzzle != null){// 实例化子弹预制体到枪口的位置,并继承枪口的旋转GameObject bulletInstance = Instantiate(bulletPrefab, gunMuzzle.position, gunMuzzle.rotation);// 获取子弹实例的刚体组件Rigidbody2D bulletRigidbody = bulletInstance.GetComponent<Rigidbody2D>();// 如果子弹实例有刚体组件,给予它一个沿着枪口方向的速度if (bulletRigidbody != null){bulletRigidbody.velocity = gunMuzzle.right * bulletSpeed;}// 设置子弹在3秒后自动销毁Destroy(bulletInstance, 3f);}}
}

 实现脚本与方法解析

创建脚本并绑定到游戏对象
  1. 在Unity项目中创建一个新的C#脚本,命名为ZiDanFaShe,并将上述代码粘贴到其中。
  2. 将此脚本附加到游戏中需要发射子弹的游戏对象上,通常是角色的手持武器或者枪口所在的游戏对象。
设置公开变量
  1. bulletPrefab:这是一个公开的GameObject变量,需要在Unity Inspector界面中拖拽一个子弹预制体到此处。这个预制体在实际游戏中会被实例化为发射出的子弹。
  2. gunMuzzle:同样是一个公开的Transform变量,需拖拽到实际枪口位置的Transform组件。子弹将从这个位置发射出来,并继承其旋转方向。
  3. bulletSpeed:定义子弹发射出去的速度。
  4. fireRate:定义子弹发射的间隔时间,即每两次发射之间的最短时间间隔。
Update() 方法详解

Unity中的Update()方法会在每一帧都被调用。在该方法中,我们首先检查鼠标左键是否被按下:

  1. Input.GetMouseButtonDown(0):这个API会检测鼠标左键是否在当前帧被按下。这里的数字"0"代表鼠标左键。
  2. 如果鼠标左键被按下,我们会进一步检查是否达到允许发射的时间间隔:
  3. Time.time >= nextFireTime:比较当前游戏时间是否超过了上次发射后计算出的下一次允许发射的时间点。

如果满足发射条件,则调用FireBullet()方法,发射子弹,并更新下一次允许发射的时间点。

FireBullet() 方法详解
  1. Instantiate(bulletPrefab, gunMuzzle.position, gunMuzzle.rotation):通过预制体实例化一个子弹对象,放在枪口的位置,并采用枪口的旋转角度。
  2. GetComponent<Rigidbody2D>():获取实例化出来的子弹对象上的Rigidbody2D组件,以便设置它的速度。
  3. bulletRigidbody.velocity = gunMuzzle.right * bulletSpeed;:设置子弹的刚体组件速度为枪口方向乘以子弹速度。
  4. Destroy(bulletInstance, 3f);:设置子弹在3秒钟后自动销毁,这样可以防止过多子弹留在场景中造成性能损耗。

 子弹射出脚本

这个脚本非常的简单,你只需要创建一个新的脚本并不把下面的代码加进去就行

    void Update(){transform.position += transform.forward * Time.deltaTime * 15f;}

代码解析

主要用于更新游戏物体的位置。在每一帧(Update()函数每帧都会被调用)中,它会改变当前挂载此脚本的游戏对象的位置。

  1. transform.position: 表示当前游戏对象的三维世界坐标位置。
  2. +=: 这是一个赋值运算符,表示原位置加上后面表达式的值。
  3. transform.forward: 表示游戏对象的正前方方向向量。在Unity中,forward、right、up分别代表物体的前方、右方和上方方向。
  4. * Time.deltaTimeTime.deltaTime是上一帧到当前帧的时间差(单位为秒),用于确保移动速度不受帧率影响,保持平滑运动。将移动速度乘以deltaTime可以得到这一帧应移动的距离。
  5. * 15f: 这里的15f是一个浮点数,代表游戏对象每秒向前移动的速度(单位为米/秒)。

子弹属性 

如果你的子弹未能正常发射出去注意是否设置Rigidbody,注意不能设置Is Kinematic

当你需要有碰撞检测是你需要挂载Box Collider并勾选Is Trigger

 

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

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

相关文章

Qt扫盲-QAssisant 集成其他qch帮助文档

QAssisant 集成其他qch帮助文档 一、概述二、Cmake qch例子1. 下载 Cmake.qch2. 添加qch1. 直接放置于Qt 帮助的目录下2. 在 QAssisant中添加 一、概述 QAssisant是一个很好的帮助文档&#xff0c;他提供了供我们在外部添加新的 qch帮助文档的功能接口&#xff0c;一般有两中添…

八大技术趋势案例(虚拟现实增强现实)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

QT QInputDialog弹出消息框用法

使用QInputDialog类的静态方法来弹出对话框获取用户输入&#xff0c;缺点是不能自定义按钮的文字&#xff0c;默认为OK和Cancel&#xff1a; int main(int argc, char *argv[]) {QApplication a(argc, argv);bool isOK;QString text QInputDialog::getText(NULL, "Input …

李宏毅【生成式AI导论 2024】第6讲 大型语言模型修炼_第一阶段_ 自我学习累积实力

背景知识:机器怎么学会做文字接龙 详见:https://blog.csdn.net/qq_26557761/article/details/136986922?spm=1001.2014.3001.5501 在语言模型的修炼中,我们需要训练资料来找出数十亿个未知参数,这个过程叫做训练或学习。找到参数后,我们可以使用函数来进行文字接龙,拿…

【数据分析面试】3.编写数据选取函数(Python)

题目 给定了一个名为 students_df 的学生数据表格 nameagefavorite_colorgradeTim Voss19red91Nicole Johnson20yellow95Elsa Williams21green82John James20blue75Catherine Jones23green93 编写一个名为 grades_colors 的函数&#xff0c;以选择仅当学生喜欢的颜色是绿色或…

2024最新Guitar Pro 8.1中文版永久许可证激活

Guitar Pro是一款非常受欢迎的音乐制作软件&#xff0c;它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款产品可能已经成为全球最受欢迎的吉他打谱软件&#xff0c;在编写吉他六线谱和乐队总谱中始终处于行业领先地位&#x…

ESCTF-密码赛题WP

*小学生的爱情* Base64解码获得flag *中学生的爱情* 社会主义核心价值观在线解码得到flag http://www.atoolbox.net/Tool.php?Id850 *高中生的爱情* U2FsdG开头为rabbit密码,又提示你密钥为love。本地toolfx密码工具箱解密。不知道为什么在线解密不行。 *大学生的爱情* …

jira安装与配置

1. 环境准备 环境要求 1) JDK1.8以上环境配置 2) Mysql数据库5.7.13 3) Jira版本7及破解包 1.1 JDK1.8安装配置 1) 首先下载 JDK1.8&#xff0c; - 网址&#xff1a;https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html - windows64 版&am…

机器学习优化算法(深度学习)

目录 预备知识 梯度 Hessian 矩阵&#xff08;海森矩阵&#xff0c;或者黑塞矩阵&#xff09; 拉格朗日中值定理 柯西中值定理 泰勒公式 黑塞矩阵&#xff08;Hessian矩阵&#xff09; Jacobi 矩阵 优化方法 梯度下降法&#xff08;Gradient Descent&#xff09; 随机…

Pytorch的hook函数

hook函数是勾子函数&#xff0c;用于在不改变原始模型结构的情况下&#xff0c;注入一些新的代码用于调试和检验模型&#xff0c;常见的用法有保留非叶子结点的梯度数据&#xff08;Pytorch的非叶子节点的梯度数据在计算完毕之后就会被删除&#xff0c;访问的时候会显示为None&…

STM32CubeMX学习笔记28---FreeRTOS软件定时器

一、软件定时器简介 1 、基本概念 定时器&#xff0c;是指从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&#xff0c;用户 可以自定义定时器的周期与频率。类似生活中的闹钟&#xff0c;我们可以设置闹钟每天什么时候响&#xff0c; 还能设置…

Unity | 工具类-UV滚动

一、内置渲染管线Shader Shader"Custom/ImageRoll" {Properties {_MainTex ("Main Tex", 2D) "white" {}_Width ("Width", float) 0.5_Distance ("Distance", float) 0}SubShader {Tags {"Queue""Trans…

2024.3.28学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p286-p294 继承 继承可以解决代码复用&#xff0c;让我们的编程更加靠近人类思维&#xff0c;当多个类存在相同的属性和方法时&#xff0c;可以从这些类中抽象出父类&#xff0c;在父类中定义这些…

Day24|回溯算法part01:理论基础、77. 组合

理论基础 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集问题&#xff1a;一个N个数的集合里有多少符合条件的子集排列问题&#xff1a;N个数…

如何通过vscode连接到wsl

下载wsl扩展 远程连接模式

go的通信Channel

go的通道channel是用于协程之间数据通信的一种方式 一、channel的结构 go源码&#xff1a;GitHub - golang/go: The Go programming language src/runtime/chan.go type hchan struct {qcount uint // total data in the queue 队列中当前元素计数&#xff0c;…

专题二_滑动窗口(2)

目录 1658. 将 x 减到 0 的最小操作数 解析 题解 904. 水果成篮 解析 题解 1658. 将 x 减到 0 的最小操作数 1658. 将 x 减到 0 的最小操作数 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int minOperations(vector<int>& num…

MPDataDoc类介绍

MPDataDoc类介绍 使用mp数据库新接口mp_api.client.MPRester获取数据&#xff0c;例子如下&#xff1a; from mp_api.client import MPResterwith MPRester(API_KEY) as mpr:docs mpr.summary.search(material_ids["mp-1176451", "mp-561113"])以上代码返…

Java抽象类详解:定义、特性与实例化限制(day12)

抽象类 总结一下今天老师上课的内容&#xff0c;前面几节课听得是有点懵&#xff0c;在讲到内存问题&#xff0c;也就是代码在栈、堆、以及方法区是怎么执行的&#xff0c;听得不是很懂&#xff0c;今天讲到抽象类以及重写的机制&#xff0c;似乎开始慢慢懂得了java的底层原理…

Linux应用实战之网络服务器(三)CSS介绍

0、前言 准备做一个Linux网络服务器应用实战&#xff0c;通过网页和运行在Linux下的服务器程序通信&#xff0c;这是第三篇&#xff0c;介绍一下CSS&#xff0c;优化上一篇文章中制作的HTML页面。 1、CSS常用语法 CSS&#xff08;层叠样式表&#xff09;是用于描述HTML或XML…