Godot-StartUP

创建于:2018-07-28

创建人: Justus

44 信息 138 成员
讨论基于Godot以及Unity引擎的游戏开发经验,理论和最佳实践。共享一些通用思路以启发另一种生产工具中的实践。独立开发群QQ: 122017359
Bitca Games@Godot-StartUP 的内容(查看所有内容
《千手英雄》开发日志 - 可以结束了~
Bitca Games 2022-12-21

《千手英雄》这个游戏在 2019 年底 2020 年初开始制作,当时参与人员 3 人,同年 6 月份完成了 6 个游戏并发布了 EA 版本。3 年之后的 2022 年底,这游戏终于开发完毕了!


Steam 商店页面 : Steam 上的 千手英雄 (steampowered.com)

steam shop


这个游戏的上一篇日志,也就是第一篇日志在这里:《千手英雄》开发手记 | indienova 独立游戏


第一篇日志发布在 EA 时,两年多之前了,喜欢看 UP 主被打脸的同学可以先看那个再回来~


注意,本文大量动图~


温故……EA阶段的 6 个游戏

1 / 10 Star Num

Image title

一个简简单单的射击游戏,我方战机固定在中央,可以正反向旋转。

从四面八方靠近的是各种数字形状的陨石。可以发射'加号'和'减号'两种子弹,打中后数字增加到 10 或者减少到 0 就会爆掉。

武器有温度槽,过热后需要冷却才能使用,打爆所有陨石后游戏胜利。


2 / 10 Candy Box

Image title

消除游戏一个,就是基本的俄罗斯方块的玩法,把最底一行方块消除后游戏胜利。


3 / 10 Cyber Puck

Image title

这个是一个迷宫吃豆游戏,豆子换成黑客帝国中的红蓝药丸,敌人换成 agent,吃到红色药丸后可以爆发将敌人打飞。

吃完所有药丸后会出现一个电话亭,进入电话亭后游戏胜利。


4 / 10 Gun Hat

Image title

一个纵向自动卷轴的射击游戏,西部主题,使用两个按键控制 3 个射击方向,到了关底打败 Boss 游戏胜利。


5 / 10 Jump Man

Image title

接下来是个体育游戏,跨栏,你只有一个对手,除了要跨栏,你还得避开水坑和香蕉皮。

吃到完整的香蕉可以爆发冲刺,比对手先跨过终点便算胜利。


6 / 10 Well Diver

Image title

一个下 100 层的游戏,你不需要真正的下 100 层,但你碰到尖刺就会像气球一样爆掉。

安全到达终点就算胜利了。


知新……完成阶段的 4 个游戏

7 / 10 FAT-CHI

Image title

照顾一只宠物猫咪,方式是输入指令,在规定时间内完全输入正确就会得到一颗心,满心后游戏胜利。


8 / 10 Backstreet Fighter

Image title

只有一个招式的格斗游戏,适合喜欢扇耳光和被扇耳光的玩家,随着力量的积蓄,攻击力度会加大。打到对方血槽空就胜利了。


9 / 10 Hot Road

Image title

死亡赛车,可以安装 6 管机枪射击前方车辆,也可以使用超级加速进行弯道超车,规定时间内跑完 3 圈就算胜利。


10 /10 Legend Of Lin

Image title

不是林克,是林道长,但同样要走迷宫。发射符咒定住敌人,木剑是自动攻击的,找到钥匙开门打败最终 Boss 就胜利了。


设计

挑战模式

这 10 个小游戏,每个长度差不多都在 1分钟左右,这个长度主要就是为了挑战模式而设计的:

这些游戏在挑战模式中可以并行执行,其中一个是全速状态,而其它的则是'子弹时间'状态。

Image title



画廊模式

当然每个游戏都可以单独的玩,我设置了个'画廊'模式:

Image title



编辑器模式

以防有人很喜欢这个游戏,并想自己'制造'一些挑战,我们做了个编辑器,自己编个关卡,还可以分享给朋友:

Image title


那么,以上就是这个游戏的全部了~


而在这个作品之前,我上一个发布的游戏是《孙悟空大战机器金刚》:Steam 上的 孙悟空大战机器金刚 / Sun Wukong VS Robot (steampowered.com)

Image title

那是一个像素的平台动作游戏,相关的日志写了十多篇,就不在这里赘述。

这个游戏除了登录 Steam 之外,还由 Indienova 搬到了任天堂 Switch 平台:Sun Wukong VS Robot for Nintendo Switch - Nintendo Official Site

Image title


而在《千手英雄》中,为了取得更好的成绩,我开始考虑怎样的游戏才能吸引玩家购买。

于是我选择了做一些有'创意'的东西,因为我当时觉得独立游戏就是古古怪怪的专门吸引猎奇的玩家,

而《千手英雄》的特别之处就是这个'同时运行多个游戏的机制',简单点说就是同时开了若干个不同游戏的窗口。

那么效果如何呢?请接着往下看……


市场

对比销量

上一篇开发日志的结尾中,我定下的目标是卖出比《孙悟空大战机器金刚》更多的份数,毕竟想给合作者一个交代。那么《孙悟空大战机器金刚》卖出了多少呢?

Steam平台到现在大约 2400 份,愿望单数为 3913,评论数为 63。


而《千手英雄》EA直到现在售出 33 份,愿望单 657,如果我没记错的话,在EA之前,在其乐搞的抽奖活动,愿望单已经 450 左右了。


差太远了,真烂啊,对吧?


入围 WePlay

唯一算得上有点建树的可能就是游戏入围了 2020 年WePlay的'最佳创新'游戏评选,

注意只是入围,这很有可能是这个游戏唯一的高光时刻:2020 indiePlay中国独立游戏大赛入围名单公布!

Image title

Image title

Image title

上图的这位阿姨,我猜这应该是她在这个展馆中唯一会玩的一个游戏。


不过能参加这个展会真的很高兴,增长了许多见识,也与很多素未谋面的开发者见了面。


为何无人问津呢?

好了,让我来猜测一下失败的原因,开发者朋友们可以参考一下:

  • Steam 的自然流量越来越少了。
  • 海外宣传工作难开展,所谓的出海,不是一般的国内独立开发者能操作的。
  • 国内的独立游戏越来越多,反响却越来越少了,关注度被稀释了。
  • 单机PC游戏在国内是被冷落得对象,TapTap 这样以手游为主的平台已经不再支持开发者登记PC单机游戏,当然除非你名声在外。
  • 国内能够连接开发者和普通玩家的平台太少了,围脖什么的,各种莫名奇妙的限流。

以上可以算作外因,环境因素,东西不行,还是多从自身找原因:

  • EA策略不对,EA 没有流量,EA 只适合众筹的作品。
  • 没有宣传,很多跟我一样的独立游戏的朋友都会收到这样的反馈“你的游戏还不错,为什么就不会宣传一下呢?”,这是个通病。
  • 没有话题性,就是个平庸的独立游戏。
  • 所谓的'创新'并没有能够成为商品的卖点,这种点子用在 gamejam 上可以,用到商品上很勉强,除非这创意很好,并且有大量的内容支撑,但事实上不行。
  • 画面太复古,像素画给人一种廉价的感觉,做得不惊艳等于赶跑了很多玩家。
  • 目标受众太小圈子,而且也没有曝光在目标受众面前。本来复古的画面就不吸引人,如果还想吸引那些喜欢速攻和挑战的 GDQ 玩家就更难了,毕竟可以拿来速攻的游戏大多有广泛的群众基础和知名度。
  • 作品体量太小了,不耐玩,也不好玩。把这放在最后一点,就是说只要这点做到了,前面的都不是问题了。


结案

游戏在 EA 之后的表现,似乎已经被证明游戏没有什么市场价值,所以继续开发基本没有什么动力了,能够完成也是为了做到有始有终。

有失必有得,下面说点正面的:


历练

做完 10 个小游戏,但这 10 个游戏基本类型各异,可以说相当于参加了 10 次 Gamejam。其实我们半年时间就已经完成了完整版的游戏了,而且都是在业余时间做,因为白天还有主要项目要做。所以要说三年开发了这个游戏,其实所花的时间成本并没有太高,当然,在后期的 4 个游戏以及各种优化打磨方面我确实花了蛮多时间。


Godot 引擎

游戏开发启动时,就选择了使用 Godot 引擎,2019 年底时 Godot 引擎已经相当成熟了,特别是对于 2D 游戏来说,而且这个引擎的使用体验很符合我的理念:小巧快速。我比较喜欢开源软件,以前做动画时用 Blender,那时可以看着它逐渐成长变强。到现在做游戏也一样,我基本上每天都关注引擎的代码更新,遇到引擎 BUG 立马提交。通过这两三年的使用,我已经很熟悉这个引擎了,以后将一直使用这个引擎,更多的精力可以花在游戏本身了。


Switch

在 2020 年参加 WePlay 的时候,我去参加了一个任天堂关于独立游戏的线上讲座。当时他们的负责人就说 Switch 欢迎全世界的独立游戏开发者提交自己的游戏到他们的游戏商店中。后来有朋友就跟我说何不试试申请他们的开发机?于是我抱着试一试的心态在网上提交了申请,没想到最后还真申请到了。后来我开始研究怎么把 Godot 移植到 Switch 平台,移植成功后的优化等问题。等《千手英雄》完成后,我打算尝试发布到这个平台上。我想这也是机缘巧合下的一种收获吧。


继续前进

我的独立游戏之路还在继续,《千手英雄》这个游戏给我带来了不少收获,对于做什么怎么做等问题有了更明确的思路。新的一年将要开始,新的旅程也要展开了。感谢大家的关注,希望以后能有更多有趣的内容能跟大家分享,感谢观看,再会!

Image title



(转发自:原日志地址
从零开始学习并参加 Godot Game Jam 的快速指南
Bitca Games 2018-12-20

从零开始学习并参加 Godot Game Jam 的快速指南

引擎下载

Godot 完全开源免费,整体只有一个 50m 左右的执行文件,Windows,Mac,Linux 版本都有,可到官网 https://godotengine.org/ 下载。

项目目录组织方式

Godot 项目以目录作为单位,所有的代码/资源/插件都在这个目录里,可以进行整体的复制和移动。在项目管理器中可以导入/打开和新建项目,每个项目的根目录下都有一个 project.godot 文件,对应的就是菜单中的 Project Settings 里面设置的内容。



Image title


创建场景 Scene

场景 Scene 是 Godot 的基本资源组织方式,每个场景都是一棵节点树,场景可以层叠嵌套。



Image title


创建节点 Node

Node 节点是按照功能进行划分的游戏内物体,在场景面板中添加节点时会弹出一个树状结构的节点图,可以看出来,Godot 的节点系统是完全按照面向对象 OOP 方式进行设计的:



Image title


游戏窗口设置

菜单 -> Project -> Project Settings -> General (选项卡) -> Display (左侧目录) -> Window



Image title


编程

Godot 首推使用 GDScript,一种类 Python 的脚本语言,只需读完这个页面就可基本掌握: http://docs.godotengine.org/en/3.0/getting_started/scripting/gdscript/gdscript_basics.html

Godot 内置代码编辑器,在 Godot 内编写代码即可。

切换场景编辑和脚本编辑

在工具栏中有 4 个按钮可以进行编辑主视图的切换,快捷键对应 F1 ~ F4



Image title


为节点挂载脚本

在场景面板点击这个按钮可以为所选节点创建或者挂载一个脚本:



Image title


节点的两个重要函数

_ready 和 _proecces 一般来说你的代码会写在这两个重要的函数里,对应的分别是节点初始化完成后和每帧结束前,这两个函数都会被调用。



Image title


运行游戏

使用快捷键或者右上角的按钮:



Image title


F5 运行项目
F6 运行当前场景

资源的导入

将资源(比如 srpite sheet 图片)复制到项目目录即可,Godot会自行导入,如果要更改导入设置,点击相对应的文件后在 Import 面板进行修改。

活用搜索

面对大量的节点,文件,属性,Godot 在很多面板中都设置有搜索框,在这些搜索框中输入关键字可以快速的定位自己想要的内容:

添加节点面板



Image title


文件面板



Image title


属性面板



Image title


另外场景和脚本可以使用快捷键快速打开,这里可以进行快速的搜索:

CTRL + SHIFT + O 快速打开场景



Image title


CTRL + ALT + O 快速打开脚本



Image title


更多有用的中文社区资源

indienova 的 Godot-StartUP 小组 https://indienova.com/groups/309
,小组内有相关 Q 群。

最终参考

Godot 文档已经相当完备,包括新手指引,引擎介绍,API等都在这里了:http://docs.godotengine.org/


顺带附上 Godot Game Jam 地址 : https://itch.io/jam/godot-jam

(转发自:原日志地址
Godot 学习笔记 #02
Bitca Games 2018-12-17

Godot 学习笔记 #02

编辑器的使用

输入法问题

在现在的版本中,在使用中文输入法后,godot 会处在一种 ctrl 键被按下的状态(至少在 windows 平台下如此),这个时候需要按一次 ctrl 键来恢复正常的输入。

操作效率

参看 油管播主 GDQuest 的视频:
Fast Project Navigation Tips in Godot (beginner tutorial)
Make Sense of the Code Reference in Godot (beginner tutorial)

Debug

运行时切换到显示 Remote 的 Tree 和每个节点的属性

这是个不小发现,原来我总是需要打印出场景的树结构,其实运行时在这里可以切换到当前运行的树结构状态:

Image title

而且节点的每个属性都是可以查看和修改的!!!
变化是同步的:

Image title

节点与场景构造

注意场景 inherited 某个 scene 会对属性进行覆盖性调整

有时调整源 scene 的地方,要回头到 inherited scene 中查看是不是被覆盖的。

节点的 Modulate 与 Self Modulate 的区别

Image title

Modulate的 调整会影响子物体,而 Self Modulate 则不会。

脚本相关

GDScript 关于下划线

原来 add_child 可以用 addc... 来自动补完的,不需要输入下划线,排除了下划线对输入的影响,这样的话使用下划线的函数名就方便了

3.1 typing

https://godotengine.org/article/optional-typing-gdscript

现阶段 signal 函数的参数还没有 type hints

Editor Tool

各种资源类型也可以方便的在脚本中设置为编辑器参数:

Image title

export(Material) var output_material

Signal

在连接 signal 到函数时,一定要确保接收函数的参数数量跟事件的参数一致,否则可能无法触发,在 connect 时一定要查看 signal 的参数。

Image title

Image title

Image title

关于 _process 和 _physics_process

https://docs.godotengine.org/en/3.0/getting_started/step_by_step/scripting_continued.html

_process 的执行时间是在每次帧绘制完成后,可以使用 set_process() 来打开或者关闭,只要写了这个函数,默认是打开执行的。而 _physics_process 则是在物理引擎计算之前执行,而物理引擎的计算间隔是固定的,更新频率可以自行设定。

_draw()

https://docs.godotengine.org/en/3.0/tutorials/2d/custom_drawing_in_2d.html

_draw() 只会执行一次,画出来的内容会缓存并一直显示,如果需要更改,可以执行 update(),如果需要每帧执行,那么可以把 update 放到 _process 里

setget 没有触发?

如果在本脚本范围想要触发 setget,需要在变量面前加 self.

export var 的数值范围,参看:

http://docs.godotengine.org/en/latest/getting_started/scripting/gdscript/gdscript_basics.html#exports

# Allow integer values from 0 to 20.
export(int, 20) var i
# Allow integer values from -10 to 20.
export(int, -10, 20) var j
# Allow floats from -10 to 20, with a step of 0.2.
export(float, -10, 20, 0.2) var k
# Allow values y = exp(x) where y varies between 100 and 1000
# while snapping to steps of 20. The editor will present a
# slider for easily editing the value.
export(float, EXP, 100, 1000, 20) var l

场景转换

https://godotengine.org/qa/24773/how-to-load-and-change-scenes

Autoload

如果你设置一个场景(.tscn)为 singleton,那么这个场景上的脚本函数会因为这个 scene 没有 instance 而无法执行,所以应该设置一个 .gd 为 singleton,然后通过这个 .gd 来 preload 并 instance 一个 .tscn。

输入相关

关于 input

https://docs.godotengine.org/en/3.0/tutorials/inputs/inputevent.html

输入事件有个检查顺序,可以看文档中的图。

  1. 首先是节点上的 _input(ev),这个事件可以用 Node.set_process_input() 来禁用,如果需要不再往下传递,可以使用 SceneTree.set_input_as_handled()。
  2. 然后再到 GUI 各 control 的 Control._gui_input() ,可以通过 Control.accept_event() 停止往下传递。同时可以使用 Control.mouse_filter (参数界面上也有设置)来设置这个控件是否响应鼠标事件。
  3. 然后没有被“消费”的事件,轮到 unhandled input callback 来处理,所以游戏中的操作尽量选择这个来进行处理,特别是需要 GUI 阻断的。

更多详细描述可以看文档。

一个重要的事实:
当你的游戏输入使用 _unhandled_input 来处理鼠标,而且屏幕上覆盖有可见的控件时,鼠标事件会被阻断,这个时候你要设置 MouseFilter 为 MOUSE_FILTER_IGNORE。在使用全屏的控件根物体时,可选择这个选项。如果是一个面板,可以选择 pass ,这个会阻止鼠标事件传递到 _unhandled_input。

https://docs.godotengine.org/en/3.0/classes/class_control.html#enum-control-mousefilter

在节点上取得鼠标在世界中的坐标

    func _input(event):
        if event is InputEventMouseButton and event.pressed and event.button_index == 1:
            print("Mouse Click at: event.position", event.position)
            print("Mouse Click at: ", get_global_mouse_position())

材质和 Shader

Material 多个物体要使用同一个材质

多个物体要使用同一个材质,可以设置为 local to scene ,这样这个材质就单独在这个内在场景中实例化了。多个物体使用一个材质时不会互相影响。

Image title

visual shader

用 visual shader 的时候注意,默认的shader方式是3d的,2d的需要改这里
Mode : CanvasItem

Image title

图像相关

画面的缩放选项

最常规的 2D 像素缩放设置: Mode=2D,Aspect=keep

Image title

关于像素图片资源的设定

第一次打开 godot 3.1 记得将 Import 界面单独放到 Inspector 旁边,否则你有可能会忽略图片资源的导入设置,特别是像素图的 Filter 选项,有可能在视图中显示是不抗锯齿的,实际运行使用的还是 import 里面的配置。另外这里有 Preset 是可以直接设置为 2D Pixel 的。

在低像素分辨率下得到高清字体的方法

先设置字体到合适大小,比如 12,然后根据需要乘于倍数比如 12x4=48,然后将 scale 值设置为 1/4 也就是 0.25。那么比如你的画面分辨率是 480x270 , 1920x1080 的四分之一,那么实际渲染的字体效果在全高清下是不会看到锯齿的。

Image title

Image title

(转发自:原日志地址
Godot 学习笔记 #01
Bitca Games 2018-12-12

Godot 学习笔记 #01

程序部分

关于 _ready

在 _ready 中你可以访问完整的 tree,但是你不能更改 tree 的结构。当我想在 _ready 中把一个子物体移动到另外一个地方时,操作总是无法成功的。这个时候有两种方法:

  • 使用 call_deferred(函数名)
  • 使用 yield(get_tree(),"idle_frame")

相关阅读:
https://twitter.com/reduzio/status/966037750918057987
https://godotengine.org/qa/7336/what-are-the-semantics-of-call_deferred

Editor 相关

GDScript 脚本中只要加入 tool 关键字就会在编辑器中执行

包括子物体的 Visible 显示都可以在编辑器的界面中实时反馈了,要研究的是:

  • tool 所放置的位置有没有关系,之前的代码会不会在编辑器中运行
  • extend 的脚本跟 tool 的关系,(测试是可以运行的)

检测当前是否在 Editor 中运行,使用 Engine.editor_hint 检查

https://docs.godotengine.org/en/3.0/classes/class_engine.html?highlight=editor_hint

渲染相关

Viewport 内的 Node 无法使用移动工具

这个官方还没有解决:
https://github.com/godotengine/godot/issues/20619
https://github.com/godotengine/godot/issues/17739

viewport 中不显示子物体内容?

在使用 viewport 时一定要给一个 camera 配合这个 viewport(最近的一个),否则这个 viewport遇到别的摄影机时就会用别的摄影机.

实现 mask 的尝试

这里有 light mask 的演示 :https://www.youtube.com/watch?v=e5EUZGbrMRY

但是,新渲染引擎中这个功能失效了,需要等待下个版本修复:https://github.com/godotengine/godot/issues/8685

现在的效果是这样:

Image title

已经实现半透明 mask,问题是颜色被灯光叠加了

灯光相关设置为:

Image title

材质需要为 CanvasItemMaterial:

Image title

Light2D

会照亮相应的 Light Mask 层

Image title

CanvasModulate

Image title

这个节点会调整最近一个 viewport 的颜色,不过只要有 Light2D 存在就会失效

Image title

Image title

Outline Shader

https://github.com/steincodes/godot-shader-tutorials/blob/master/Shaders/outline.shader

这个 Shader 用来做人物高亮选择框,不过最好配合 Viewport 使用,在 Sprite 中使用这个 Viewport 作为贴图,然后再加 Shader 使用

Image title

两个数值这么调,正好是一个像素

Image title

UI 相关

UI想要不跟随摄影机移动?

添加一个 CanvasLayer 节点,把相关的 UI Node 放里面

Image title

CanvasLayer 上的 Node 受到了 2D 光照影响?

Image title

需要去掉 UI Node 的 Light Mask

Image title

Image title

打开 2D 光照后 CanvasLayer 下的文字渲染不出来?

Image title

把 Lyaer 调为 0,是什么机制现在还不清楚

Image title

(转发自:原日志地址

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册