Skip to content

kta0718/UnitySample

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UnitySample

UnitySampleは、Unity向けの拡張機能やサンプルコードを集約したプロジェクトです。

構成アセット

  • SyncAsyncFSM - 同期・非同期を統合管理するステートマシン(Finite State Machine)
  • MaterialPropertyApplier - マテリアルプロパティをゲームオブジェクトごとに変更するためのエディタ拡張

SyncAsyncFSM

SyncAsyncFSM<TOwner>は、同期処理SyncState非同期処理AsyncStateを同一フレームワークで管理できる汎用ステートマシンです。ゲームオブジェクトの状態遷移や、状態に応じた非同期イベント管理に適しています。

デモシーン

Assets/Scenes/FsmDemo.unity

特徴

  • SyncState(同期)とAsyncState(非同期)の明確な区別
  • 条件付き遷移(ゲート関数によるフィルタリング)
  • 任意遷移AnyStateや直前復帰PreviousStateをサポート
  • 遷移予約Scheduleと即時遷移Dispatchの両対応
  • UniTaskに対応Cysharp.Threading.Tasks

使い方

  1. FSMの初期化・起動・更新

FSMを所有するクラスMyOwnerを型引数に持つFSMSyncAsyncFSM<MyOwner>を宣言します。

public class MyOwner : Monobehavior
{
    private SyncAsyncFSM<MyOwner> fsm;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        // 初期化
        // 所有者のインスタンスを引数に渡す
        fsm = new SyncAsyncFSM<MyOwner>(this);

        // 2.ここで遷移登録

        // 起動
        // はじめのステートを型引数に渡す
        fsm.Start<IdleState>();
    }

    // Update is called once per frame
    void Update()
    {
        // 更新
        fsm.Update();
    }

    // 3.ここからステートを定義
}
  1. 遷移登録

各ステートはそれぞれ遷移テーブルを持っており、イベントIDint,遷移先Type,遷移条件Func<bool>を追加することで遷移を登録します。

💡 登録した順に遷移が優先されます。
💡 任意遷移を登録するにはTFromSyncAsyncState<MyOwner>.AnyStateを指定します。
💡 直前復帰を登録するにはTToSyncAsyncState<MyOwner>.PreviousStateを指定します。

// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
    // 1.初期化

    // 遷移登録
    fsm.AddTransition<IdleState, EntryState>(1);
    fsm.AddTransition<EntryState, ExploreState>(2);
    fsm.AddTransition<ExploreState, DiscoverState>(3);
    fsm.AddTransitionRange<DiscoverState>(
        (4, typeof(ExploreState), () => treasureCount < 3),
        (5, typeof(IdleState), () => true));
    fsm.AddTransition<SyncAsyncFSM<MyOwner>.AnyState, MenuState>(6, () => fsm.CurrentState.GetType() != typeof(MenuState));
    fsm.AddTransition<MenuState, SyncAsyncFSM<DungeonRunner>.PreviousState>(7);

    // 1.起動
}
void AddTransition<TFrom, TTo>(int eventId, Func<bool> gate);

指定されたイベントIDを契機として、TFromからTToへの遷移を登録します。遷移には条件(ゲート)を付随できます。

void AddTransition<TFrom, TTo>(int eventId);

常に有効な遷移(ゲートなし)を登録する簡易版。

void AddTransition<TFrom>(params (int eventId, Type toType, Func<bool> gate)[] to);

遷移元ステートTFromに対し、複数の遷移先を一括で登録できます。各遷移には条件を指定可能です。

void AddTransition<TFrom>(params (int eventId, Type toType, Func<bool> gate)[] to);

条件なしで複数の遷移を一括登録する簡易版。

  1. ステートを定義

同期ステートを定義するにはSyncAsyncFSM<MyOwner>.SyncStateを継承させる必要があります

public class IdleState : SyncAsyncFSM<MyOwner>.SyncState
{
    // このステートに遷移直後に一度呼ばれる
    public override void Enter()
    {
        
    }

    public override void Update()
    {
        // 状態ロジック
    }

    // 他のステートへ遷移直前に一度呼ばれる
    public override void Exit()
    {
        
    }
}

非同期ステートを定義するにはSyncAsyncFSM<MyOwner>.AsyncStateを継承させる必要があります

public class EntryState : SyncAsyncFSM<MyOwner>.AsyncState
{
    public override async UniTask Start(Cancellation token)
    {
        // 状態ロジック
    }

    // このステートが終了する前に他のステートへ遷移するときや、このFSMを所有するクラスが破棄されたときに呼ばれる
    public override void OnCancel()
    {

    }
}
MyOwner Owner;

ステートクラス内でもOwnerのインスタンスを取得できます。

  1. 遷移の予約・実行
void Schedule(int eventId);

現在のステートの遷移テーブルに指定されたイベントIDが登録されていればその遷移が予約されます。

void ScheduleAll();

現在のステートに登録されている遷移をすべて予約します。

void Dispatch();

予約されている遷移の中から優先度順(登録された順)で遷移条件を満たせば遷移が実行されます。実行されなかった予約済みの遷移は破棄されます。

void Dispatch(int eventId);

予約済みの遷移を破棄して指定されたイベントIDの遷移を遷移条件を満たせば実行します。

MaterialPropertyApplier

MaterialPropertyApplierはマテリアルプロパティ(IntFloatFloatArrayTextureColor)をMaterialPropertyBlockを通して動的に変更するためのエディタ拡張です。

デモシーン

Assets/Scenes/MpaDemo.unity

特徴

  • MaterialPropertyBlockを使うことでマテリアルのインスタンスを作成することなくゲームオブジェクトごとに変更
  • エディタ上で変更・確認が可能

使い方

  1. GameObjectにアタッチ

任意のGameObjectにMaterialPropertyApplierコンポーネントをアタッチします。

  1. Inspectorでプロパティ設定

Inspector上で以下のようなプロパティを設定できます:

  • 名前(Shader内のプロパティ名)
  • 種類(IntFloatFloatArrayTextureColor
  • 値(選んだ種類に応じて変化)

💡 MaterialPropertyBlock を使うため、Rendererを持つGameObjectにのみ有効です。
💡 プロパティの名前を知るにはシェーダーのソースコードを確認する必要があります。(慣習的に_で始まる場合が多い。)

Properties
{
    _Color ("Color", Color) = (1,1,1,1)
    _MainTex ("Albedo", 2D) = "white" {}
}
  1. 手動で一括適用

Unityのメニューから、登録された全オブジェクトにプロパティを一括適用できます:

MyTools > MaterialPropertyApplier.Apply

適用を解除することもできます:

MyTools > MaterialPropertyApplier.Clear

💡 Playモード終了時には適用したプロパティは解除されます。(これはMaterialPropertyBlockの特性によるものです。)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published