查看原文
其他

Unity官方教程|使用Raycast显示射击轨迹

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

最终效果

本课程包括鼠标控制相机旋转、射击物体、显示射线轨迹及准星三个部分,最终实现效果如下:


在讲解实现步骤之前,先来了解Raycast的概念。Raycast可以简单理解为游戏场景中由某点发出的隐形射线,它能返回所有被射线射中的游戏对象的详细信息及RaycastHit结构体,RaycastHit结构体包括该游戏对象的Transform引用和射线与游戏对象交点的坐标等等。这里需要注意的是,只有带有碰撞体的游戏对象才能被射线检测到。
想了解更多关于Raycast及RaycastHit的信息,请点击[阅读原文]进入Unity官方中文社区。
另外要注意的是,在FPS游戏中,射击目标通常都是玩家眼睛朝向的位置,也就是相机正前方的中心点。所以这里瞄准物体并进行碰撞检测的射线并非我们需要绘制的射击轨迹。 


实现步骤
1
准备工作
首先点击[阅读原文]进入Unity官方中文社区,下载本课程所需的工程资源并导入Unity项目中。

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


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



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


上述代码涉及到还未添加的脚本与游戏对象,下面的步骤将一一说明。
3
添加LineRenderer组件
为Gun游戏对象添加LineRenderer组件,用于在运行时的游戏视图中绘制出射击轨迹,只有子弹发出时才会显示轨迹,所以默认是隐藏的,取消勾选组件名左侧的复选框隐藏组件。另外这里并未指定材质,所以绘制出来的射线会是粉红色的,你也可以自行添加材质。



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




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

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



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




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




在上方的RaycastShoot脚本中已经添加了射击处理的逻辑,当射中立方体时,此时运行场景,已经可以进行射击了,但还是比较难进行瞄准。下面来添加准星。
6
添加UI
在层级视图右键单击,弹出菜单中依次选择UI > Image新建Image,点击Color右边的颜色选取按钮,将Image的颜色设置为红色:




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


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




本次课程就分享到这里,如有任何疑问,请访问Unity官方中文社区。


延展阅读

Unity中的单元测试和错误追踪

Unity实用小工具:Asset Auditing

IL2CPP优化(上):去虚拟化

IL2CPP优化(中):虚方法调用

IL2CPP优化(下):避免装箱


更多Unity相关的技术教程,尽在Unity官方中文社区(forum.china.unity3d.com),请保持关注!


点击“阅读原文”进入Unity官方中文社区!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存