From c89224aec1398025f63f82b7e2ac0bf15d183485 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 18:19:13 +0100 Subject: [PATCH] Add Unity GameObject playable world sink --- docs/eve-migration-roadmap.md | 11 +- docs/parity-testing-harness.md | 10 +- docs/world-state-lowering.md | 10 +- ...veUnityGameObjectPlayableWorldSceneSink.cs | 181 ++++++++++++++++++ .../eve-runtime-capability.json | 4 + .../eveunity-scene-split-handoff.json | 6 +- .../run-eveunity-scene-lifecycle-smoke.ps1 | 2 +- ...un-eveunity-scene-provider-shell-smoke.ps1 | 10 +- ...ntime-owner-conformance-consumer-smoke.ps1 | 1 + tools/parity/parity-manifest.json | 8 +- 10 files changed, 229 insertions(+), 14 deletions(-) create mode 100644 runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index e600ee7..1468542 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -617,11 +617,14 @@ Recently cut: `EveUnityPlayableWorldPresenter` now maps provider-authored entity rows and asset refs into scene sink operations, including removal of entities absent from later provider snapshots, without importing Aetheria entity/prefab - classes. The Unity client boundary is generic before it learns live transport. + classes. `EveUnityGameObjectPlayableWorldSceneSink` now provides the first + Unity-native sink body: generic `GameObject` creation/update/removal, + transform/radius application, entity markers, and a swappable asset-provider + hook. The Unity client boundary is generic before it learns live transport. The next blocker is the live generic Unity player loop: implement that - CultMesh/CultNet adapter, provide Unity `GameObject`/prefab-backed scene sink - and asset resolver implementations, and wait for provider receipts/next frames - rather than renderer-local simulation. + CultMesh/CultNet adapter, resolve provider assets through CultMesh/CultCache + manifests, and wait for provider receipts/next frames rather than + renderer-local simulation. - EveElectron capture lifecycle now carries the same kind of structured pending capture contract. `captureContract` names the Electron shell runtime, capture kind, PNG artifact pattern, conformance attachment point, required Aetheria diff --git a/docs/parity-testing-harness.md b/docs/parity-testing-harness.md index 91f3ff1..9015a11 100644 --- a/docs/parity-testing-harness.md +++ b/docs/parity-testing-harness.md @@ -487,9 +487,13 @@ types. It also declares `providerSurfaceSource` through runtime-owned port to implement. The runtime now also declares `playableWorldScenePresentation`: `EveUnityPlayableWorldPresenter` maps provider-authored entity rows and asset refs into scene sink operations while -removing entities absent from later provider snapshots. The remaining blocker is -that live adapter, Unity `GameObject`/prefab-backed scene sink and asset -resolver, and Unity screenshot or frame-capture PNG production from EveUnity. +removing entities absent from later provider snapshots. The runtime now also +declares `unityGameObjectSceneSink`: `EveUnityGameObjectPlayableWorldSceneSink` +creates or updates generic `GameObject` instances, attaches +`EveUnityPlayableWorldEntityMarker`, and resolves prefabs through a swappable +asset-provider hook. The remaining blocker is the live adapter, provider asset +resolution against CultMesh/CultCache manifests, and Unity screenshot or +frame-capture PNG production from EveUnity. Runtime capture probe coverage is exported as `runtimeCaptureProbeCoverage[]`. Each record joins runtime status, capture owner, lifecycle capture contract, diff --git a/docs/world-state-lowering.md b/docs/world-state-lowering.md index 571acaf..e23b852 100644 --- a/docs/world-state-lowering.md +++ b/docs/world-state-lowering.md @@ -167,14 +167,18 @@ while `IEveUnitySceneCommandSink` receives command envelopes. `EveUnityPlayableWorldPresenter` maps the provider-authored entity rows and asset refs into scene operations through `IEveUnityPlayableWorldSceneSink` and `IEveUnityPlayableWorldAssetResolver`, including removal of entities that -disappear from later provider snapshots. Aetheria-specific names appear only as +disappear from later provider snapshots. `EveUnityGameObjectPlayableWorldSceneSink` +is the first Unity-native implementation: it creates or updates generic +`GameObject` instances, applies transforms/radii, attaches an +`EveUnityPlayableWorldEntityMarker`, and resolves provider asset refs through an +`IEveUnityGameObjectAssetProvider` hook. Aetheria-specific names appear only as provider-authored data and command ids; the Unity client code does not import Aetheria runtime types, prefab classes, or apply movement locally. This is not yet the final playable client. The remaining cut is a live CultMesh/CultNet provider subscription adapter implementing those source/sink -ports, Unity `GameObject`/prefab-backed implementations of the scene sink and -asset resolver, and proof that daemon receipts drive the next frame rather than +ports, provider asset resolution against CultMesh/CultCache manifests, and proof +that daemon receipts drive the next rendered Unity frame rather than renderer-local state. ## Non-Goals diff --git a/runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs b/runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs new file mode 100644 index 0000000..8ecdae2 --- /dev/null +++ b/runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +#nullable enable + +namespace GameCult.Eve.UnityScene +{ + public interface IEveUnityGameObjectAssetProvider + { + GameObject? ResolvePrefab(EveUnityPlayableWorldAssetBinding asset); + } + + public sealed class EveUnityGameObjectPlayableWorldSceneSink : IEveUnityPlayableWorldSceneSink + { + private readonly Transform _root; + private readonly IEveUnityGameObjectAssetProvider _assetProvider; + private readonly Dictionary _instances = new Dictionary(StringComparer.Ordinal); + + public EveUnityGameObjectPlayableWorldSceneSink( + Transform root, + IEveUnityGameObjectAssetProvider assetProvider) + { + _root = root != null ? root : throw new ArgumentNullException(nameof(root)); + _assetProvider = assetProvider ?? throw new ArgumentNullException(nameof(assetProvider)); + } + + public int ActiveEntityCount => _instances.Count; + + public void ConfigureWorld(EveUnityPlayableWorldProjection world) + { + if (world == null) throw new ArgumentNullException(nameof(world)); + if (!string.IsNullOrWhiteSpace(world.WorldRootId)) + _root.name = world.WorldRootId; + } + + public void UpsertEntity(EveUnityPlayableWorldEntity entity, EveUnityPlayableWorldAssetBinding asset) + { + if (entity == null) throw new ArgumentNullException(nameof(entity)); + if (asset == null) throw new ArgumentNullException(nameof(asset)); + if (string.IsNullOrWhiteSpace(entity.EntityId)) + return; + + GameObject instance; + if (!_instances.TryGetValue(entity.EntityId, out instance) || instance == null) + { + instance = InstantiateEntity(entity, asset); + _instances[entity.EntityId] = instance; + } + else + { + var marker = instance.GetComponent(); + if (marker != null && !string.Equals(marker.AssetRef, asset.AssetRef, StringComparison.Ordinal)) + { + DestroyInstance(instance); + instance = InstantiateEntity(entity, asset); + _instances[entity.EntityId] = instance; + } + } + + ApplyEntity(instance, entity, asset); + } + + public void RemoveEntity(string entityId) + { + if (string.IsNullOrWhiteSpace(entityId)) + return; + + GameObject instance; + if (!_instances.TryGetValue(entityId, out instance)) + return; + + _instances.Remove(entityId); + if (instance != null) + DestroyInstance(instance); + } + + private GameObject InstantiateEntity(EveUnityPlayableWorldEntity entity, EveUnityPlayableWorldAssetBinding asset) + { + var prefab = _assetProvider.ResolvePrefab(asset); + var instance = prefab != null + ? UnityEngine.Object.Instantiate(prefab, _root) + : GameObject.CreatePrimitive(PrimitiveType.Capsule); + + if (instance.transform.parent != _root) + instance.transform.SetParent(_root, false); + + return instance; + } + + private static void ApplyEntity( + GameObject instance, + EveUnityPlayableWorldEntity entity, + EveUnityPlayableWorldAssetBinding asset) + { + instance.name = string.IsNullOrWhiteSpace(entity.Label) + ? entity.EntityId + : $"{entity.EntityId} ({entity.Label})"; + instance.transform.localPosition = new Vector3(entity.PositionX, entity.PositionY, entity.PositionZ); + instance.transform.localRotation = Quaternion.Euler(0f, entity.RotationY, 0f); + if (entity.Radius > 0f) + instance.transform.localScale = Vector3.one * entity.Radius; + + var marker = instance.GetComponent(); + if (marker == null) + marker = instance.AddComponent(); + + marker.Apply(entity, asset); + } + + private static void DestroyInstance(GameObject instance) + { + if (Application.isPlaying) + UnityEngine.Object.Destroy(instance); + else + UnityEngine.Object.DestroyImmediate(instance); + } + } + + public sealed class EveUnityResourcesAssetProvider : IEveUnityGameObjectAssetProvider + { + public GameObject? ResolvePrefab(EveUnityPlayableWorldAssetBinding asset) + { + if (asset == null) throw new ArgumentNullException(nameof(asset)); + var resourcesPath = NormalizeResourcesPath(asset.AssetRef); + return string.IsNullOrWhiteSpace(resourcesPath) + ? null + : Resources.Load(resourcesPath); + } + + private static string NormalizeResourcesPath(string assetRef) + { + if (string.IsNullOrWhiteSpace(assetRef)) + return ""; + + var path = assetRef.Trim(); + foreach (var prefix in new[] { "resources://", "resource://", "Resources/" }) + { + if (path.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + { + path = path.Substring(prefix.Length); + break; + } + } + + if (path.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase)) + path = path.Substring(0, path.Length - ".prefab".Length); + + return path; + } + } + + public sealed class EveUnityPlayableWorldEntityMarker : MonoBehaviour + { + public string EntityId = ""; + public string NodeId = ""; + public string EntityKind = ""; + public string Label = ""; + public string Faction = ""; + public string AssetRef = ""; + public string PresentationKind = ""; + public bool Selectable; + public bool Controllable; + + public void Apply(EveUnityPlayableWorldEntity entity, EveUnityPlayableWorldAssetBinding asset) + { + if (entity == null) throw new ArgumentNullException(nameof(entity)); + if (asset == null) throw new ArgumentNullException(nameof(asset)); + + EntityId = entity.EntityId; + NodeId = entity.NodeId; + EntityKind = entity.EntityKind; + Label = entity.Label; + Faction = entity.Faction; + AssetRef = asset.AssetRef; + PresentationKind = asset.PresentationKind; + Selectable = entity.Selectable; + Controllable = entity.Controllable; + } + } +} diff --git a/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json b/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json index 57ee493..2603a29 100644 --- a/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json +++ b/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json @@ -21,6 +21,7 @@ "sceneGraphProjection", "playableWorldProjection", "playableWorldScenePresentation", + "unityGameObjectSceneSink", "embeddedDocuments" ], "supportedPlugins": [ @@ -65,6 +66,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", @@ -114,6 +116,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", @@ -152,6 +155,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", diff --git a/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json b/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json index 76c4c57..bbadc2f 100644 --- a/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json +++ b/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json @@ -19,6 +19,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", @@ -38,6 +39,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes/incubating/eve-unity-scene/Tests/Editor/GameCult.Eve.UnityScene.Tests.asmdef", "tools/eveunity/eveunity-release-contract.mjs", "tools/eveunity/eveunity-release-contract.test.mjs", @@ -57,6 +59,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", @@ -64,7 +67,7 @@ "runtimes/incubating/eve-unity-scene/eve-runtime-capability.json" ], "destinationOwner": "EveUnity", - "replacementProof": "EveUnity claims the provider-advertised unity-scene lowering target with provider-agnostic playable-world projection, scene graph projection, provider snapshot session, playable-world scene presentation, and command boundary evidence; live transport and capture remain separate lifecycle proofs." + "replacementProof": "EveUnity claims the provider-advertised unity-scene lowering target with provider-agnostic playable-world projection, scene graph projection, provider snapshot session, playable-world scene presentation, Unity GameObject scene sink, and command boundary evidence; live transport and capture remain separate lifecycle proofs." }, { "id": "unity-scene-sai-plugin-projection", @@ -154,6 +157,7 @@ "EveUnity owns a provider-snapshot Unity scene client session that lowers Aetheria's surface and emits command intents without importing Aetheria project code.", "EveUnity owns provider surface source and command sink ports that a live CultMesh/CultNet adapter can implement without changing scene lowering.", "EveUnity owns a playable-world presenter that maps provider-authored entity rows and asset refs into Unity scene operations without importing Aetheria entity or prefab classes.", + "EveUnity owns a generic Unity GameObject scene sink and asset-provider hook for playable-world rows without importing Aetheria entity or prefab classes.", "EveUnity owns the provider-agnostic playable-world scene lowerer outside Eve incubation.", "EveUnity owns the Unity scene Sai projection adapter outside Eve incubation without importing Sai story state or VN/Ink internals.", "EveUnity owns the Unity scene Norn projection adapter outside Eve incubation without importing Norn implementation state.", diff --git a/scripts/run-eveunity-scene-lifecycle-smoke.ps1 b/scripts/run-eveunity-scene-lifecycle-smoke.ps1 index 0d019ea..910982f 100644 --- a/scripts/run-eveunity-scene-lifecycle-smoke.ps1 +++ b/scripts/run-eveunity-scene-lifecycle-smoke.ps1 @@ -39,7 +39,7 @@ if ($manifest.incubation.splitHandoff.manifestPath -ne "runtimes/incubating/eve- throw "EveUnity scene manifest missing split handoff path" } -foreach ($feature in @("providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "sceneGraphProjection", "playableWorldProjection", "playableWorldScenePresentation", "embeddedDocuments")) { +foreach ($feature in @("providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "sceneGraphProjection", "playableWorldProjection", "playableWorldScenePresentation", "unityGameObjectSceneSink", "embeddedDocuments")) { if (-not (@($manifest.supportedFeatures) -contains $feature)) { throw "EveUnity scene manifest missing provider-shell feature: $feature" } diff --git a/scripts/run-eveunity-scene-provider-shell-smoke.ps1 b/scripts/run-eveunity-scene-provider-shell-smoke.ps1 index 02eba8a..9b98359 100644 --- a/scripts/run-eveunity-scene-provider-shell-smoke.ps1 +++ b/scripts/run-eveunity-scene-provider-shell-smoke.ps1 @@ -54,7 +54,7 @@ foreach ($evidencePath in @($worldSurfaceLoweringClaim.evidencePaths)) { } } -foreach ($feature in @("providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "sceneGraphProjection", "playableWorldProjection", "playableWorldScenePresentation")) { +foreach ($feature in @("providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "sceneGraphProjection", "playableWorldProjection", "playableWorldScenePresentation", "unityGameObjectSceneSink")) { if (-not (@($manifest.supportedFeatures) -contains $feature)) { throw "EveUnity scene provider shell missing supported feature: $feature" } @@ -67,6 +67,7 @@ $expectedFiles = @( "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneClientSession.cs", "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneProviderConnection.cs", "runtimes\incubating\eve-unity-scene\Runtime\EveUnityPlayableWorldPresenter.cs", + "runtimes\incubating\eve-unity-scene\Runtime\EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes\incubating\eve-unity-scene\Runtime\SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes\incubating\eve-unity-scene\Runtime\NornGraphUnitySceneProjectionAdapter.cs", "runtimes\incubating\eve-unity-scene\Runtime\TeXMathUnitySceneProjectionAdapter.cs", @@ -109,6 +110,13 @@ foreach ($symbol in @("IEveUnityPlayableWorldSceneSink", "IEveUnityPlayableWorld } } +$gameObjectSceneSinkSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-unity-scene\Runtime\EveUnityGameObjectPlayableWorldSceneSink.cs") -Raw +foreach ($symbol in @("EveUnityGameObjectPlayableWorldSceneSink", "IEveUnityGameObjectAssetProvider", "EveUnityResourcesAssetProvider", "EveUnityPlayableWorldEntityMarker", "GameObject", "Transform", "Resources.Load", "PrimitiveType.Capsule", "DestroyImmediate", "localPosition", "localRotation")) { + if (-not $gameObjectSceneSinkSource.Contains($symbol)) { + throw "EveUnity GameObject playable world scene sink missing symbol: $symbol" + } +} + $saiAdapterSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-unity-scene\Runtime\SaiVisualNovelUnitySceneProjectionAdapter.cs") -Raw foreach ($symbol in @("SaiVisualNovelUnitySceneProjectionAdapter", "sai.vn", "vn.stage", "story.choose", "story.continue", "story.jump", "gamecult.eve.plugin_abi.v1", "sidecar-advertised-plugin-abi", "Sai")) { if (-not $saiAdapterSource.Contains($symbol)) { diff --git a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 index 997c236..8e38580 100644 --- a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 +++ b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 @@ -69,6 +69,7 @@ node $consumerScript $consumerExport ` --expect-runtime-feature unity-scene:sceneGraphProjection ` --expect-runtime-feature unity-scene:playableWorldProjection ` --expect-runtime-feature unity-scene:playableWorldScenePresentation ` + --expect-runtime-feature unity-scene:unityGameObjectSceneSink ` --expect-runtime-feature electron-shell:providerAdvertisements ` --expect-runtime-feature electron-shell:commandTransport ` --expect-runtime-feature electron-shell:surfaceTreeProjection ` diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index cf91ed4..d2dc132 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -1040,7 +1040,7 @@ "splitHandoffPath": "runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json", "requiredFixtures": ["aetheria-world", "eve-world-smoke"], "pluginFixtures": ["sai-vn"], - "supportedFeatures": ["providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "sceneGraphProjection", "playableWorldProjection", "playableWorldScenePresentation", "embeddedDocuments"], + "supportedFeatures": ["providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "sceneGraphProjection", "playableWorldProjection", "playableWorldScenePresentation", "unityGameObjectSceneSink", "embeddedDocuments"], "supportedPlugins": [ { "pluginId": "sai.vn", @@ -1071,6 +1071,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", @@ -1087,6 +1088,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", @@ -1126,6 +1128,10 @@ "path": "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldPresenter.cs", "contains": ["IEveUnityPlayableWorldSceneSink", "IEveUnityPlayableWorldAssetResolver", "EveUnityPlayableWorldPresenter", "EveUnityPlayableWorldAssetBinding", "EveUnityPlayableWorldPresentation", "EveUnityAssetRefResolver", "ConfigureWorld", "UpsertEntity", "RemoveEntity", "provider-asset-ref", "unity-generated-placeholder"] }, + { + "path": "runtimes/incubating/eve-unity-scene/Runtime/EveUnityGameObjectPlayableWorldSceneSink.cs", + "contains": ["EveUnityGameObjectPlayableWorldSceneSink", "IEveUnityGameObjectAssetProvider", "EveUnityResourcesAssetProvider", "EveUnityPlayableWorldEntityMarker", "GameObject", "Transform", "Resources.Load", "PrimitiveType.Capsule", "DestroyImmediate", "localPosition", "localRotation"] + }, { "path": "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "contains": ["SaiVisualNovelUnitySceneProjectionAdapter", "sai.vn", "vn.stage", "story.choose", "story.continue", "story.jump", "gamecult.eve.plugin_abi.v1", "sidecar-advertised-plugin-abi", "Sai"]