ゲームのプログラミング

このページは自動翻訳されており、誤りが含まれる場合があります。誤りを見つけた場合は「このページを編集」リンクからご協力ください。

最初のコンポーネント

プロジェクトの Assets/ フォルダー内の任意の場所に .cs ファイルを作ります — 例えば Assets/Scripts/Rotator.cs:

namespace Usercode;

public class Rotator : Component
{
    /// <summary>毎秒の回転角(度)。</summary>
    public float speed = 90f;

    public override void OnUpdate(float deltaTime) =>
        Node!.Transform.SetRotationY(Node.Transform.Rotation.Y + speed * deltaTime);
}

ファイルを保存すると、Studio が変更を検知してバックグラウンドでスクリプトを再コンパイルし、切り替えます。コンパイルエラーは Output パネルに表示されます。次にノードを選び、Inspector の Add Component をクリックして Rotator を選ぶか、Assets パネルからスクリプトをノードへドラッグします。

Studio はスクリプトを初めてコンパイルするとき、隣に Rotator.cs.meta を書き込みます。このファイルにはシーンがコンポーネントを見つけるための id が入っているので、スクリプトと一緒に置き、一緒にコミットしてください。

目安:

  • 1 ファイルに 1 つのコンポーネントクラス、ファイル名と同じ名前にします。
  • スクリプトは .NET 10 の通常の C# です。あらゆる言語機能と基本クラスライブラリが使えます。
  • 新規プロジェクトには Assets/Globals.cs があり、その global using 行で、エンジン(Turian.Engine.Core、Turian.Engine.UI)、属性(Turian)、System.Numerics、ログ、入力のキーコードがすべてのスクリプトで使えます。自由に編集してください。
  • Output パネルとコンソールへの出力には Log.Logger(Microsoft.Extensions.Logging のロガー)を使います。

ライフサイクルのコールバック

必要なものだけオーバーライドします:

コールバック 呼ばれるとき
OnAwake() コンポーネントが初めてアタッチされたとき、一度だけ — 非アクティブでも。
OnEnable() コンポーネントがアクティブになったとき(アクティブなら OnAwake の直後にも)。
OnStart() 最初のフレームで一度、最初の OnUpdate の前に。
OnUpdate(float deltaTime) アクティブな間、毎フレーム。deltaTime は秒。
OnLateUpdate(float deltaTime) 毎フレーム、すべての OnUpdate の後。
OnFixedUpdate(float fixedDeltaTime) 固定の時間間隔で。
OnDisable() コンポーネントが非アクティブになったとき。
OnDestroy() コンポーネントが削除されたか、ノードが破棄されたとき。

全体像は コンポーネント を参照してください。

例:FPS カウンター

public class FpsCounter : Component
{
    float elapsed;
    int frames;

    public override void OnUpdate(float deltaTime)
    {
        elapsed += deltaTime;
        frames++;
        if (elapsed < 1f) return;

        Log.Logger.LogInformation("FPS: {Fps:F1}", frames / elapsed);
        elapsed = 0f;
        frames = 0;
    }
}

Inspector での値の編集

public なフィールドと setter のあるプロパティは Inspector のコントロールになり、シーンにノードごとに保存されます:

型 Inspector のコントロール
bool チェックボックス
整数、float、double、decimal 数値フィールド — ラベルをドラッグして調整
string テキストフィールド
列挙型 ドロップダウン
Vector2、Vector3、Vector4 軸ごとのフィールド
List<T> サイズ変更できるリスト
入れ子のクラスと構造体 折りたたみグループ
AssetReference<T> アセットスロット — Assets パネルからアセットをドロップ
NodeRef<Node>、ComponentRef<T> シーンスロット — Scene Tree からノードをドロップ

属性で表示を調整できます:

public class Patrol : Component
{
    [Range(0, 20)] public float speed = 2.5f;          // 範囲内に制限された編集
    public ComponentRef<CameraComponent>? watcher;      // カメラのノードをここにドロップ
    public AssetReference<Prefab>? loot;                // .prefab をここにドロップ
    [ReadOnly] public int visits;                       // 表示のみ、編集不可
    [Hide] public float internalTimer;          // public だが非表示

    [Button]                                             // Inspector にボタンとして表示
    public void ResetVisits() => visits = 0;
}

private なフィールドは [Show] を付けない限り非表示です。シーン参照のフィールドは対象ノードの id を保存します。実際のオブジェクトを得るには Resolve(ルート) を呼びます:

var root = Node!;
while (root.Parent is not null) root = root.Parent;
var camera = watcher?.Resolve(root);

次のステップ

  • 入力 — キーボード、マウス、ゲームパッド、アクションマップ。
  • シーン — シーンの読み込みと切り替え。
  • ゲーム UI — .ui ドキュメントによるメニューと HUD。

← すべてのドキュメント このページを編集