lumino trail

ゲームエンジン作ってます。Github:https://github.com/lriki/Lumino Twitter:https://twitter.com/lriki8

開発状況 2019 #2

ようやくといいますか、やっとといいますか、チュートリアルを書き始めました。 Lumino 全体を浅く触りながら、2D のアクションゲームを作るものです。

実際に書いてみるとゲームエンジンとしてちょっと足りてないところが出てきたので、今月のコミットはいろいろなところに手が入っています。

Audio

0.4.0 以降、とりあえず音鳴ったわーいで止まってたものを、ちゃんと BGM と SE 同時再生できるようにしたり、キャッシュを実装して効率よくたくさんの SE ならせるようにしたりしてました。

新しい Audio システムは WebAudio ライクなノードベースで柔軟にエフェクト掛けられるすごいやつですが、このへんの API をちゃんと決めてテストできるのはまだ先になりそうです。

Physics

Box2D を組み込んで、2D シーン用の高速な物理演算システムを作りました。

Unity などのゲームエンジンと Box2D では API にかなり差がありますが、Lumino は 3D と同じく Unity 寄りに実装してあります。なので、単なる薄いラッパーではないです。

UI

画面に文字を表示するための UITextBlock を実装しました。使い方は WPF の TextBlock をイメージしています。

というより、Lumino の UI モジュールは全体的に WPF をイメージしたスタイリングやレイアウトシステムとなっています。

Animation

プロパティアニメーションを実装途中です。スキンメッシュアニメーションと同じようなインターフェイスでオブジェクトのプロパティを変更できるようになります。

とりいそぎ、チュートリアルでのスプライトアニメーションで使う予定です。

Graphics

UITextBlock の実装のため、スプライトベースのテキストレンダリングを実装しました。0.4.0 以降はとりあえずテクスチャへのBlitだけで実装していましたが、これからはリアルタイムに描画できるようになります。

あと、Vulkan を引き続き組み込み中です。一応次の 0.8.0 は Graphics モジュールを固めて出す予定なので、100% ではなくてもせめて公開 API へのインパクトの有無くらいはつかめるくらいには入れておきたいです。

今後について

チュートリアル完成と Vulkan 組み込みが二大柱です。 次の 0.8.0 はこの 2 つを目標にリリース予定です。

開発状況 2019 #1

いつのまにか、このブログを始めてから2年経ってました。 コードはすごく変わりましたが、機能的にはほとんど進みが無いように思います。 リファクタリングやりすぎ案件の事例です。

v0.7.0 リリース

こっそりしてました。

ただ、HLSL シェーダをいろいろなターゲット向けにトランスパイルする機能を仕上げただけなので、これだけで何かできるってわけではありません。なのでこっそり。

Graphics

Vulkan の対応を進めています。

これまではずっとレガシーDirectXOpenGLでした。

しかし、次の 0.8.0 で fix したい Graphics 機能のために、少なくともモダングラフィックス API の「クセ」みたいなものをちゃんと知った上で実装しないと また大きな作り直しをしそうなので、ここで対応することにしました。

Mesh

ふと、丁度一年くらい前に作っていたボクセルモデルの自動生成をまた進めたくなったので 3D 周りに手を入れ出しました。 ただ Vulkan 対応がすごく重かったので、こっちはとりあえず .obj と .pmx を読めるようにしただけです。

今後について

Vulkan がんばります。

開発状況 2018 #12

リポジトリの Readme で「実際にゲームを作りながら」と言ってますが、ぼちぼちゲームを作るための機能がそろってきたので制作を始めました。

と言っても何年も前にプロト公開した作品のエンジン部分を乗せ換える作業がメインです。

あとはコミットログを遡って、今月やったことを思い出してみます。

Audio

Sound クラスと GameAudio クラスを実装しました。 基本的な使い方は 0.4.0 のものと変わりませんが、内部実装は Web Audio ライクなノードベースのサウンドシステムの上に作られています。 ので、今後はエコーやノイズなどのエフェクトを適用できるようなインターフェイスを追加する予定です。

あと、Ogg vorbis ファイルを再生できるようにしました。

Graphics

Texture2D クラスに、

  • 単色塗りつぶし (clear)
  • 他のテクスチャからのビットマップ転送 (blit)
  • 文字列描画 (drawText)

を追加しました。 プログラム内での簡易的なテクスチャ編集に使います。

