文章目录

  • 一、前言:童年的回忆
  • 二、本文Unity制作的效果
  • 三、情怀来了,想玩FC游戏
  • 1、下载FC模拟器,推荐nestopia
  • 2、启动nestopia
  • 3、下载FC卡带包:76合1(76in1)
  • 4、载入卡带(.nes)
  • 5、设置键盘按键(或手柄)
  • 6、开始玩耍吧
  • 7、重启(重载卡带)
  • 8、我收藏的FC卡带(54款)
  • 四、Unity 2D游戏关卡制作
  • 1、创建Unity工程
  • 2、Tilemap的使用
  • 2.1、导入素材图片
  • 2.2、切割图片
  • 2.3、创建画板
  • 2.4、创建瓦片
  • 2.5、创建网格
  • 2.6、在网格上刷瓦片
  • 2.7、解决瓦片没有占满格子的问题
  • 2.8、解决瓦片之间有缝隙的问题
  • 2.9、擦除瓦片
  • 2.10、区域瓦片绘制
  • 2.11、瓦片吸取
  • 2.12、填充瓦片
  • 2.13、瓦片分层(渲染顺序)
  • 2.14、添加碰撞体
  • 2.15、合并碰撞体
  • 3、添加环境背景图
  • 3.1、导入天空背景图
  • 3.2、SpriteRenderer显示天空图片
  • 3.3、调节天空图片层级
  • 3.4、调节天空图片缩放
  • 3.5、设置天空图片循环模式
  • 4、添加环境装饰
  • 5、添加主角
  • 5.1、主角图片
  • 5.2、制作序列帧动画
  • 5.3、调整主角的层级
  • 5.3、主角添加刚体和碰撞体
  • 五、最终效果预览
  • 附录:76合1游戏目录


一、前言:童年的回忆

点关注不迷路,持续输出Unity干货文章。
嗨,大家好,我是新发。
小时候最开心的事情就是放暑假在家打小霸王游戏机了,相信对于大部分80后、90后的童年来讲,这些经典的红白机FC游戏都是最值得纪念的回忆之一。

docker fc docker fc游戏项目_docker fc


docker fc docker fc游戏项目_unity_02


不知道大家最喜欢玩的是哪款FC游戏呢?欢迎评论区里留言~

我小时候就在想,要是我也能做一款这样的游戏该多好。今天呢,我就来教大家如何在Unity中快速地制作类似经典的红白机FC横版2D游戏关卡吧。

二、本文Unity制作的效果

本文Unity制作效果如下:

docker fc docker fc游戏项目_红白机FC_03


本文Demo工程已上传到CodeChina,感兴趣的同学可自行下载学习。

地址:

注:我使用的Unity版本:Unity 2020.1.14f1c1 (64-bit)

docker fc docker fc游戏项目_docker fc_04

三、情怀来了,想玩FC游戏

先不着急讲本文的Unity制作。此刻,或许已经勾起了童年的回忆,迫不及待想怀旧重温一下经典,好,我来帮你圆梦。

1、下载FC模拟器,推荐nestopia

要在电脑上完FC游戏,我们需要先下载个FC模拟器。
现在大家常用的主流FC模拟器是下面几款:

FC模拟器

官网

备注

nestopia

http://nestopia.sourceforge.net/

推荐使用这款,界面友好,体验好

FCEUX

http://fceux.com/web/home.html

需要设置的地方相对较多,界面不是很友好

OpenEMU

http://openemu.org/

只有苹果版,Windows不能使用

VirtuaNES

http://virtuanes.s1.xrea.com/vnes_dl.php

模拟器有点跳帧

我推荐大家下载第一款,也就是nestopia,它的界面比较友好,相对好用很多,而且帧率也比较稳定。

如果上面nestopia的下载地址下不动,可以可以通过我共享的网盘下载。
链接:https://pan.baidu.com/s/1BnHD0uEVe5T3q5d9Is_4Gg 提取码:tblo

2、启动nestopia

双击运行nestopia.exe

docker fc docker fc游戏项目_2D游戏_05


启动后画面如下:

docker fc docker fc游戏项目_2D游戏_06

3、下载FC卡带包:76合1(76in1)

上面我们打开nestopia.exe后界面是黑压压的没有画面显示,这是因为我们还没有载入卡带,所以我们需要先下载卡带,这里我推荐一个76合1(76in1)的卡带。

76合1卡带包下载地址:https://www.fcnes.com/uploads/soft/150205/76-in-1(good).zip

下载下来后解压,可以看到它只有2M左右哦。

docker fc docker fc游戏项目_docker fc_07

