游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2586|回复: 0

用unity制作简单的太空游戏(2)-简单炮台

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2019-7-10 14:05:53 | 显示全部楼层 |阅读模式
v2-c1595ed89d4a673ec14730d73e19628d_r.jpg

多铆蒸刚,炮塔至大!

亿万星辰,亿万炮塔!

多铆蒸刚,炮塔至上!

亿万炮塔,亿万荣光!

(PS:我没有咕咕咕,就是比较惨,一口气出了半个月的差,人瘦了,也黑了,心塞塞……赶紧写个文章压压惊……)

这一篇我们来讲武器相关,本篇篇幅比较长,所以拆成两篇文章发,本文主要讲基本实现,下文讲讲常见的武器和效果。下一篇:用unity制作简单的太空游戏(3)-飞船的常见武器和功能

(PPS:工程链接在文末,上一篇也是,那些文章都没看完的就留言要代码的麻烦动动鼠标....)

作为太空游戏,没有炮塔怎么能行,赶紧掏出商店搜索资源,由于没有好看的free炮塔,暂且先下个最小体积的凑合用着,2M,就它了:

1.jpg

然后我们来搭建这样一个简单场景:

2.jpg


炮塔的旋转

对于炮塔的控制,我们要实现水平方向炮塔本身的旋转和垂直方向炮管的俯仰,这里要注意的一点是,这个炮塔资源有坑,轴向是错乱的,需要我们自己来修复,最终要保证Z轴为正方向。修复的方式可以是gameobject嵌套或者修改模型文件,理论上修复模型文件才是正确的,但这里偷个懒,直接套gameobject调轴向,保证炮塔的水平和垂直旋转是正确的就行,在图中,我们要控制Swivel节点作为水平方向的整体旋转,控制Barrel节点作为垂直方向的俯仰控制,都是根据原有模型以嵌套gameobject来处理,而模型原本的枪管的轴向则是Z轴朝上。具体可以看文末的工程。

3.gif

然后编写旋转控制的代码:这里有个取巧并且效率比较高的方式,就是直接LookRotation目标,然后通过设置localEulerAngles剔除多余轴向的旋转,再用Quaternion.RotateTowards进行插值做旋转速度的控制,注意这里是控制角速度而非线速度。

4.jpg

再根据鼠标位置传入目标位置,这里注意,没有检测到碰撞的时候hit.point是不会变化的,所以要再手动给个位置,这里直接使用相机远裁面的长度:

5.jpg

6.gif

可以看到旋转已经满足需求了,这样就实现了最简单的炮塔控制。后续还可以对旋转的插值方式进行更改以实现不同效果的转速变化等。

一般有个常见的需求是炮塔的旋转角度约束,比如只能对正前方90°范围内旋转等等:

7.jpg

8.jpg

炮塔的UI

关于UI,因为从设计上就分为了目标位置和炮口位置,所以需要分别显示,这也符合现实情况,通过在炮口位置发射射线检测即可,也需要注意空碰撞。

9.jpg

我画了个UI,分别表示鼠标指向和炮口实际指向,并通过Vector3.Angle取到二者之间的夹角,这样就有了简单的瞄准系统。

10.gif

此处有个常见的需求是在目标指向和真实指向中用虚线连接,这条虚线用处比较多,比如表示炮塔尚未旋转就位,在快速转动视角的时候更好显示等等,具体效果如图:

11.gif

虚线的实现很简单,一个ImageType为Tiled的Image,根据位置设置图片宽度和角度,这里有个优化的小点,直接设置Tiled并不正确,还需要在图片的WarpMode设置为Repleat,unity会自动优化网格面的拉伸:

12.jpg

没有设置Repleat的Image网格就没有优化

两点的位置已经知道了,那么我们来复习下初中数学题:

13.jpg

1、已知直角三角形ab两边边长,求斜边c的长度(233分)

14.jpg

2、已知直角三角形三边长度,求A的角度(666分)

15.jpg

简单的炮弹

有炮不射怎么行,掏出PS,是时候展示出我拙劣的PS功力了,画个方框:

16.jpg

丢进unity拼个子弹,记得给子弹上挂个音效,勾上play On Awake:

17.jpg

然后我们先不管代码结构,老夫写代码就是一把搓,撸出功能为先。直接实例化子弹。

18.jpg

子弹具有飞行速度和生命周期,超出周期后销毁(这里先简单实现,后续会改为对象池),开火这里,有个细节,根据炮口数量进行顺序切换。

19.jpg

(PS:大量生成必须要通过对象池管理,不然就坐等内存爆炸,对象池的核心在于对象的创建,回收和销毁的策略,具体的实现网上一搜一大把,unity官网近期BUG了,这里贴另一个大佬的实现:UGF中的对象池,UGF是个非常适合阅读学习的unity框架,作者目前在北京畅游,大家有空多看看,什么叫工整,什么叫严谨……)

20 (1).gif

这样,一个简单的炮塔就实现了。当然,目前丑陋的炮塔和贫穷的特效显然是无法令人满意的,之后将进行特效的补充,丰富武器类型。

(未完待续)

本篇实现功能在工程目录的~/_Project/Example/Sci/TurretCtrl/SimpleTurretCtrl/路径下。

工程地址:https://github.com/evesgf/SpaceGame

前文:用unity制作简单的太空游戏(1):简单飞船控制


作者:杨定鹏
专栏地址:https://zhuanlan.zhihu.com/p/72355543

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-11-24 13:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表