Tilemap

2D ゲームのマップなどでよく使われる機能です。 ロードマップ にはありませんが、ちょっと2Dなゲームを作りたい気持ちが出てきり、↑で制作中のゲームで必要になってきたりしたので実装中です。

ImageEffect

いわゆるポストエフェクトです。Unity の ImageEffect と同じです。 今回は2つ作りました。↑の動画でも使っています。

ToneImageEffect は画面全体の色調を調整します。セピア調のイメージを作ったり、フェードイン・フェードアウトの演出に使用できます。

ScreenBlurImageEffect は前回フレームの描画内容を重ね合わせる単純な方法で画面全体のブラーを表現します。

Scene

主にデバッグ用に、マウスでカメラを操作するための CameraOrbitControlComponent を実装しました。

これは Camera オブジェクトにアタッチして使う Component です。以下のようにするだけでぐりぐりできます。

Engine::mainCamera()->addComponent(CameraOrbitControlComponent::create());

Physics

bullet ライブラリをビルドシステムに追加しました。 とりあえず PhysicsWorld を作れるようにしただけで、まだ何もできません。

Shader

実際に本番環境で動かすと出てくるバグからはどうしても逃げられないようで、 あとはドキュメントだけで次のバージョン出せるぞ!とか思っていたら、↑で制作中のゲームで問題が出てきました。 バグっていうか単純な検討不足だったんだけど・・・。

とりあえずこんな↓対策にしました。

今後について

Shader モジュールに対してちょっと変則的な実装を加えたので、1月一杯くらいは様子見です。

他はゲーム作りつつ実装を続けていきます。

開発状況 2018 #11

次verではシェーダコンパイラの対応を行う予定ですが、相変わらず別モジュールの実装に浮気中です。

といっても fix できたものも無いので、コミットログをざっとさかのぼります。

Sprite

2D イメージを表示するためのアレです。

0.4.0 では配置する座標空間が異なる Sprite2D, Sprite3D がありましたが、 それぞれ

  • Sprite2D → UISprite
  • Sprite3D → Sprite

となりました。

2D 系は基本的に UI モジュールに押し込める感じで、ほかにもサフィックスとして 2D,3D とついていたものは同じように変更されます。

ImageEffect

適用先が増えました。

  • Camera
  • OffscreenRenderTarget
  • Window 全体
  • UIサブツリー

いろいろなところにエフェクト掛けられるようになります。

Archive

画像や音声など、配布するリソースファイルを1つのファイルにパックするアレです。

抽出防止のために暗号化掛けますが、以前のものはライセンスのソースがなんかパッとしなかったので zlib を参考に書き直しました。

ちなみに zip 圧縮も掛けようとしましたが、よく調べてみるとランダムアクセスが困難だったので、圧縮はやめました。

Audio

0.4.0 で公開していた Sound クラスとバックエンド (XAudio, OpenAL など) の間に、Web Audio ライクなノードベースのシステムを作りました。

これでかなり細かくサウンドエフェクトの適用個所を制御できるようになります。エミッタ個別でノイズ掛けたり、シーン全体にエコー掛けたり。

0.7.0 (Shader) について

前回の内容で、各プラットフォームの動作確認中です。 あとは

  • macOSiOS で動作確認
  • テンプレートプロジェクトの修正
  • ドキュメント更新

あたりかな。

開発状況 2018 #10

0.6.0 をリリースしました

Documentation: https://lriki.github.io/lumino/articles/documents/GettingStarted/getting-started.html

コマンドラインツールでプロジェクトを作成し、各プラットフォームでバックバッファをクリアするまでです。

※テクスチャのクラスとかも入ってたりしますが、これらはまだテストされていません。

これでひとまずクロスプラットフォーム対応を謳えるようになった気がしますが、できることはほとんどないのでまだそんなに面白くはないです。

このリリースは今後の開発のベースラインとして、本当にスタートラインに立つための動作保証を行ったものとなります。これでいろいろ安心して開発を進められるはず・・・。

Azure Pipelines を使いました

ターゲットプラットフォームも増え、フルビルドの時間も馬鹿にならなくなってきたので、毎回 5 ターゲットをテストするのはとても大変です。

ということで、ようやく CI を導入しました。リポジトリの Readme にバッジが載ります。

0.7.0 (Shader) 実装中

次はシェーダのトランスコンパイラです。

