0Pricing
Lua Academy · レッスン

コンポーネントベースのスクリプト

Luaで、振る舞いのコンポーネントを持つテーブルとしてゲームエンティティを設計します。

「コンポーネントベースのスクリプト」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

コンポーネントベース設計とは

深いクラス階層の代わりに、エンティティをコンポーネント(データと振る舞いを持つ、小さく目的を絞ったテーブル)で構成します。エンティティはコンポーネントの集合にすぎません。

テーブルとしてのエンティティ

エンティティは、idとcomponentsサブテーブルを持つテーブルです。コンポーネントは実行時に追加・削除できます。

local function newEntity(id)
  return {id = id, components = {}}
end
local player = newEntity(1)

コンポーネントの追加

コンポーネントテーブルに名前付きのキーを設定して、コンポーネントをアタッチします。

player.components.position = {x=0, y=0}
player.components.health   = {hp=100, max=100}
player.components.sprite   = {image="player.png", scale=1}

システムによるコンポーネント処理

システムは、必要なコンポーネント一式を持つすべてのエンティティを処理します。システムはエンティティを反復処理し、コンポーネントのデータを更新します。

local function moveSystem(entities, dt)
  for _, e in ipairs(entities) do
    local pos = e.components.position
    local vel = e.components.velocity
    if pos and vel then
      pos.x = pos.x + vel.dx * dt
      pos.y = pos.y + vel.dy * dt
    end
  end
end

コンポーネントスクリプト

Luaの関数をコンポーネントの振る舞いとしてアタッチします。これはエンティティごとにスクリプトを持たせる簡単な方法です。

player.components.ai = {
  update = function(self, entity, dt)
    -- move towards target
  end
}

コンポーネントレジストリ

レジストリはコンポーネント型の名前をファクトリ関数にマッピングします。これにより、名前を指定してコンポーネントを作成できます(たとえば、レベルファイルから作成できます)。

local registry = {}
function registry.register(name, factory)
  registry[name] = factory
end
function registry.create(name, ...)
  return registry[name](...)
end

コンポーネントの削除

コンポーネントをnilに設定すると削除できます。その後、そのコンポーネントを必要とするシステムからエンティティは無視されます。

player.components.health = nil  -- entity is "dead"

Worldとエンティティマネージャー

Worldオブジェクトはすべてのエンティティとシステムを保持し、各ティックでシステムを反復処理し、エンティティ検索APIを提供します。

コンポーネントによるエンティティ検索

指定されたすべてのコンポーネントを持つエンティティをすべて返す検索関数を用意します。

local function query(world, ...)
  local required = {...}
  local result = {}
  for _, e in ipairs(world.entities) do
    local ok = true
    for _, comp in ipairs(required) do
      if not e.components[comp] then ok = false; break end
    end
    if ok then result[#result+1] = e end
  end
  return result
end

プレハブ

プレハブはコンポーネントのテンプレートテーブルです。テンプレートをディープコピーして、プレハブから新しいエンティティをインスタンス化します。

継承に対する利点

  • 深い階層がありません。
  • 実行時に振る舞いを組み合わせられます。
  • 機能を簡単に追加・削除できます。
  • 設定ファイルを基にデータ駆動で構成できます。

コンポーネント設計の質問

コンポーネントベース設計では、Systemは何をしますか。

復習:コンポーネントベーススクリプティング

エンティティはコンポーネントのテーブルです。システムは必要なコンポーネントを持つエンティティを処理します。この疎結合でデータ駆動のアーキテクチャは、深い継承階層より柔軟であり、Luaにも自然に適しています。

よくある質問

「コンポーネントベースのスクリプト」レッスンは無料ですか?

はい。「コンポーネントベースのスクリプト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「コンポーネントベースのスクリプト」で何を学びますか?

Luaで、振る舞いのコンポーネントを持つテーブルとしてゲームエンティティを設計します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「コンポーネントベースのスクリプト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Luaのイベントシステム
  2. コンポーネントベースのスクリプト
  3. ステートマシンによるAIの振る舞い
  4. データ駆動型設定とホットリロード
← Lua Academyに戻る