4、载入卡带(.nes)

回到nestopia界面,点击菜单File / Open...

docker fc docker fc游戏项目_docker fc_08


选择刚刚的卡带文件,点击打开即可。

docker fc docker fc游戏项目_unity_09


可以看到,模拟器中出现画面了。

注:76合1的游戏目录见文章末尾附录。

docker fc docker fc游戏项目_unity_10

5、设置键盘按键(或手柄)

点击菜单 Options / Input...

docker fc docker fc游戏项目_红白机FC_11


根据你的喜欢进行按键设置,点击Set All按钮,然后挨个设置即可,比如我习惯这样设置:

docker fc docker fc游戏项目_unity_12

6、开始玩耍吧

选择第1页的第8个游戏,就是超级马里奥啦,开始愉快地玩耍吧。

docker fc docker fc游戏项目_docker fc_13

7、重启(重载卡带)

如果想要重启,可以点击菜单Machine / Reset / Hard,或者按快捷键Shift + T,效果等价于我们把卡带拔出来重新插入。

docker fc docker fc游戏项目_2D游戏_14

8、我收藏的FC卡带(54款)

76合1不够玩,那就把我收藏的这些卡带都给你吧~
链接:https://pan.baidu.com/s/1fl5G_bQ10-OuyYZE4pne4A 提取码:nfdr

docker fc docker fc游戏项目_2D游戏_15


docker fc docker fc游戏项目_2D游戏_16

四、Unity 2D游戏关卡制作

回归正题,那么,我们用Unity如何制作类似FC这样的2D游戏呢?本文我将教你使用Tilemap工具来快速制作2D游戏关卡场景。

1、创建Unity工程

第一步,建一个Unity工程,注意选择2D模板,工程名叫Unity2DGameDemo好了。

注:如果你没有选2D模板也没事,创建工程后修改一下摄像机的projectionOrthographic(正交)模式即可。另外,选择2D模板,Unity会自动帮你下载2D的相关插件,比如2D Sprite,这些插件也可以手动下载,后文我会讲到。

docker fc docker fc游戏项目_docker fc_17


如下,工程创建完毕。

docker fc docker fc游戏项目_docker fc_18

2、Tilemap的使用
2.1、导入素材图片

我们要制作关卡,得先有关卡的图片素材,以地形素材为例:

docker fc docker fc游戏项目_docker fc_19


把素材图片导入到Unity工程中,如下,放在Textures目录中。

docker fc docker fc游戏项目_2D游戏_20


注意设置一下图片的类型为Sprite (2D and UI)

docker fc docker fc游戏项目_2D游戏_21

2.2、切割图片

先检查一下你是否安装了2D Sprite,如果没有,则先安装它。

docker fc docker fc游戏项目_docker fc_22


点击菜单Window / Package Manager,搜索2d spreite,下载并安装2D Sprite插件。

docker fc docker fc游戏项目_红白机FC_23


现在,我们需要把整图的素材图片切割成一个个小格子图片,用于后面制作Tilemap的瓦片。

先将图片的Sprite Mode设置为Multiple,然后点击Apply按钮保存。

docker fc docker fc游戏项目_docker fc_24


接着,点击Sprite Editor按钮,打开编辑工具。

docker fc docker fc游戏项目_docker fc_25


在弹出的Sprite Editor窗口中,点击Slice按钮,然后选择TypeGrid By Cell Count,设置列数和行数,比如我这里设置了25 23,这里的列数行数需要根据你自己整图的排版而定,最后点击Slice按钮。

docker fc docker fc游戏项目_tilemap_26


切割后,别忘了点击Apply按钮保存。

docker fc docker fc游戏项目_docker fc_27


我们可以看到,整图生成了一张张小格子纹理图:

docker fc docker fc游戏项目_2D游戏_28

2.3、创建画板

先检查下你是否安装了2D Tilemap Editor插件,如果没有,则先安装它。

docker fc docker fc游戏项目_tilemap_29


点击菜单Window / Package Manager,搜索tilemap,下载并安装2D Tilemap Editor插件。

docker fc docker fc游戏项目_unity_30


先创建一个Palettes文件夹,用于下面存放画板文件。

docker fc docker fc游戏项目_docker fc_31

接着点击菜单Window / 2D / Tile Palette

docker fc docker fc游戏项目_unity_32

此时会打开Tile Palette窗口,点击Create New Palette按钮,

docker fc docker fc游戏项目_2D游戏_33


输入画板名字,比如MyPalette,点击Create按钮,

docker fc docker fc游戏项目_红白机FC_34