以前の記事に書いた通り、HLSL で記述されたシェーダを SPIR-V 経由でいろいろ変換します。

変換は lumino-cli コマンドから行います。

lumino-cli fxc shader.fx -o shader.cfx

プログラムからは Shader クラスの create 関数を使います。

auto shader = ln::Shader::create("shader.cfx");

こんなイメージです。

開発状況 2018 #9

0.6.0 はプロジェクト作成の自動化と各プラットフォームでウィンドウ出して画面クリアまでが目標ですが、ぼちぼち形になってきました。

lumino-cli コマンドによるプロジェクト作成

こんなコマンドを打ちます。

$ lumino-cli HelloLumino

次のようなフォルダとファイルができます。

  • Assets フォルダ
  • Sources フォルダ
  • Projects フォルダ
  • Engine フォルダ
  • HelloLumino.lnproj
  • LuminoApp.sln

Assets フォルダ

音声や画像などのファイルを入れておくフォルダです。 デプロイ時にまとめてアーカイブ化して配布パッケージに含まれます。

Sources フォルダ

.cpp などのソースファイルを置いておくフォルダです。

Projects フォルダ

各ターゲットプラットフォームごとのプロジェクトファイルが入っているフォルダです。

中はさらに次のように分かれています。

  • LuminoApp.Android
  • LuminoApp.Html5
  • LuminoApp.iOS
  • LuminoApp.macOS
  • LuminoApp.Win32

例えば、LuminoApp.iOS と LuminoApp.macOS の中には xcode のプロジェクトファイル、LuminoApp.Win32 の中には VisualStudio のプロジェクトが入っています。

Engine フォルダ

Lumino のライブラリがまるごと入っています。

ビルド済みライブラリ or Luminoのソース一式(Cocos2d-x方式) は選べるようにする予定です。 プロジェクトごとに使うLuminoのバージョンを変えたり、Lumino自体をカスタマイズするような使い方を想定しています。

git などでバージョン管理するべきフォルダではないので、クローンし直しとかしたあとは $ lumino-cli restore コマンドで Engine フォルダを復元します。

HelloLumino.lnproj と LuminoApp.sln ファイル

HelloLumino.lnproj は lumino-cli が使う情報を保存しておくためのファイルです。

LuminoApp.sln は、メインの開発環境は VisualStudio を想定しているのでサッサとプロジェクト開きたいときにダブルクリックする用です。(後でよく考える)

今後について

結局 Unity や Cocos2d-x と似たフォルダ構成になりそうです。 最初はもっと違ったのですが、特に AndroidiOS あたりの開発環境の制約を受けてこんな感じになりました。仕様変更の回数がえげつないです。

えげつなさで痛めたメンタルを癒すのに他のモジュールをいじってたので、他もそこそこ進んでたりします。 Input あたりはもうすぐ出せそうだし、テストしやすさにかかわってくるので先行して入れちゃいます。

開発状況 2018 #8

クロスプラットフォーム対応が重いです。 ネイティブ Linux は見送るかも・・・。

プロジェクトの作成について

以前は Visual Studio にプロジェクトテンプレートを登録していましたが、新しくコマンドラインからプロジェクトを作れるようにしています。

create-react-app や vue-cli のようなイメージです。

後々、プロジェクト作成だけじゃなくてリリースやパッケージ作成もコマンドひとつでできるようにしたいところ。

Shader について

先月の記事にも書きましたが、プラットフォーム問わず HLSL で書けるように詰めています。

Windows, macOS, Emscripten は多分OK。これからモバイル系を検証していきます。

Audio モジュールについて

お盆明けくらいに突然 "音" が恋しくなったので、対応予定verはかなり先ですが先行して実装していました。

ハイレベルAPIは従来の Sound クラスや GameAudio クラスなどから変える予定はありませんが、ローレベルAPIとして WebAudio に似たオーディオグラフを自由に構築できるようにしています。 これで自由度の高いエフェクトの適用を狙っています。

特定の SE にだけエコーやリバーブをかけたり、逆にシーン全体や BGM にだけかけたり、いろいろできる・・・はず。

バックエンドは DirectSound, OpenAL, SDL あたり。 Emscripten でも動作確認済み。

ちなみに XAudio2 はやめようと思います。やめることでDirectXランタイムのインストールが不要になるので、エンドユーザーに面倒かけずに済む。かも。