Unity_FPS游戏中设置子弹轨迹和红外线瞄准

2023-10-19 16:30

本文主要是介绍Unity_FPS游戏中设置子弹轨迹和红外线瞄准,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:2016-08-16 Unity官方

本教程适合Unity新手或对Raycast不甚了解的开发者,主要介绍Raycast的用途并绘制出射击游戏的射线轨迹。

本篇主要写子弹射击轨迹 红外线瞄准可以参考相关的参数设置

最终效果
本课程包括鼠标控制相机旋转、射击物体、显示射线轨迹及准星三个部分,最终实现效果如下:
这里写图片描述
在讲解实现步骤之前,先来了解Raycast的概念。Raycast可以简单理解为游戏场景中由某点发出的隐形射线,它能返回所有被射线射中的游戏对象的详细信息及RaycastHit结构体,RaycastHit结构体包括该游戏对象的Transform引用和射线与游戏对象交点的坐标等等。这里需要注意的是,只有带有碰撞体的游戏对象才能被射线检测到。

想了解更多关于Raycast及RaycastHit的信息,请查看Recast及RaycastHit。

另外要注意的是,在FPS游戏中,射击目标通常都是玩家眼睛朝向的位置,也就是相机正前方的中心点。所以这里瞄准物体并进行碰撞检测的射线并非我们需要绘制的射击轨迹。
这里写图片描述

下面就来为大家讲解实现步骤。

第一步 准备工作

首先下载本课程所需的工程资源并导入Unity项目中:

下载地址
http://u3d.as/wgo

找到Let’s Try Shooter > Scenes文件夹下的ShootingWithRaycasts场景并双击打开。其中已经设置好了本课程所需的游戏环境,FPSController来自Unity自带的Standard Assets资源包,下面新增了Gun游戏对象:
这里写图片描述

第二步 添加射击脚本

下面来添加射击脚本。在Scripts目录下新建C#脚本命名为RaycastShoot,将该脚本拖拽至层级视图的Gun游戏对象上,然后双击脚本进行编辑。RaycastShoot脚本的主要作用是发出射线,射击物体并造成伤害,播放射击音效,显示射击轨迹并等待一段时间后消失。脚本代码如下:

using UnityEngine;
using System.Collections;public class RaycastShoot : MonoBehaviour {// 设置枪击带来的伤害值public int gunDamage = 1;                                                                                        // 设置两次枪击的间隔时间public float fireRate = 0.25f;                                                                                // 设置玩家可以射击的Unity单位public float weaponRange = 50f;                                                                // 设置枪击为物体带来的冲击力public float hitForce = 100f;                        // GunEnd游戏对象public Transform gunEnd;                        // FPS相机private Camera fpsCam;                // 设置射击轨迹显示的时间private WaitForSeconds shotDuration = new WaitForSeconds(0.07f);        // 枪击音效private AudioSource gunAudio;                                                                                // 射击轨迹private LineRenderer laserLine;                                                                                // 玩家上次射击后的间隔时间private float nextFire;                                                                                                void Start () {// 获取LineRenderer组件laserLine = GetComponent<LineRenderer>();// 获取AudioSource组件gunAudio = GetComponent<AudioSource>();// 获取Camera组件fpsCam = GetComponentInParent<Camera>();}void Update () {// 检测是否按下射击键以及射击间隔时间是否足够if (Input.GetButtonDown("Fire1") && Time.time > nextFire) {// 射击之后更新间隔时间nextFire = Time.time + fireRate;// 启用ShotEffect携程控制射线显示及隐藏StartCoroutine (ShotEffect());// 在相机视口中心创建向量Vector3 rayOrigin = fpsCam.ViewportToWorldPoint (new Vector3(0.5f, 0.5f, 0.0f));// 声明RaycastHit存储射线射中的对象信息RaycastHit hit;// 将射击轨迹起点设置为GunEnd对象的位置laserLine.SetPosition (0, gunEnd.position);// 检测射线是否碰撞到对象if (Physics.Raycast (rayOrigin, fpsCam.transform.forward, out hit, weaponRange)){// 将射击轨迹终点设置为碰撞发生的位置laserLine.SetPosition (1, hit.point);// 获取被射中对象上的ShootableBox组件ShootableBox health = hit.collider.GetComponent<ShootableBox>();// 如果组件存在if (health != null){// 调用组件的Damage函数计算伤害health.Damage (gunDamage);}// 检测被射中的对象是否存在rigidbody组件if (hit.rigidbody != null){// 为被射中的对象添加作用力hit.rigidbody.AddForce (-hit.normal * hitForce);}}else{// 如果未射中任何对象,则将射击轨迹终点设为相机前方的武器射程最大距离处laserLine.SetPosition (1, rayOrigin + (fpsCam.transform.forward * weaponRange));}}}private IEnumerator ShotEffect(){// 播放音效gunAudio.Play ();// 显示射击轨迹laserLine.enabled = true;// 等待0.07秒yield return shotDuration;// 等待结束后隐藏轨迹laserLine.enabled = false;}
}