我们将其保存到Palettes目录中。

docker fc docker fc游戏项目_tilemap_35


如下:

docker fc docker fc游戏项目_docker fc_36

2.4、创建瓦片

先创建一个Tiles文件夹,用于存放下面的瓦片文件。

docker fc docker fc游戏项目_2D游戏_37


将整图拖入Tile Palette窗口中,选择瓦片保存目录为Tiles,即可将图片添加到画板中,并且生成瓦片文件。

docker fc docker fc游戏项目_2D游戏_38


生成的瓦片文件如下:

docker fc docker fc游戏项目_tilemap_39


我们也可以只拖某张小图到画板中,单独保存某张瓦片,像这样子:

docker fc docker fc游戏项目_tilemap_40

2.5、创建网格

Hierarchy视图空白处右键鼠标,点击菜单2D Object / Tilemap

docker fc docker fc游戏项目_docker fc_41


此时就会在场景中创建一个Grid / Tilemap节点,

docker fc docker fc游戏项目_docker fc_42


此时在Scene场景中就可以看到一个个网格了。

docker fc docker fc游戏项目_unity_43

2.6、在网格上刷瓦片

打开刚刚的Tile Palette画板窗口,点击画笔(顶部第三个按钮,快捷键B),然后选中你要绘制的瓦片,在场景的格子中按住鼠标拖动即可在网格中连续画出瓦片了,如下:

docker fc docker fc游戏项目_unity_44


不过这里我们发现了一个问题,瓦片图片并没有铺满一个格子,这是为什么呢?

docker fc docker fc游戏项目_2D游戏_45

2.7、解决瓦片没有占满格子的问题

瓦片图片没有铺满格子的问题,是因为在Unity中,一个单元格绘制多少像素是由图片本身设置决定的,我们选择瓦片整图,可以看到Pixels Per Unit100,它表示一个单元格显示100个像素。

docker fc docker fc游戏项目_tilemap_46


而我们一个瓦片图片的尺寸是16 x 16

docker fc docker fc游戏项目_tilemap_47


所以,想要让瓦片铺满一个格子,我们把Pixels Per Unit设置为16即可。

docker fc docker fc游戏项目_2D游戏_48


可以看到,现在瓦片刚好铺满一个格子了。

docker fc docker fc游戏项目_红白机FC_49

2.8、解决瓦片之间有缝隙的问题

虽然瓦片铺满了格子,但是它们之间是有缝隙的,我们在Game视图中观察可能会更清楚一点,如下:

docker fc docker fc游戏项目_docker fc_50


解决办法是把瓦片整图的Filter Mode设置为Point (no filter)

docker fc docker fc游戏项目_2D游戏_51


可以看到现在没有缝隙了:

docker fc docker fc游戏项目_红白机FC_52

2.9、擦除瓦片

画瓦片的时候,可能不小心画错了,需要擦除。

我们只需在画板工具上点击橡皮擦按钮(快捷键D),然后在网格中点击即可擦除对应的瓦片,如下:

docker fc docker fc游戏项目_unity_53

2.10、区域瓦片绘制

我们可以在画板找那个选中一个区域的瓦片,就可以直接在网格中一次画出来了,如下:

docker fc docker fc游戏项目_docker fc_54

2.11、瓦片吸取

我们可以在画板中选择瓦片然后在网格中画,我们也可以直接在网格中通过吸取工具(快捷键I)选择对应的瓦片,如下:

docker fc docker fc游戏项目_docker fc_55

2.12、填充瓦片

我们可以给一个闭包的区间填充瓦片(快捷键G),选中瓦片,然后在一个闭包的区域点击一下即可填充,如下:

docker fc docker fc游戏项目_红白机FC_56

2.13、瓦片分层(渲染顺序)

我们可以创建多个Tilemap,比如我创建了一个Tilemap2用来绘制柱子,

docker fc docker fc游戏项目_docker fc_57


我们可以看到柱子的层与地面的层的渲染顺序不对,

docker fc docker fc游戏项目_2D游戏_58


我们希望地面的层在前面,只需要选择地面的TilemapOrder in Layer调大即可,比如调成1。(柱子层的Order in Layer是0)。

docker fc docker fc游戏项目_docker fc_59


现在渲染顺序就对了,

docker fc docker fc游戏项目_docker fc_60

2.14、添加碰撞体

我们的主角需要能够站在地面上,所以地面层的Tilemap需要添加碰撞体,我们给地面层的Tilemap节点添加Tilemap Collider 2D组件,如下:

docker fc docker fc游戏项目_unity_61


我们可以看到地面层的瓦片都带上了碰撞体。

