🦜

Goで3Dゲームエンジン「Lacking」を使う方法

2024/09/02に公開

「Lacking」とは

https://mokiat.com/lacking/
https://github.com/mokiat/lacking

  • ほぼPureGoによる3Dゲームエンジン
  • ECS(Entity-Component-System)ベース
  • Math、Physicsライブラリを内包
  • ほぼ同じコードでネイティブ(OpenGL/glfw)でもブラウザでも動作する
  • ネイティブオーディオ回りはmini-audio-library依存
  • ブラウザではWebGL2、WebAudioを利用している
  • 3Dモデルのフォーマットはglfxまたはglbのみサポート
  • 必要最低限の機能を抑えたつくり

サンプル

ラリーシミュレーターのデモ
https://mokiat.itch.io/rally-mka

フライトシミュレーターのデモ
https://mokiat.itch.io/dem-cows

キー早打ちによるシューティング
https://mokiat.itch.io/ai-suppression

基本的な使い方

プロジェクトのおこしかた

あらかじめ必要なもの

  • gcc,g++
  • go1.23
  • gonew
  • task

後者2つのインストール方法

go install golang.org/x/tools/cmd/gonew@latest
go install github.com/go-task/task/v3/cmd/task@latest

プロジェクトを起こす

gonew github.com/nobonobo/lacking-template@latest example.com/your/namespace projectdir
cd projectdir

ネイティブの実行方法

task pack
task run

これで以下のような画面が開く

ブラウザでの実行方法

task webpack
task wasm
task web # -> run http server on 127.0.0.1:8080

http://127.0.0.1:8080 を開くとほぼネイティブと同じ画面になる

フォルダ構成

├── LICENSE
├── README.md
├── Taskfile.yml
├── assets
│   ├── index.html
│   └── web
│       ├── favicon.png
│       ├── main.css
│       ├── main.js
│       ├── main.wasm
│       └── wasm_exec.js
├── cmd
│   ├── game
│   │   ├── app_cgo.go
│   │   ├── app_js.go
│   │   └── main.go
│   └── studio
│       └── main.go
├── content
├── go.mod
├── go.sum
├── internal
│   └── ui
│       ├── bootstrap.go
│       ├── model
│       └── view
└── resources
    ├── resources.go
    ├── ui
    │   └── images
    └── web
        ├── index.html
        ├── main.css
        ├── main.js
        └── wasm_exec.js

主なフォルダーと役割

  • cmd/: 実行ファイル用のコード置く場所
  • internal/: プロジェクトのコアロジックを置く場所
  • resources/: プロジェクトで利用するリソース群を置く場所
  • assets/: Webサーブ用の臨時静的ファイル置き場
  • Taskfile.yml: taskコマンド用タスク設定ファイル

何を作る?

まとめ

  • これまでに生まれたGo用3Dゲームエンジンは欲張って多機能化し停滞するパターンを繰り返しています
  • このLacking-Engineは3Dゲームエンジンとしては欲張らずにミニマムな作りを保っています
  • そのおかげで、少ない依存でGLまわり、オーディオ、物理エンジンなどをネイティブとWebの両方をサポートすることができています
  • こういう依存のシンプルさはGoにマッチしていて、このエンジンで書いたコードは多岐にわたる環境で容易に動かすことができます
  • ただ、まだ破壊的変更が入る場合もあるとのことなので要注意です

Discussion