注意,射线应该从玩家眼睛所处位置向眼镜前方射出,玩家眼睛即相机所在位置。

上述代码涉及到还未添加的脚本与游戏对象,下面的步骤将一一说明。

第三步 添加LineRenderer组件

为Gun游戏对象添加LineRenderer组件,用于在运行时的游戏视图中绘制出射击轨迹,只有子弹发出时才会显示轨迹,所以默认是隐藏的,取消勾选组件名左侧的复选框隐藏组件。另外这里并未指定材质,所以绘制出来的射线会是粉红色的,你也可以自行添加材质。
这里写图片描述

第四步 创建GunEnd

这里需要一个空的游戏对象作为枪头处的位置标记,在层级视图中选中Gun游戏对象,右键单击在弹出菜单中选择Create Empty新建游戏对象,重命名为GunEnd。为GunEnd添加标签以便在场景中显示更明显,然后调整GunEnd的坐标至枪头处,这里设置为(0.36, -0.18, 1):
这里写图片描述

将创建好的GunEnd游戏对象拖拽至Gun对象的RaycastShoot脚本的GunEnd字段。

第五步 添加RayViewer脚本

上面提到了,瞄准物体并进行碰撞检测的射线并非我们需要绘制的射击轨迹。需要绘制的射击轨迹已经在RaycastShoot脚本中完成了,接下来添加RayViewer脚本,使用Debug功能在场景中绘制用于瞄准的射线,也就是从相机位置发出的射线。

新建C#脚本重命名为RayViewer,将脚本拖拽至Gun游戏对象上,双击脚本进行编辑。RayViewer脚本代码如下:

using UnityEngine;
using System.Collections;public class RayViewer : MonoBehaviour {// Debug.DrawRay绘制的Unity单位public float weaponRange = 50f;                      // FPS相机private Camera fpsCam;                               void Start () {// 获取Camera组件fpsCam = GetComponentInParent<Camera>();}void Update () {// 创建相机位置至视口中心点的向量Vector3 lineOrigin = fpsCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0.0f));// 在场景视图中绘制lineOrigin到相机前方武器射程处的射线Debug.DrawRay(lineOrigin, fpsCam.transform.forward * weaponRange, Color.green);}
}

到此射线的处理与绘制就差不多了,运行场景会看到场景视图出现了两条射线:
这里写图片描述

找到层级视图中Environment > Targets下,有两个TargetBox对象,选中对象会发现上面已经绑定了ShootableBox脚本。ShootableBox脚本的功能非常简单,CurrentHealth表示对象当前血量,初始总血量为3,脚本代码如下:

using UnityEngine;
using System.Collections;public class ShootableBox : MonoBehaviour {// 总血量public int currentHealth = 3;public void Damage(int damageAmount){// 调用Damage时总血量要减去伤害值currentHealth -= damageAmount;// 检测总血量是否小于等于0 if (currentHealth <= 0) {// 隐藏对象gameObject.SetActive (false);}}
}

在上方的RaycastShoot脚本中已经添加了射击处理的逻辑,当射中立方体时,此时运行场景,已经可以进行射击了,但还是比较难进行瞄准。下面来添加准星。

第六步 添加UI

在层级视图右键单击,弹出菜单中依次选择UI > Image新建Image,点击Color右边的颜色选取按钮,将Image的颜色设置为红色:
这里写图片描述

然后点击Rect Transform的锚点设置按钮,按下Alt/Option键同时选择中心点,让准星永远出现在屏幕中心位置:
这里写图片描述

设置好后再次点击运行,大功告成啦!

这里写图片描述

这篇关于Unity_FPS游戏中设置子弹轨迹和红外线瞄准的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/241013

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

轨迹规划-B样条

B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。 同时B样条分为准均匀和非均匀,以下为准均匀为例。 参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhuanlan.zhihu.com/p/50626506 参考链接2: https://zhuanlan.zhihu.com/p/536470972h

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

Tomcat性能参数设置

转自:http://blog.csdn.net/chinadeng/article/details/6591542 Tomcat性能参数设置 2010 - 12 - 27 Tomcat性能参数设置 博客分类: Java Linux Tomcat 网络应用 多线程 Socket 默认参数不适合生产环境使用,因此需要修改一些参数   1、修改启动时内存参数、并指定J

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

linux下非标准波特率的设置和使用

通常,在linux下面,设置串口使用终端IO的相关函数设置,如tcsetattr等函数,linux内部有一个对常用波特率列表的索引,根据设置的波特率用底层驱动来设置异步通信芯片的寄存器 对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和ioctl(fd, TIOCSSERIAL, p)的配合,ioctl的最后一个参数是struct serial_struct *