docker fc docker fc游戏项目_tilemap_62

2.15、合并碰撞体

我们可以看到,碰撞体是一格一格的,

docker fc docker fc游戏项目_tilemap_63


为了提升性能,建议把碰撞体进行合并,只需要在地面层的Tilemap节点再挂一个Composite Collider 2D组件(它会自动再挂一个Rigidbody 2D组件)。

docker fc docker fc游戏项目_unity_64


Rigidbody 2D组件的Body Type设置为Static,否则地面会受到重力往下掉。

Tilemap Collider 2D组件的Used By Composite勾选上,这样碰撞体格子会进行合并。

docker fc docker fc游戏项目_2D游戏_65


合并后的碰撞体如下:

docker fc docker fc游戏项目_2D游戏_66

3、添加环境背景图
3.1、导入天空背景图

现在我们的场景背景是空白的,如下:

docker fc docker fc游戏项目_红白机FC_67


我们现在给它添加一个天空背景图,先导入天空背景图图片:

docker fc docker fc游戏项目_tilemap_68


如下:

docker fc docker fc游戏项目_2D游戏_69

3.2、SpriteRenderer显示天空图片

在场景中创建一个Env空节点,然后把sky图片直接拖入场景中做诶Env子节点,此时它会自动挂上SpriteRenderer组件。

docker fc docker fc游戏项目_2D游戏_70


效果如下:

docker fc docker fc游戏项目_tilemap_71

3.3、调节天空图片层级

可以看到天空背景与我们的瓦片层级是错误的,我们把天空背景图的Order in Layer调小,比如设置为-10,这样天空背景图就在最后面了。

docker fc docker fc游戏项目_红白机FC_72


如下:

docker fc docker fc游戏项目_unity_73

3.4、调节天空图片缩放

我们再调整一下天空背景图的缩放,使之铺满屏幕,

docker fc docker fc游戏项目_2D游戏_74


如下:

docker fc docker fc游戏项目_unity_75

3.5、设置天空图片循环模式

虽然天空背景图铺满了一个屏幕,但是它并没有覆盖整个地图,

docker fc docker fc游戏项目_红白机FC_76


我们把天空图片的Mesh Type改为Full Rect

docker fc docker fc游戏项目_docker fc_77


然后把sky节点的Draw Mode改为Tiled

docker fc docker fc游戏项目_红白机FC_78


然后调整Width即可循环天空图片了。

docker fc docker fc游戏项目_红白机FC_79

4、添加环境装饰

和天空背景图片一样的原理,继续添加一下环境装饰图片,比如房子、树、草堆等等。

docker fc docker fc游戏项目_unity_80

docker fc docker fc游戏项目_docker fc_81

docker fc docker fc游戏项目_红白机FC_82


效果如下:

docker fc docker fc游戏项目_红白机FC_83

5、添加主角
5.1、主角图片

我们现在加上主角吧,把主角图片导入到工程中,

docker fc docker fc游戏项目_docker fc_84


多个序列帧按目录分好,

docker fc docker fc游戏项目_红白机FC_85

5.2、制作序列帧动画

我们要创建序列帧动画,所以先创建一个Animations文件夹用来存放动画文件,

docker fc docker fc游戏项目_红白机FC_86


选中idle状态的序列帧拖到场景中,

docker fc docker fc游戏项目_docker fc_87


此时会询问你保存动画文件,将其保存为playerIdle.anim,存放在Animations文件夹中。

docker fc docker fc游戏项目_unity_88


此时可以看到场景中显示了主角player-idle-1,并且生成了动画文件:player-idle-1.controllerplayerIdle.anim

docker fc docker fc游戏项目_2D游戏_89


将动画控制器player-idle-1.controller重命名为player.controller,将场景中的节点player-idle-1重命名为Player,并保存为预设Player.prefab,存放到Resources/Player文件夹中。

docker fc docker fc游戏项目_2D游戏_90


由于动画制作不是本文重点,讲下去的话本文的篇幅就太长了,关于Animator更详细的教程,可以参见我之前写的这篇文章:《Unity动画状态机Animator使用》。

我之前也写过一篇飞机大战的教程,里面第四篇讲的就是主角序列帧动画控制,感兴趣的同学可以看下:《使用Unity 2019制作仿微信小游戏飞机大战(四):主角飞机序列帧动画》

5.3、调整主角的层级

我们看到主角的层级有问题,主角需要显示在最前面,

docker fc docker fc游戏项目_tilemap_91


我们把主角的Order in Layer调大一点,比如调成5

docker fc docker fc游戏项目_tilemap_92


