ビデオゲーム制作のための実験的新技術 Core
(github.com/damn)-
coreCoreとは何か
- coreCoreは、Action-RPGゲーム制作ツール兼エンジンであり、プロパティエディタの形でビデオゲームを記述する実験的な方法である
- シンプルなコンポーネントシステムを使用し、コンポーネントは
[keyword value]形式のclojureベクタである - さまざまなエンティティはclojureマップで構成される
- ゲーム内の副作用は
[:tx/foo param]のようなコンポーネントで処理され、これはdatomicの構造に似ている - ゲーム全体の状態は
app/stateという1つのatomに保存され、エンティティもメインatom内部のatomとして存在する - アプリケーション全体の内容は
resources/properties.ednに保存され、malli-schemasを使って検証され、GUIで編集可能である
-
スクリーンショット
-
開発の始め方
- 次のコマンドを入力:
lein dev
- アプリケーションが起動し、次の作業も実行される:
- NREPLサーバーを起動
- アプリケーション終了時(メインメニューでESC)、clojure.tools.namespaceが変更されたファイルをリロードし、アプリを再起動する
- エラー発生時はJVMを再起動する必要はなく、エラーを修正して
dev-loop/restart!を呼び出せばよい - VIMでF5キーに次のコマンドをバインドして使用可能:
nmap <F5> :Eval (do (in-ns 'dev-loop)(restart!))
- 次のコマンドを入力:
-
コードライセンス
- MITライセンスの下で提供される
-
アセットライセンス
- 使用されているアセットは独占的なものであり、オープンソースではない
- タイルセット: https://winlu.itch.io/
- クリーチャー、アイテム、スキルアイコン、FXおよびその他のアセット: https://www.oryxdesignlab.com
- カーソル: Leonid Deburger https://deburger.itch.io/
- 使用されているアセットは独占的なものであり、オープンソースではない
GN⁺の要約
- coreCoreはAction-RPGゲームを簡単に制作できるツールで、シンプルなコンポーネントシステムを使ってゲーム状態を管理する
- ゲーム全体の状態を1つのatomに保存し、GUIを通じてプロパティを編集できるため、開発者にとって有用である
- MITライセンスで提供されるが、使用されているアセットは独占的である
- 類似の機能を持つツールとしては、RPG MakerやUnityなどがある
1件のコメント
Hacker Newsのコメント
すごい。ゲームをリリースしたことはないが、ゲーム開発に対する異なるアプローチを見るのはいつも好きだ
これまでのところ、Bevyは最初は良いが実装上の問題が多く、散らかりやすかったし、Unityはgameobjectとコンポジションベースのコンポーネント方式が最も実用的で、エンジンが邪魔をせずスパゲッティ化を避けやすかった
Godotは好きではなかった。オブジェクト指向のよくない階層構造、いまひとつな内蔵言語、そしてスパゲッティを減らそうとする“signals”がかえってそれを増やしていた。Pygameは小さなプロジェクトにはかなり良く、手続き型ベースの上にオブジェクト指向や関数型の層を自分で載せられる
Clojureは知らないが、典型的にはオブジェクト指向によく合いそうな分野で関数型実装を試みた点は興味深い
Godotのsignalsは、Unity組み込みクラスのモジュール性の欠如と比べれば大きな進歩だ。GodotとUnityは基本的に同じscene/node/componentモデルを持つが、Godotのほうがうまくやっていると思う
Unityの強みは3Dレンダラー、内蔵PhysX、C#向けil2cppバックエンド、プロファイラ、全体的な実行性能、コンソール対応だ。一方でGodotの設計はより一貫しており、Unityは2018年ごろから10方向に分裂したように感じる
今はC++の組み込み分野にいるのでオブジェクト指向をあまり使わないが、C#でプログラミングを学んだので継承には慣れている
Unityが優位な領域は“Triple I”と“Double A”級で、3D/性能機能、ツール、アドオンがより優れているからだ。AAAプロジェクトではどちらも最善ではない
2Dやシンプルな3Dゲームでは、もはやUnityを使う理由はないように見えるし、Godotがゆっくり追い越していき、Unityのシェアは着実に減っていく気がする
ノードやエディタに、バグなのか機能なのかわからないものがあるのが一番つらく、最初に“小さな”プロジェクト向けとして作られた感じが強い
そのためエディタはscene構成と大まかな階層設定以外ではほとんど使わない。普段のツールはEmacs+C# LSP、デバッグはVS Code、scene treeの調整はGodotエディタを使う
基本的にはPythonにslot/emitのセマンティクスを付けてエディタと統合した形なので、むしろ悪くない。ビルドシステム、メタデータ、外部設定ファイルで統合する複雑なやり方より、言語の中に入っているほうが良い
ゲーム開発を単純にできると言っておきながら、Clojure vectors、datomics、atoms、transactions、malli schemasのような専門用語を大量に投げ込んでいる。誰か説明してくれないか?
ゲーム要素と属性を単純なデータ構造で表現し、ゲーム全体の状態を1つのコンテナ(app/state)に保存して管理と更新をしやすくする
さらに、単一ファイル(resources/properties.edn)に保存されたゲームコンテンツを編集するGUIを提供し、非プログラマーでも扱いやすくし、Malliスキーマでデータ検証を行ってコンテンツの一貫性とエラー削減を狙っている
Clojure vectorは基本的にはリストに近い。atomは不変データ構造を指す変更可能な参照であり、特定の更新セマンティクスを持つポインタのようなものと見なせる
transactionはデータベーストランザクションに似ており、複数のデータ構造を同時に変更するが、すべての操作が成功したときだけコミットし、失敗した場合はロールバックまたは再試行する
Malli schemaは動的型付け言語で型検査を行う方法で、Datomicは不変データ構造ベースの非SQLデータベース実装であり、変更を破壊的に上書きせず追加のみを行うため、過去のどの時点にでも巻き戻して見られるようにする
このモデルを学ぶ最良の方法は、Clojureの生みの親であるRich Hickeyの講演「Are we there yet」を見ることだと思う
[1 2 3]のような形をしている私はこれを使って
[:tx/foo 3]のような副作用を構成し、これをDatomicにならってtransactionと呼んでいる。ここで:tx/fooはキーワードであり、コンポーネントの動作を一意に識別する正直に言って、このプロジェクトは実際には失敗したと思う。過剰設計された混乱で、明確な構造がない
最大の問題は、仕様がまったくないことだ。ゲームストーリーを作っていなかったか、あるいはゲームにストーリーは不要だと考えていたからだろう。だからただClojureでコードを書くのが楽しくて、夢中でコーディングしていた
面白いことを試みたのは良いし、多くの人が関心を持っている領域だ
ゲーム開発者としては、このGitHubは滑稽に感じる。ゲーム開発者が嫌う学術的な自己陶酔のパロディに近い。醜いスクリーンショットまであってまさに仕上げという感じ
こういう奇妙な学術的自己陶酔から生まれたゲームもいくつか思い浮かぶ。兄弟コメントのJonathan Blowもそうだし、このプロジェクトを見た瞬間にBraidを思い出した。
手続き的生成も昔は象牙の塔の話題だったし、3Dグラフィックスのあらゆる進歩も最初は学会から出てきた完全に非現実的な論文から始まった。今ではゲームで主流のものの多くが、かつてはニッチな学術アイデアだった
何をするものなのかを伝える基本段階で失敗している
退屈で最初から何も作らなかっただろうなら、むしろ得だ。インディー開発におけるJonathan BlowがJaiを使う論理に近い
このリポジトリはドキュメントがこれほど少ないのに、かなり議論が出ているのが意外だ。コードを見ると、ゲームエンジンというよりプロジェクトに近く見える。
property editorは興味深いが、この投稿は内容よりタイトルのおかげで支持されているように思える
いいね。私のようにClojureでゲーム開発をしている開発者を見るとうれしい。時々自分で仕事をもっと難しくしてしまうけれど :)
今はClojureで3DマルチプレイヤーTPSシューターを開発中。興味があればデモはこちら: https://prototype-game.pages.dev
近いうちに開発の道のりをまとめたブログ記事も公開する予定
Clojureは好きだけど、不変データ構造を使う関数型言語はビデオゲーム開発には少し変わった選択ではない?
関数型ゲーム開発に関連して気に入っている記事:
https://prog21.dadgum.com/228.html
https://prog21.dadgum.com/23.html
https://prog21.dadgum.com/24.html
https://prog21.dadgum.com/25.html
https://prog21.dadgum.com/26.html
あとはLispでほぼ何でもできる。Clojureの不変データ構造の扱い方と優れたprotocolシステム(https://www.freshcodeit.com/blog/clojure-protocols-and-the-e...)のおかげで、ゲーム全体を別々のコンポーネントに簡単に分けられた
ClojureはRubyやPythonより性能面の可能性が高く、どちらも商業インディーゲームで実際に使われたことがある
スタジオは当然ながらリスク回避的で、オブジェクト指向や、大規模な群衆にECSを使うといった慣れた戦略を好む。
個人的には関数型プログラミングは相性がいい可能性があると思うが、まずは実際のゲーム開発の問題を解くアーキテクチャを見つける必要がある。小さな実験から始めるべきで、ゲームジャムはそこにぴったりだ
Unreal Engine 4ベースで動くCoreという商用ゲーム制作プラットフォームはすでに存在する。
https://en.wikipedia.org/wiki/Core_(video_game)
名前の選び方を誤ったように思う。すでにこちらで使われている: https://www.coregames.com/create
「ゲームエンジンに費やした時間/複雑さ」と「できあがったゲームの複雑さ/面白さ」のデータを分析すると面白そうだ。
ゲーム開発者として、単純なテンプレート/エンジンシステムから生まれる新しいゲームの収益は、逓減する対数曲線になるだろうと予想する。
言い換えれば、クッキーを型抜きする機械を良くすればするほど、クッキーの多様性は減っていく