From bc5021f49466484a95890b14211c297cee724d46 Mon Sep 17 00:00:00 2001 From: papacoder Date: Sun, 16 Nov 2025 17:29:27 +0900 Subject: [PATCH] fix: register scratch event threads via manager --- Docs/VS_Scratch_Mapping.md | 8 ++++---- .../VisualScripting/Units/ScratchUnits/CloneUnits.cs | 9 ++++++--- .../VisualScripting/Units/ScratchUnits/GreenFlagUnits.cs | 9 ++++++--- .../Units/ScratchUnits/InputEventUnits.cs | 9 ++++++--- .../VisualScripting/Units/ScratchUnits/MessagingUnits.cs | 9 ++++++--- .../Units/ScratchUnits/ScratchUnitUtil.cs | 4 ---- 6 files changed, 28 insertions(+), 20 deletions(-) diff --git a/Docs/VS_Scratch_Mapping.md b/Docs/VS_Scratch_Mapping.md index 45dac6c..b4093ee 100644 --- a/Docs/VS_Scratch_Mapping.md +++ b/Docs/VS_Scratch_Mapping.md @@ -61,7 +61,7 @@ Scratch ブロックと FUnity 独自 Visual Scripting Unit の対応関係で | ○秒待つ | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.WaitSecondsUnit | ○秒待つ | FUnity/Scratch/制御 | 指定時間待機。Scratch スレッド登録で停止ブロックと連動。定義: Runtime/.../WaitSecondsUnit.cs | | 自分のクローンを作る | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.CreateCloneOfSelfUnit | 自分のクローンを作る | FUnity/Scratch/制御 | 自身を複製。定義: Runtime/.../CloneUnits.cs | | ○のクローンを作る | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.CreateCloneOfDisplayNameUnit | ○のクローンを作る | FUnity/Scratch/制御 | 指定俳優を複製。定義: Runtime/.../CloneUnits.cs | -| クローンされたとき | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.WhenIStartAsCloneUnit | クローンされたとき | Events/FUnity/Scratch/制御 | クローン生成時に発火する Scratch スクリプトの入口。イベント内でコルーチン開始直後に `ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine)` を呼び出す。定義: Runtime/.../CloneUnits.cs | +| クローンされたとき | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.WhenIStartAsCloneUnit | クローンされたとき | Events/FUnity/Scratch/制御 | クローン生成時に発火する Scratch スクリプトの入口。`FUnityScriptThreadManager` 経由でコルーチンを開始し、直後に `ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine)` を呼び出す。定義: Runtime/.../CloneUnits.cs | | このクローンを削除する | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.DeleteThisCloneUnit | このクローンを削除する | FUnity/Scratch/制御 | クローンを破棄。定義: Runtime/.../CloneUnits.cs | | すべてを止める | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.StopAllUnit | Scratch/すべてを止める | FUnity/Scratch/制御 | Scratch 用スレッドテーブル経由で全スレッド停止。定義: Runtime/.../StopControlUnits.cs | | このスクリプトを止める | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.StopThisScriptUnit | Scratch/このスクリプトを止める | FUnity/Scratch/制御 | 現在の Scratch スレッドのみ停止。定義: Runtime/.../StopControlUnits.cs | @@ -81,11 +81,11 @@ Scratch ブロックと FUnity 独自 Visual Scripting Unit の対応関係で ## イベント | Scratch ブロック (日本語) | FUnity Unit クラス | UnitTitle | UnitCategory | 備考 | | --- | --- | --- | --- | --- | -| 緑の旗が押されたとき | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.WhenGreenFlagClickedUnit | 緑の旗が押されたとき | Events/FUnity/Scratch/イベント | Runner 対象の緑の旗イベント。ScriptMachine.nest.macro を優先し、未設定時は machine.graph を入口としてフローを発火。発火時に `ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine)` を呼び出し、Scratch スレッドを登録する。定義: Runtime/.../GreenFlagUnits.cs | -| ○キーが押されたとき | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.OnKeyPressedUnit | ○キーが押されたとき | Events/FUnity/Scratch/イベント | 押下エッジで発火する Scratch スクリプトの入口。イベント内でコルーチン開始直後に `ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine)` を呼び出す。定義: Runtime/.../InputEventUnits.cs | +| 緑の旗が押されたとき | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.WhenGreenFlagClickedUnit | 緑の旗が押されたとき | Events/FUnity/Scratch/イベント | Runner 対象の緑の旗イベント。`FUnityScriptThreadManager` 経由でコルーチンを開始し、`ScriptMachine.nest.macro` を入口としてフローを発火する。発火時に `ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine)` を呼び出し、Scratch スレッドを登録する。定義: Runtime/.../GreenFlagUnits.cs | +| ○キーが押されたとき | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.OnKeyPressedUnit | ○キーが押されたとき | Events/FUnity/Scratch/イベント | 押下エッジで発火する Scratch スクリプトの入口。`FUnityScriptThreadManager` 経由でコルーチンを開始し、開始直後に `ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine)` を呼び出す。定義: Runtime/.../InputEventUnits.cs | | メッセージを送る | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.BroadcastMessageUnit | メッセージを送る | FUnity/Scratch/イベント | 即時配信。定義: Runtime/.../MessagingUnits.cs | | メッセージを送って待つ | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.BroadcastAndWaitUnit | メッセージを送って待つ | FUnity/Scratch/イベント | 同期配信後に継続。定義: Runtime/.../MessagingUnits.cs | -| メッセージを受け取ったとき | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.WhenIReceiveMessageUnit | メッセージを受け取ったとき | Events/FUnity/Scratch/イベント | フィルタ一致時に発火する Scratch スクリプトの入口。イベント内でコルーチン開始直後に `ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine)` を呼び出す。定義: Runtime/.../MessagingUnits.cs | +| メッセージを受け取ったとき | FUnity.Runtime.Integrations.VisualScripting.Units.ScratchUnits.WhenIReceiveMessageUnit | メッセージを受け取ったとき | Events/FUnity/Scratch/イベント | フィルタ一致時に発火する Scratch スクリプトの入口。`FUnityScriptThreadManager` 経由でコルーチンを開始し、開始直後に `ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine)` を呼び出す。定義: Runtime/.../MessagingUnits.cs | ## 調べる | Scratch ブロック (日本語) | FUnity Unit クラス | UnitTitle | UnitCategory | 備考 | diff --git a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/CloneUnits.cs b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/CloneUnits.cs index e22d01c..e4545a5 100644 --- a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/CloneUnits.cs +++ b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/CloneUnits.cs @@ -169,10 +169,13 @@ protected override bool ShouldTrigger(Flow flow, CloneEventArgs args) /// クローンイベント引数。 private void TriggerWithThreadRegistration(GraphReference reference, CloneEventArgs args) { - var flow = Flow.New(reference); - var coroutine = flow.StartCoroutine(RunEventCoroutine(flow, args)); + using (var flow = Flow.New(reference)) + { + var routine = RunEventCoroutine(flow, args); + var coroutine = FUnityScriptThreadManager.Instance.StartCoroutine(routine); - ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine); + ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine); + } } /// diff --git a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/GreenFlagUnits.cs b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/GreenFlagUnits.cs index 7c70bf3..baf644e 100644 --- a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/GreenFlagUnits.cs +++ b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/GreenFlagUnits.cs @@ -64,10 +64,13 @@ protected override bool ShouldTrigger(Flow flow, EmptyEventArgs args) /// 空のイベント引数。 private void TriggerWithThreadRegistration(GraphReference reference, EmptyEventArgs args) { - var flow = Flow.New(reference); - var coroutine = flow.StartCoroutine(RunEventCoroutine(flow, args)); + using (var flow = Flow.New(reference)) + { + var routine = RunEventCoroutine(flow, args); + var coroutine = FUnityScriptThreadManager.Instance.StartCoroutine(routine); - ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine); + ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine); + } } /// diff --git a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/InputEventUnits.cs b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/InputEventUnits.cs index cd06e0c..8cb032e 100644 --- a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/InputEventUnits.cs +++ b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/InputEventUnits.cs @@ -91,10 +91,13 @@ protected override bool ShouldTrigger(Flow flow, EmptyEventArgs args) /// 空のイベント引数。 private void TriggerWithThreadRegistration(GraphReference reference, EmptyEventArgs args) { - var flow = Flow.New(reference); - var coroutine = flow.StartCoroutine(RunEventCoroutine(flow, args)); + using (var flow = Flow.New(reference)) + { + var routine = RunEventCoroutine(flow, args); + var coroutine = FUnityScriptThreadManager.Instance.StartCoroutine(routine); - ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine); + ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine); + } } /// diff --git a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/MessagingUnits.cs b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/MessagingUnits.cs index c525727..49ff8e3 100644 --- a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/MessagingUnits.cs +++ b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/MessagingUnits.cs @@ -202,10 +202,13 @@ protected override bool ShouldTrigger(Flow flow, MessagingCommon.Args args) /// 受信したメッセージ引数。 private void TriggerWithThreadRegistration(GraphReference reference, MessagingCommon.Args args) { - var flow = Flow.New(reference); - var coroutine = flow.StartCoroutine(RunEventCoroutine(flow, args)); + using (var flow = Flow.New(reference)) + { + var routine = RunEventCoroutine(flow, args); + var coroutine = FUnityScriptThreadManager.Instance.StartCoroutine(routine); - ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine); + ScratchUnitUtil.EnsureScratchThreadRegistered(flow, coroutine); + } } /// diff --git a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/ScratchUnitUtil.cs b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/ScratchUnitUtil.cs index bbc6bdd..7ace437 100644 --- a/Runtime/Integrations/VisualScripting/Units/ScratchUnits/ScratchUnitUtil.cs +++ b/Runtime/Integrations/VisualScripting/Units/ScratchUnits/ScratchUnitUtil.cs @@ -302,10 +302,6 @@ public static string EnsureScratchThreadRegistered( if (flow.stack?.machine is ScriptMachine machine) { graph = machine.nest?.macro as ScriptGraphAsset; - if (graph == null) - { - graph = machine.graph as ScriptGraphAsset; - } } return EnsureScratchThreadRegistered(flow, adapter, graph, coroutine);