现在主角在最前面了,

docker fc docker fc游戏项目_红白机FC_93

5.3、主角添加刚体和碰撞体

为了让主角可以落在地面上,我们给主角添加刚体组件和碰撞体组件。

docker fc docker fc游戏项目_红白机FC_94


运行效果如下:

docker fc docker fc游戏项目_docker fc_95

五、最终效果预览

最终效果预览如下:

docker fc docker fc游戏项目_红白机FC_03


就先写这么多吧.

末了,喜欢Unity的同学,不要忘记点击关注,如果有什么Unity相关的技术难题,也欢迎留言或私信~

附录:76合1游戏目录

序号


选项

英文名

中文名

01

P1

01

Pin Ball

弹珠台

02

P1

02

Urban Champion

街头格斗小子

03

P1

03

Dig Dug

打空气1

04

P1

04

Excite Bike

越野摩托

05

P1

05

Mabby

快乐猫

06

P1

06

Circus Chablie

马戏团

07

P1

07

Mario Bros

马里奥水管工

08

P1

08

Super Mario

超级马里奥1

09

P1

09

KeyKong JR

大金刚JR

10

P1

10

Tennis

网球

11

P2

01

Pengun Adventure

南极大冒险

12

P2

02

Macross

超时空要塞

13

P2

03

Kung Fu

功夫

14

P2

04

Combat

杀戮战场

15

P2

05

F1 Race

F1赛车

16

P2

06

Road Fighter

公路英雄

17

P2

07

Exerion

火凤凰

18

P2

08

Twin Bee

兵蜂1

19

P2

09

Star Force

星际战机

20

P2

10

Formation 2

变型战机Z

21

P3

01

B Winges

B计划

22

P3

02

Ice Climber

敲冰块

23

P3

03

Baltle City

坦克大战

24

P3

04

Mahjong 4

四人麻将

25

P3

05

Bomber Man

炸弹人1

26

P3

06

Pack Man

吃豆小精灵

27

P3

07

Galaza

大蜜蜂

28

P3

08

Front Line

前线

29

P3

09

Joust

鸟骑士

30

P3

10

Popeye

大力水手

31

P3

11

Milk And Nuts

牛奶与花生

32

P4

01

1942

1942

33

P4

02

Othello

黑白棋

34

P4

03

Lode Runner 2

淘金者2(淘金者锦标赛)

35

P4

04

Lode Runner

淘金者1

36

P4

05

Baseball

棒球

37

P4

06

Lunar Ball

月宫桌球

38

P4

07

Ninja

忍者大决战

39

P4

08

Millipecle

杀虫大战

40

P4

09

Arabian

超级阿拉伯

41

P4

10

Ballon Fight

气球大战

42

P4

11

Chack’n Pop

拯救爱心

43

P5

01

Galaxian

小蜜蜂

44

P5

02

Sky Destroyer

红巾特攻队

45

P5

03

Mahjong 2

麻将

46

P5

04

Devil World

恶魔世界

47

P5

05

Binary Land

双企鹅

48

P5

06

Pooyan

三只小猪

49

P5

07

Warpman

太空青蛙

50

P5

08

Donkey Kong

大金刚1

51

P5

09

Donkey Kong 2

大金刚2(JR)

52

P5

10

Helicopter

救难直升机

53

P5

11

Ninja 2

忍者君

54

P6

01

Clu Land

克鲁克鲁世界

55

P6

02

City Connection

碰碰车

56

P6

03

Burger Time

汉堡时代

57

P6

04

Golf

高尔夫

58

P6

05

Gobang

五子棋

59

P6

06

Wrestle

筋肉人摔角

60

P6

07

Star Juster

太空侵略者(星际保卫战)

61

P6

08

Karateka

空手道(英雄救美)

62

P6

09

Duck Hunt

打鸭

63

P6

10

Wild Gunman

荒野枪手

64

P6

11

Hogan Alley

警技射击

65

P7

01

Mach Rider

机车大赛

66

P7

02

King of Ghost

Q太郎

67

P7

03

Gypodine

战斗直升机

68

P7

04

Ninja 3

忍者哈特君

69

P7

05

Mag Max

组合金刚

70

P7

06

Spartan

成龙踢馆1

71

P8

01

Wrecking Crew

马里奥敲砖工

72

P8

02

Elevator Action

电梯大战

73

P8

03

Xevious

铁板阵

74

P8

04

Arkanoid

打砖块

75

P8

05

Galg

塞尔特战机(头脑战舰)

76

P8

06

Tetris 2

俄罗斯方块(天正版2)