lumino trail

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

開発状況 2019 #3

今月は主に、チュートリアルで使う2D物理演算とUIシステム、それと Vulkan 対応を進めていました。

Font

これまではフォントを使うときは必ずプログラムのどこかでフォントファイルを登録する必要がありましたが、 mplus フォントをビルトインフォントとして使わせていただくことにしました。

ただやっぱりファイルサイズが大きいので、ひとまず Lumino をライブラリ単体として使うときは ASCII サブセットのみの対応としておきます。 (lumino-cli を使ってデプロイするときは日本語ちゃんと使えるように Asset をくみ上げる予定)

Rendering

UI要素を描画するために必要な機能をいくつか追加しました。 特に、背景と枠。

Animation

プロパティアニメーションを実装しました。 ただ当初はチュートリアルで使おうと思っていましたが、多分直近では不要になりそうなのでちゃんとテスト書いて公開するのはちょっと先になります。

Physics

2D物理システムについて、レイキャストやコリジョンコールバックなど、ゲーム開発に最低限必要な機能を実装しました。 ドキュメントが全然足りてないのが最大の問題・・・。

Graphics

Windows では Vulkan がかなりいい感じに動くようになってきました。 次は macOS, Android あたりで対応したいけど、0.8.0 に向けての Vulkan 対応は Graphics モジュールのモダンAPI対応によるインパクトを見るのが主な目的なので、Windows 以外はもう少し先です。

今後について

Graphics モジュールの API がほぼ固まったので、0.8.0 リリースに向けて仕上げていきます。まぁ、主にユニットテストとドキュメントですが。

Vulkan をどうやって使ったかはどこかでブログ書いておきます。っていうか、残しておかないと自分が忘れる・・・。

開発状況 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 あたりはもうすぐ出せそうだし、テストしやすさにかかわってくるので先行して入れちゃいます。