34

从零点五开始用Unity做半个2D战棋小游戏(一)-腾讯游戏学院

 5 years ago
source link: http://gad.qq.com/article/detail/288556
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
好久不见。

这是第17篇与游戏开发有关的文章。

也是“从零点五开始系列”第二辑的开始。

| 写在最前
这次想要做的一个小游戏,或者说一个小Demo,其实是一个简单且传统的战棋战斗场景。初步的设计是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方依据体力在地图上轮流行动并向对方发动攻击,先消灭掉所有敌人的一方将获得胜利。

这一辑将比上一辑的内容更简单,但完成后会是一个功能较完整且可以玩耍的Demo。

我使用的Unity版本是2018.2.7,但是其实并没有用到2018的任何新功能。

项目代码会上传至我的Github:https://github.com/elsong823/HalfSLG,有兴趣的同学请自取。



预计将分为以下几篇:

1、创建战场
根据预定尺寸生成战场地图,并随机一些障碍物。

2、添加对战双方
向战场中添加作战单位,作战单位可被点选,并进行移动。

3、战场逻辑
作战双方按照顺序依次行动,可进行移动、攻击。

4、添加战场UI
添加可以随时显示战况的Hud、为作战单位添加血条等。

5、扩展作战单位
丰富作战单位的类型,添加职业,并加入若干不同类型的技能。

6、扩展战场地图
丰富战场地图,加入地形及道具等元素。

7、规范战斗配置
可以通过规范化的数据结构配置战场、职业、技能、道具等。



本次的主题是创建战场

| 目标
生成一个规定尺寸的战场,战场上的格子均为六边形,并且暂定两种格子类型:普通格子障碍格子

| 在开始之前我做了以下事情
1.创建了新的工程。
2.新建场景并保存在场景文件夹下。
3.删除默认创建的平行光,调整场景光照设置,弃用了天空盒等。
4.将相机调整为正交相机。
因为是从零点五开始系列,认为读者有一定的Unity引擎使用基础,就不对这些操作进行介绍了。

| 创建战场地图
我没有采用把数据和显示捆绑在一起的做法,而是将数据和显示分离。
我的思路是用一个战斗创建器来创建战斗,一场完整的战斗信息至少应包含地图及对战双方的信息。而Unity搭建的战斗场景则可以理解为一场战斗的显示器

| 数据部分(主要)
战斗数据:地图尺寸,包含所有格子的二维数组。
格子数据:格子类型,所在行列,所在空间坐标。
5bf64dc5148c2.png

| 显示部分(主要)
战场:一个用于组织所有格子对象的节点对象。
格子对象:一个能显示六边形瓦片的2D渲染器,并根据格子类型改变颜色。
5bf64dfb5e022.png

当需要将战斗表现出来时,需要将以上数据装入一个用于显示的“战场”,这个战场就是在Unity世界里创建的。
5bf64e0927ede.png

| 在Unity中创建战场
目前战场的结构还非常简单,只需要一个组织格子单位的节点。
5bf64e22759ee.png

| 创建格子
创建一个格子脚本,并挂在一个新创建的空对象上。
5bf64e6a665bf.png
为这个空对象添加一个子对象,称之为瓦片,用来显示一个六边形

因为这里我只想做一个2D的Demo,因此我们只需要一个SpriteRenderer组件即可。
5bf64e7ad2622.png
使用预先准备的一张六边形图片作为地块显示,一个格子对象就做好了。

5bf64e8cbb1d2.png
为了区分普通和障碍,暂定普通格子为白色,障碍格子为灰色。

5bf64ea29b67e.png
战场加载后节点的状态。

| 部分代码
5bf64ec6e22d2.png
铺设普通格子

5bf64eb3ab1df.png
随机放一些障碍格子

5bf64eea0c969.png
战场根据格子信息,显示格子

5bf64ef915855.png
格子根据不同类型显示不同颜色

5bf64f0823329.gif
初始随机多张地图,并切换查看。



| 写在最后
至此,难度最低的第一篇已经完成。

感谢您能读到这里。

愿不忘初心。

下回见。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK