├── .gitignore
├── Assembly-CSharp.csproj
├── Assets
├── ReactiveDots.meta
├── ReactiveDots
│ ├── CHANGELOG.md
│ ├── CHANGELOG.md.meta
│ ├── ReactiveDots.dll
│ ├── ReactiveDots.dll.meta
│ ├── Scripts.meta
│ ├── Scripts
│ │ ├── Events.meta
│ │ ├── Events
│ │ │ ├── DefaultEventSystem.cs
│ │ │ ├── DefaultEventSystem.cs.meta
│ │ │ ├── EventType.cs
│ │ │ ├── EventType.cs.meta
│ │ │ ├── ReactiveEventAttribute.cs
│ │ │ ├── ReactiveEventAttribute.cs.meta
│ │ │ ├── ReactiveEventForAttribute.cs
│ │ │ ├── ReactiveEventForAttribute.cs.meta
│ │ │ ├── ReactiveEventSystemAttribute.cs
│ │ │ └── ReactiveEventSystemAttribute.cs.meta
│ │ ├── ReactiveDotsScriptsAssembly.asmdef
│ │ ├── ReactiveDotsScriptsAssembly.asmdef.meta
│ │ ├── ReactiveSystems.meta
│ │ ├── ReactiveSystems
│ │ │ ├── ComponentReactiveData.cs
│ │ │ ├── ComponentReactiveData.cs.meta
│ │ │ ├── ReactiveEntityTag.cs
│ │ │ ├── ReactiveEntityTag.cs.meta
│ │ │ ├── ReactiveSystemAttribute.cs
│ │ │ └── ReactiveSystemAttribute.cs.meta
│ │ ├── Utils.meta
│ │ └── Utils
│ │ │ ├── BooleanSimplifier.cs
│ │ │ ├── BooleanSimplifier.cs.meta
│ │ │ ├── InitWithAttribute.cs
│ │ │ └── InitWithAttribute.cs.meta
│ ├── Tests.meta
│ └── Tests
│ │ ├── BasicEventSystemTests.cs
│ │ ├── BasicEventSystemTests.cs.meta
│ │ ├── BasicReactiveSystemTests.cs
│ │ ├── BasicReactiveSystemTests.cs.meta
│ │ ├── BasicReactiveSystemWithEntityManagerTests.cs
│ │ ├── BasicReactiveSystemWithEntityManagerTests.cs.meta
│ │ ├── BasicReactiveSystemWithExternalEcbTests.cs
│ │ ├── BasicReactiveSystemWithExternalEcbTests.cs.meta
│ │ ├── CrossAssembliesReactiveSystemTests.cs
│ │ ├── CrossAssembliesReactiveSystemTests.cs.meta
│ │ ├── EnableableComponentReactiveSystemTests.cs
│ │ ├── EnableableComponentReactiveSystemTests.cs.meta
│ │ ├── ForComponentEventSystemTests.cs
│ │ ├── ForComponentEventSystemTests.cs.meta
│ │ ├── MultiReactiveSystemTests.cs
│ │ ├── MultiReactiveSystemTests.cs.meta
│ │ ├── ReactiveDots.Tests.asmdef
│ │ ├── ReactiveDots.Tests.asmdef.meta
│ │ ├── SecondTestAssembly.meta
│ │ ├── SecondTestAssembly
│ │ ├── OtherAssemblyTestComponent.cs
│ │ ├── OtherAssemblyTestComponent.cs.meta
│ │ ├── OtherAssemblyTestEventComponent.cs
│ │ ├── OtherAssemblyTestEventComponent.cs.meta
│ │ ├── ReactiveDots.Tests.SecondAssembly.asmdef
│ │ └── ReactiveDots.Tests.SecondAssembly.asmdef.meta
│ │ ├── TagComponentReactiveSystemTests.cs
│ │ ├── TagComponentReactiveSystemTests.cs.meta
│ │ ├── TestBase.cs
│ │ └── TestBase.cs.meta
├── Sample.meta
├── Sample
│ ├── Materials.meta
│ ├── Materials
│ │ ├── Arena.mat
│ │ ├── Arena.mat.meta
│ │ ├── Ball.mat
│ │ └── Ball.mat.meta
│ ├── Prefabs.meta
│ ├── Prefabs
│ │ ├── Ball.prefab
│ │ └── Ball.prefab.meta
│ ├── Scenes.meta
│ ├── Scenes
│ │ ├── SampleScene.meta
│ │ ├── SampleScene.unity
│ │ ├── SampleScene.unity.meta
│ │ └── SampleScene
│ │ │ ├── SampleScene_SubScene.unity
│ │ │ └── SampleScene_SubScene.unity.meta
│ ├── Scripts.meta
│ ├── Scripts
│ │ ├── Authoring.meta
│ │ ├── Authoring
│ │ │ ├── ArenaAuthoring.cs
│ │ │ ├── ArenaAuthoring.cs.meta
│ │ │ ├── BallAuthoring.cs
│ │ │ └── BallAuthoring.cs.meta
│ │ ├── Components.meta
│ │ ├── Components
│ │ │ ├── Arena.cs
│ │ │ ├── Arena.cs.meta
│ │ │ ├── Ball.cs
│ │ │ ├── Ball.cs.meta
│ │ │ ├── Bounces.cs
│ │ │ ├── Bounces.cs.meta
│ │ │ ├── MoveDirection.cs
│ │ │ ├── MoveDirection.cs.meta
│ │ │ ├── ReactiveComponentStateChangeRequest.cs
│ │ │ ├── ReactiveComponentStateChangeRequest.cs.meta
│ │ │ ├── Speed.cs
│ │ │ └── Speed.cs.meta
│ │ ├── Listeners.meta
│ │ ├── Listeners
│ │ │ ├── BouncesListener.cs
│ │ │ ├── BouncesListener.cs.meta
│ │ │ ├── SpeedListener.cs
│ │ │ └── SpeedListener.cs.meta
│ │ ├── Systems.meta
│ │ ├── Systems
│ │ │ ├── BallInitSystem.cs
│ │ │ ├── BallInitSystem.cs.meta
│ │ │ ├── BallMovementSystem.cs
│ │ │ ├── BallMovementSystem.cs.meta
│ │ │ ├── BounceCountSystem.cs
│ │ │ ├── BounceCountSystem.cs.meta
│ │ │ ├── CustomEventSystem.cs
│ │ │ ├── CustomEventSystem.cs.meta
│ │ │ ├── ReactiveComponentEnableableStateChangeSystem.cs
│ │ │ └── ReactiveComponentEnableableStateChangeSystem.cs.meta
│ │ ├── Views.meta
│ │ └── Views
│ │ │ ├── UiManager.cs
│ │ │ └── UiManager.cs.meta
│ ├── UniversalRenderPipelineAsset.asset
│ ├── UniversalRenderPipelineAsset.asset.meta
│ ├── UniversalRenderPipelineAsset_Renderer.asset
│ └── UniversalRenderPipelineAsset_Renderer.asset.meta
├── SceneDependencyCache.meta
├── SceneDependencyCache
│ ├── 95073d28cdb5319dcd180fba5272fc04.sceneWithBuildSettings
│ ├── 95073d28cdb5319dcd180fba5272fc04.sceneWithBuildSettings.meta
│ ├── 9f093bd59a522979f4b40bb81c6d6151.sceneWithBuildSettings
│ └── 9f093bd59a522979f4b40bb81c6d6151.sceneWithBuildSettings.meta
├── UniversalRenderPipelineGlobalSettings.asset
└── UniversalRenderPipelineGlobalSettings.asset.meta
├── Packages
├── manifest.json
└── packages-lock.json
├── PolymorphicStructs.csproj
├── ProjectSettings
├── AudioManager.asset
├── ClusterInputManager.asset
├── DynamicsManager.asset
├── EditorBuildSettings.asset
├── EditorSettings.asset
├── GraphicsSettings.asset
├── InputManager.asset
├── MemorySettings.asset
├── NavMeshAreas.asset
├── PackageManagerSettings.asset
├── Physics2DSettings.asset
├── PresetManager.asset
├── ProjectSettings.asset
├── ProjectVersion.txt
├── QualitySettings.asset
├── SceneTemplateSettings.json
├── ShaderGraphSettings.asset
├── TagManager.asset
├── TimeManager.asset
├── URPProjectSettings.asset
├── UnityConnectSettings.asset
├── VFXManager.asset
├── VersionControlSettings.asset
└── XRSettings.asset
├── README.md
├── ReactiveDots.Tests.SecondAssembly.csproj
├── ReactiveDots.Tests.csproj
├── ReactiveDots.sln
├── ReactiveDotsPlugin
├── .gitignore
├── EventSystems
│ ├── EventComponentInfo.cs
│ ├── EventSystemGenerator.cs
│ ├── EventSystemInfo.cs
│ ├── EventSystemSyntaxReceiver.cs
│ ├── EventSystemTemplates.cs
│ └── EventType.cs
├── GeneratorUtils.cs
├── ReactiveSystems
│ ├── ReactiveSystemAttributeInfo.cs
│ ├── ReactiveSystemGenerator.cs
│ ├── ReactiveSystemInfo.cs
│ ├── ReactiveSystemSyntaxReceiver.cs
│ └── ReactiveSystemTemplates.cs
└── SourceGeneratorBase.cs
├── ReactiveDotsScriptsAssembly.csproj
└── Tests.csproj
/.gitignore:
--------------------------------------------------------------------------------
1 | # This .gitignore file should be placed at the root of your Unity project directory
2 | #
3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore
4 | #
5 | /[Ll]ibrary/
6 | /[Tt]emp/
7 | /[Oo]bj/
8 | /[Bb]uild/
9 | /[Bb]uilds/
10 | /[Ll]ogs/
11 | /[Mm]emoryCaptures/
12 |
13 | # Asset meta data should only be ignored when the corresponding asset is also ignored
14 | !/[Aa]ssets/**/*.meta
15 |
16 | # Uncomment this line if you wish to ignore the asset store tools plugin
17 | # /[Aa]ssets/AssetStoreTools*
18 |
19 | # Autogenerated Jetbrains Rider plugin
20 | [Aa]ssets/Plugins/Editor/JetBrains*
21 |
22 | # Visual Studio cache directory
23 | .vs/
24 |
25 | # Gradle cache directory
26 | .gradle/
27 |
28 | # Autogenerated VS/MD/Consulo solution and project files
29 | ExportedObj/
30 | .consulo/
31 | *.unityproj
32 | *.suo
33 | *.tmp
34 | *.user
35 | *.userprefs
36 | *.pidb
37 | *.booproj
38 | *.svd
39 | *.pdb
40 | *.mdb
41 | *.opendb
42 | *.VC.db
43 |
44 | # Unity3D generated meta files
45 | *.pidb.meta
46 | *.pdb.meta
47 | *.mdb.meta
48 |
49 | # Unity3D generated file on crash reports
50 | sysinfo.txt
51 |
52 | # Builds
53 | *.apk
54 | *.unitypackage
55 |
56 | # Crashlytics generated file
57 | crashlytics-build.properties
58 |
59 | # Rider
60 | .idea/
61 |
62 | UserSettings/
63 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 00b1c20b0715a1541b8f25dde79a9482
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # ReactiveDots changelog
2 |
3 | ## v0.3.0
4 | 05 Nov 2022
5 |
6 | This update focuses on adding support for a new Entities version and component types (tags and enableable).
7 |
8 | - Updated Entities supported version to 1.0.0-exp.12.
9 | - `ReactiveSystemAttribute` no longer derives from `AlwaysUpdateSystemAttribute`.
10 | - Added support for enableable components.
11 | - Enabling and disabling components triggers .Added and .Removed state updates.
12 | - Reactive components are now removed from entities only when they are destroyed.
13 | - Added support for tag component.
14 | - Added support for multiple fields to compare when checking if component has changed.
15 | - Added `ReactiveEntityTag` component which is added to all entities with reactive components.
16 | - Added new tests for new features and updated existing ones.
17 | - Updated internal jobs and reactive system update methods.
18 | - Updated template strings replacement code in source generators.
19 |
20 | ## v0.2.0-preview.1
21 | 23 Jun 2022
22 |
23 | This update focuses on removing sync points from reactive systems.
24 |
25 | - Added new methods for updating reactive systems.
26 | - Added new tests.
27 | - Updated sample project with some improvements.
28 | - Other minor fixes and improvements.
29 |
30 | ## v0.1.0-preview.1
31 | 19 Jun 2022
32 |
33 | Initial version with:
34 |
35 | - source generators
36 | - reactive systems
37 | - any event listeners
38 | - unit tests
39 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/CHANGELOG.md.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d79dc8bd939d11244aaa7a017fd5c6e6
3 | TextScriptImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/ReactiveDots.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PanMadzior/ReactiveDots/b8b41ae7021426a943b089339c1771c18e573c8f/Assets/ReactiveDots/ReactiveDots.dll
--------------------------------------------------------------------------------
/Assets/ReactiveDots/ReactiveDots.dll.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 6369a79d9c583c0448cc690850e184af
3 | labels:
4 | - RoslynAnalyzer
5 | - SourceGenerator
6 | PluginImporter:
7 | externalObjects: {}
8 | serializedVersion: 2
9 | iconMap: {}
10 | executionOrder: {}
11 | defineConstraints: []
12 | isPreloaded: 0
13 | isOverridable: 0
14 | isExplicitlyReferenced: 1
15 | validateReferences: 0
16 | platformData:
17 | - first:
18 | : Any
19 | second:
20 | enabled: 0
21 | settings:
22 | Exclude Editor: 1
23 | Exclude Linux64: 1
24 | Exclude OSXUniversal: 1
25 | Exclude Win: 1
26 | Exclude Win64: 1
27 | - first:
28 | Any:
29 | second:
30 | enabled: 0
31 | settings: {}
32 | - first:
33 | Editor: Editor
34 | second:
35 | enabled: 0
36 | settings:
37 | CPU: AnyCPU
38 | DefaultValueInitialized: true
39 | OS: AnyOS
40 | - first:
41 | Standalone: Linux64
42 | second:
43 | enabled: 0
44 | settings:
45 | CPU: None
46 | - first:
47 | Standalone: OSXUniversal
48 | second:
49 | enabled: 0
50 | settings:
51 | CPU: None
52 | - first:
53 | Standalone: Win
54 | second:
55 | enabled: 0
56 | settings:
57 | CPU: None
58 | - first:
59 | Standalone: Win64
60 | second:
61 | enabled: 0
62 | settings:
63 | CPU: None
64 | - first:
65 | Windows Store Apps: WindowsStoreApps
66 | second:
67 | enabled: 0
68 | settings:
69 | CPU: AnyCPU
70 | userData:
71 | assetBundleName:
72 | assetBundleVariant:
73 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 965287d5c2cdb3646a1cf0bdc6d67604
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: eaaafa4eac874c8996afb875550bb7b2
3 | timeCreated: 1655241753
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/DefaultEventSystem.cs:
--------------------------------------------------------------------------------
1 | using Unity.Collections;
2 | using Unity.Entities;
3 |
4 | namespace ReactiveDots
5 | {
6 | ///
7 | /// System which handles event changes by default.
8 | ///
9 | [UpdateInGroup( typeof(LateSimulationSystemGroup) )]
10 | [ReactiveEventSystem]
11 | public partial class DefaultEventSystem : SystemBase
12 | {
13 | protected override void OnCreate()
14 | {
15 | base.OnCreate();
16 | InitWithAttribute.InvokeInitMethodsFor( this );
17 | }
18 |
19 | protected override void OnUpdate()
20 | {
21 | var ecbForAdded = new EntityCommandBuffer( Allocator.TempJob );
22 | var ecbForMissingTag = new EntityCommandBuffer( Allocator.TempJob );
23 | var ecbForCleanup = new EntityCommandBuffer( Allocator.TempJob );
24 | Dependency = UpdateReactive( Dependency, ecbForAdded.AsParallelWriter(),
25 | ecbForMissingTag.AsParallelWriter(),
26 | ecbForCleanup.AsParallelWriter()
27 | );
28 | Dependency.Complete();
29 | ecbForAdded.Playback( EntityManager );
30 | ecbForAdded.Dispose();
31 | Dependency = FireEvents( Dependency );
32 | ecbForMissingTag.Playback( EntityManager );
33 | ecbForMissingTag.Dispose();
34 | ecbForCleanup.Playback( EntityManager );
35 | ecbForCleanup.Dispose();
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/DefaultEventSystem.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: dc5c4708cf244334837f588507b77f17
3 | timeCreated: 1655242042
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/EventType.cs:
--------------------------------------------------------------------------------
1 | namespace ReactiveDots
2 | {
3 | public enum EventType
4 | {
5 | All,
6 | Added,
7 | Removed,
8 | Changed,
9 | }
10 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/EventType.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 7dbbdc03ee7a4b33aca02e5157135294
3 | timeCreated: 1655241862
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/ReactiveEventAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace ReactiveDots
4 | {
5 | [AttributeUsage( validOn: AttributeTargets.Struct | AttributeTargets.Class, AllowMultiple = true )]
6 | public class ReactiveEventAttribute : Attribute
7 | {
8 | public EventType EventType { get; protected set; }
9 | public Type EventSystemType { get; protected set; }
10 | ///
11 | /// Field name in your component which will be used for comparing current and previous values of your component to determine if it has changed since the last system update.
12 | ///
13 | public string FieldNameToCompare { get; protected set; } = "Value";
14 |
15 | ///
16 | /// Use this attribute to mark a component you want events to be available for.
17 | /// Source generators will add interfaces and components automatically.
18 | ///
19 | /// Type of the event you want to generate.
20 | public ReactiveEventAttribute( EventType eventType = EventType.All )
21 | {
22 | EventType = eventType;
23 | EventSystemType = typeof(ReactiveDots.DefaultEventSystem);
24 | }
25 |
26 | ///
27 | /// Use this attribute to mark a component you want events to be available for.
28 | /// Source generators will add interfaces and components automatically.
29 | ///
30 | /// Type of the event you want to generate.
31 | /// System you want to be responsible for handling event management.
32 | /// ReactiveDots.DefaultEventSystem is default. Look for [ReactiveEventSystem] attribute if you want custom event system.
33 | public ReactiveEventAttribute( EventType eventType, Type eventSystem )
34 | {
35 | EventType = eventType;
36 | EventSystemType = eventSystem;
37 | }
38 | }
39 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/ReactiveEventAttribute.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a4de7a8653c44c27a15ad142a3ae5db5
3 | timeCreated: 1655241777
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/ReactiveEventForAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace ReactiveDots
4 | {
5 | public class ReactiveEventForAttribute : ReactiveEventAttribute
6 | {
7 | public Type ComponentType { get; protected set; }
8 |
9 | ///
10 | /// Use this attribute to mark a component you want events to be available for.
11 | /// Use this attribute instead of [ReactiveEvent] when you are unable to mark component directly.
12 | /// Source generators will add interfaces and components automatically.
13 | ///
14 | /// Type of the component you want generate events for.
15 | /// IMPORTANT NOTE: Use full name with namespace for proper generation, for example typeof( Path.To.Your.Component )
16 | /// Type of the event you want to generate.
17 | public ReactiveEventForAttribute( Type component, EventType eventType = EventType.All )
18 | {
19 | ComponentType = component;
20 | EventType = eventType;
21 | EventSystemType = typeof(ReactiveDots.DefaultEventSystem);
22 | }
23 |
24 | ///
25 | /// Use this attribute to mark a component you want events to be available for.
26 | /// Use this attribute instead of [ReactiveEvent] when you are unable to mark component directly.
27 | /// Source generators will add interfaces and components automatically.
28 | ///
29 | /// Type of the component you want generate events for.
30 | /// IMPORTANT NOTE: Use full name with namespace for proper generation, for example typeof( Path.To.Your.Component )
31 | /// Type of the event you want to generate.
32 | /// System you want to be responsible for handling event management.
33 | /// ReactiveDots.DefaultEventSystem is default. Look for [ReactiveEventSystem] attribute if you want custom event system.
34 | public ReactiveEventForAttribute( Type component, EventType eventType, Type eventSystem )
35 | {
36 | ComponentType = component;
37 | EventType = eventType;
38 | EventSystemType = eventSystem;
39 | }
40 | }
41 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/ReactiveEventForAttribute.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c690bc04c4594567aab1dd5982b53856
3 | timeCreated: 1655558124
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/ReactiveEventSystemAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace ReactiveDots
4 | {
5 | ///
6 | /// Mark your custom event system with this attribute to generate some necessary code.
7 | /// Look for ReactiveDots.DefaultEventSystem for an example usage.
8 | ///
9 | [AttributeUsage( validOn: AttributeTargets.Class, AllowMultiple = false )]
10 | public class ReactiveEventSystemAttribute : Attribute { }
11 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Events/ReactiveEventSystemAttribute.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 1723f1dcea5943e0beffe3f44fb43230
3 | timeCreated: 1655242132
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveDotsScriptsAssembly.asmdef:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ReactiveDotsScriptsAssembly",
3 | "rootNamespace": "",
4 | "references": [
5 | "Unity.Entities",
6 | "Unity.Mathematics",
7 | "Unity.Burst",
8 | "Unity.Jobs"
9 | ],
10 | "includePlatforms": [],
11 | "excludePlatforms": [],
12 | "allowUnsafeCode": false,
13 | "overrideReferences": false,
14 | "precompiledReferences": [],
15 | "autoReferenced": true,
16 | "defineConstraints": [],
17 | "versionDefines": [],
18 | "noEngineReferences": false
19 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveDotsScriptsAssembly.asmdef.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: bb57b8f26437db14c92966354a5b2838
3 | AssemblyDefinitionImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveSystems.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 3e57ff200e2642608614188ecc57b564
3 | timeCreated: 1655573603
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveSystems/ComponentReactiveData.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 |
3 | namespace ReactiveDots
4 | {
5 | public struct ComponentReactiveData where T : IComponentData
6 | {
7 | public T PreviousValue;
8 | public bool Changed;
9 | public bool Added;
10 | public bool Removed;
11 | public bool _AddedCheck;
12 |
13 | public bool AddedOrChanged => Added || Changed;
14 | public bool AddedOrRemoved => Added || Removed;
15 | public bool ChangedOrRemoved => Changed || Removed;
16 | }
17 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveSystems/ComponentReactiveData.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 2f3970eecf4c46618cfdab24daa5658f
3 | timeCreated: 1654111138
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveSystems/ReactiveEntityTag.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 |
3 | namespace ReactiveDots
4 | {
5 | public struct ReactiveEntityTag : IComponentData { }
6 |
7 | public struct ReactiveEntityCleanupTag : ICleanupComponentData { }
8 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveSystems/ReactiveEntityTag.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 04e37d0a8b5a4797808679440e20a733
3 | timeCreated: 1666718569
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveSystems/ReactiveSystemAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Unity.Entities;
3 |
4 | namespace ReactiveDots
5 | {
6 | [AttributeUsage( AttributeTargets.Class, AllowMultiple = true )]
7 | public class ReactiveSystemAttribute : Attribute
8 | {
9 | public Type ComponentType;
10 | public Type RComponentType;
11 | ///
12 | /// Field name in your component which will be used for comparing current and previous values of your component to determine if it has changed since the last system update.
13 | ///
14 | public string FieldNameToCompare = "Value";
15 |
16 | ///
17 | /// Use this attribute on a system which you want to react to changes to the specified component.
18 | /// Remember to add Dependency = this.UpdateReactive( Dependency ); at the beginning of the system OnUpdate method.
19 | ///
20 | /// Type of the component you want your system to check for changes.
21 | /// Type of the component your system will use to cache the main component changes.
22 | /// This must be an ISystemStateComponentData component declared in the scope of your system.
23 | /// This component have to have public ComponentReactiveData{T} Value; field, where {T} is the type of your main component.
24 | public ReactiveSystemAttribute( Type componentType, Type rComponentType )
25 | {
26 | ComponentType = componentType;
27 | RComponentType = rComponentType;
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/ReactiveSystems/ReactiveSystemAttribute.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: b40aa5ee242447549a25358f16de29ee
3 | timeCreated: 1647887120
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Utils.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: aa98cd3ff87c45bc8c66618413cb8f60
3 | timeCreated: 1655573621
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Utils/BooleanSimplifier.cs:
--------------------------------------------------------------------------------
1 | using Unity.Mathematics;
2 |
3 | namespace ReactiveDots
4 | {
5 | public static class BooleanSimplifier
6 | {
7 | public static bool All( bool result ) => result;
8 | public static bool All( bool2 result ) => result.x && result.y;
9 | public static bool All( bool3 result ) => result.x && result.y && result.z;
10 | public static bool All( bool4 result ) => result.x && result.y && result.z && result.w;
11 |
12 | public static bool Any( bool result ) => result;
13 | public static bool Any( bool2 result ) => result.x || result.y;
14 | public static bool Any( bool3 result ) => result.x || result.y || result.z;
15 | public static bool Any( bool4 result ) => result.x || result.y || result.z || result.w;
16 | }
17 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Utils/BooleanSimplifier.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 3de7e174ea4b4617814cf71dc9e7e97d
3 | timeCreated: 1654542920
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Utils/InitWithAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using System.Reflection;
4 | using Unity.Entities;
5 |
6 | namespace ReactiveDots
7 | {
8 | [AttributeUsage( AttributeTargets.Method, AllowMultiple = false )]
9 | public class InitWithAttribute : Attribute
10 | {
11 | public readonly Type SystemType;
12 |
13 | public InitWithAttribute( Type systemType )
14 | {
15 | this.SystemType = systemType;
16 | }
17 |
18 | public static void InvokeInitMethodsFor( SystemBase system )
19 | {
20 | AppDomain.CurrentDomain.GetAssemblies()
21 | .SelectMany( x => x.GetTypes() )
22 | .SelectMany( m => m.GetRuntimeMethods() )
23 | .Where( m =>
24 | m.GetCustomAttributes( typeof(InitWithAttribute), false )
25 | .Any( a => ( (InitWithAttribute)a ).SystemType == system.GetType() ) )
26 | .ToList()
27 | .ForEach( m => m.Invoke( system, new object[] { system } ) );
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Scripts/Utils/InitWithAttribute.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c8f50dfccb0b493bbbb95279ff65384f
3 | timeCreated: 1655468158
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 9f84272da72d5ca4c88d1bbe76f464db
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/BasicEventSystemTests.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using Unity.Entities;
3 |
4 | namespace ReactiveDots.Tests
5 | {
6 | public class BasicEventSystemTests : TestBase, IAnyEventComponentAddedListener, IAnyEventComponentChangedListener,
7 | IAnyEventComponentRemovedListener
8 | {
9 | private DefaultEventSystem _defaultEventSystem;
10 | private bool _anyAddedInvoked;
11 | private bool _anyChangedInvoked;
12 | private bool _anyRemovedInvoked;
13 |
14 | protected override void OnSetup()
15 | {
16 | _defaultEventSystem = World.AddSystemManaged( new DefaultEventSystem() );
17 | }
18 |
19 | [Test]
20 | public void AnyAddedListener()
21 | {
22 | var entity = EntityManager.CreateEntity();
23 | EntityManager.AddComponentData( entity, new EventComponent() { Value = 0 } );
24 | var listener = EntityManager.CreateEntity();
25 | EntityManager.AddComponentData( listener, new AnyEventComponentAddedListener() { Value = this } );
26 | _anyAddedInvoked = false;
27 | _defaultEventSystem.Update();
28 | Assert.True( _anyAddedInvoked, "Any added event should have fired, but didn't!" );
29 | }
30 |
31 | public void OnAnyEventComponentAdded( Entity entity, EventComponent component, World world )
32 | {
33 | _anyAddedInvoked = true;
34 | }
35 |
36 | [Test]
37 | public void AnyChangedListener()
38 | {
39 | var entity = EntityManager.CreateEntity();
40 | EntityManager.AddComponentData( entity, new EventComponent() { Value = 0 } );
41 | var listener = EntityManager.CreateEntity();
42 | EntityManager.AddComponentData( listener, new AnyEventComponentChangedListener() { Value = this } );
43 | _anyChangedInvoked = false;
44 | _defaultEventSystem.Update();
45 | Assert.False( _anyChangedInvoked, "Any changed event should have not fired yet, but did!" );
46 |
47 | EntityManager.SetComponentData( entity, new EventComponent() { Value = 1 } );
48 | _defaultEventSystem.Update();
49 | Assert.True( _anyChangedInvoked, "Any changed event should have fired, but didn't!" );
50 |
51 | _anyChangedInvoked = false;
52 | _defaultEventSystem.Update();
53 | Assert.False( _anyChangedInvoked,
54 | "Any changed event should have not fired without a component change, but did!" );
55 | }
56 |
57 | public void OnAnyEventComponentChanged( Entity entity, EventComponent component, World world )
58 | {
59 | _anyChangedInvoked = true;
60 | }
61 |
62 | [Test]
63 | public void AnyRemovedListenerOnComponentRemoval()
64 | {
65 | var entity = EntityManager.CreateEntity();
66 | EntityManager.AddComponentData( entity, new EventComponent() { Value = 0 } );
67 | var listener = EntityManager.CreateEntity();
68 | EntityManager.AddComponentData( listener, new AnyEventComponentRemovedListener() { Value = this } );
69 | _anyRemovedInvoked = false;
70 | _defaultEventSystem.Update();
71 | Assert.False( _anyRemovedInvoked, "Any removed event should have not fired after component add, but did!" );
72 |
73 | EntityManager.SetComponentData( entity, new EventComponent() { Value = 1 } );
74 | _defaultEventSystem.Update();
75 | Assert.False( _anyRemovedInvoked,
76 | "Any removed event should have not fired after component change, but did!" );
77 |
78 | EntityManager.RemoveComponent( entity );
79 | _defaultEventSystem.Update();
80 | Assert.True( _anyRemovedInvoked, "Any removed event should have fired, but didn't!" );
81 | _anyRemovedInvoked = false;
82 |
83 | _defaultEventSystem.Update();
84 | Assert.False( _anyRemovedInvoked,
85 | "Any removed event should have not fired in the second frame after component removal, but did!" );
86 | }
87 |
88 | [Test]
89 | public void AnyRemovedListenerOnEntityDestroy()
90 | {
91 | var entity = EntityManager.CreateEntity();
92 | EntityManager.AddComponentData( entity, new EventComponent() { Value = 0 } );
93 | var listener = EntityManager.CreateEntity();
94 | EntityManager.AddComponentData( listener, new AnyEventComponentRemovedListener() { Value = this } );
95 | _anyRemovedInvoked = false;
96 | _defaultEventSystem.Update();
97 | Assert.False( _anyRemovedInvoked, "Any removed event should have not fired after component add, but did!" );
98 |
99 | EntityManager.SetComponentData( entity, new EventComponent() { Value = 1 } );
100 | _defaultEventSystem.Update();
101 | Assert.False( _anyRemovedInvoked,
102 | "Any removed event should have not fired after component change, but did!" );
103 |
104 | EntityManager.DestroyEntity( entity );
105 | _defaultEventSystem.Update();
106 | Assert.True( _anyRemovedInvoked, "Any removed event should have fired, but didn't!" );
107 | _anyRemovedInvoked = false;
108 |
109 | _defaultEventSystem.Update();
110 | Assert.False( _anyRemovedInvoked,
111 | "Any removed event should have not fired in the second frame after entity destroy, but did!" );
112 | }
113 |
114 | public void OnAnyEventComponentRemoved( Entity entity, World world )
115 | {
116 | _anyRemovedInvoked = true;
117 | }
118 |
119 | [Test]
120 | public void MultipleEntities()
121 | {
122 | var entity = EntityManager.CreateEntity();
123 | EntityManager.AddComponentData( entity, new EventComponent() { Value = 0 } );
124 | var listener = EntityManager.CreateEntity();
125 | EntityManager.AddComponentData( listener, new AnyEventComponentChangedListener() { Value = this } );
126 | _defaultEventSystem.Update();
127 |
128 | Assert.DoesNotThrow( () =>
129 | {
130 | var entity2 = EntityManager.CreateEntity();
131 | EntityManager.AddComponentData( entity2, new EventComponent() { Value = 0 } );
132 | _defaultEventSystem.Update();
133 | }, "Exception caught when adding second entity with event component." );
134 | }
135 | }
136 |
137 | [ReactiveEvent( EventType.All )]
138 | public struct EventComponent : IComponentData
139 | {
140 | public int Value;
141 | }
142 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/BasicEventSystemTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 29d1104bca3e4cfa8264b7e6e80dcce3
3 | timeCreated: 1655491474
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/BasicReactiveSystemTests.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using Unity.Entities;
3 | using Unity.Jobs;
4 |
5 | namespace ReactiveDots.Tests
6 | {
7 | public class BasicReactiveSystemTests : TestBase
8 | {
9 | private TestReactiveSystem _testReactive;
10 |
11 | protected override void OnSetup()
12 | {
13 | _testReactive = World.AddSystemManaged( new TestReactiveSystem() );
14 | }
15 |
16 | [Test]
17 | public void HasReactiveComponent()
18 | {
19 | var entity = EntityManager.CreateEntity();
20 | EntityManager.AddComponentData( entity, new TestComponent() { Value = 0 } );
21 | _testReactive.Update();
22 | Assert.True( EntityManager.HasComponent( entity ),
23 | "Entity should have a TestSystem.TestComponentReactive but has not." );
24 | }
25 |
26 | [Test]
27 | public void IsAdded()
28 | {
29 | var entity = EntityManager.CreateEntity();
30 | EntityManager.AddComponentData( entity, new TestComponent() { Value = 0 } );
31 | _testReactive.Update();
32 |
33 | var reactiveData = EntityManager.GetComponentData( entity ).Value;
34 | Assert.True( reactiveData.Added,
35 | "Reactive data .Added should be true in first update, but it is false!" );
36 |
37 | _testReactive.Update();
38 | reactiveData = EntityManager.GetComponentData( entity ).Value;
39 | Assert.False( reactiveData.Added,
40 | "Reactive data .Added should be false in second update, but it is true!" );
41 | }
42 |
43 | [Test]
44 | public void IsChanged()
45 | {
46 | var entity = EntityManager.CreateEntity();
47 | EntityManager.AddComponentData( entity, new TestComponent() { Value = 0 } );
48 |
49 | _testReactive.Update();
50 | var reactiveData1 = EntityManager.GetComponentData( entity )
51 | .Value;
52 | Assert.False( reactiveData1.Changed,
53 | "Reactive data .Changed should be false in first update, but it is true!" );
54 |
55 | _testReactive.Update();
56 | var reactiveData2 = EntityManager.GetComponentData( entity )
57 | .Value;
58 | Assert.False( reactiveData2.Changed,
59 | "Reactive data .Changed should be false in second update, but it is true!" );
60 |
61 | EntityManager.SetComponentData( entity, new TestComponent() { Value = 1 } );
62 | _testReactive.Update();
63 | var reactiveData3 = EntityManager.GetComponentData( entity )
64 | .Value;
65 | Assert.True( reactiveData3.Changed,
66 | "Reactive data .Changed should be true after change, but it is false!" );
67 | Assert.True( reactiveData3.PreviousValue.Value == 1,
68 | "Reactive data .PreviousValue.Value should be equal to main component value after change, but it is not!" );
69 | }
70 |
71 | [Test]
72 | public void IsRemovedOnComponentRemoval()
73 | {
74 | var entity = EntityManager.CreateEntity();
75 | EntityManager.AddComponentData( entity, new TestComponent() { Value = 0 } );
76 | _testReactive.Update();
77 |
78 | var reactiveData1 = EntityManager.GetComponentData( entity )
79 | .Value;
80 | Assert.False( reactiveData1.Removed,
81 | "Reactive data .Removed should be false in first update, but it is true!" );
82 |
83 | EntityManager.RemoveComponent( entity );
84 | _testReactive.Update();
85 | var reactiveData2 = EntityManager.GetComponentData( entity )
86 | .Value;
87 | Assert.True( reactiveData2.Removed,
88 | "Reactive data .Removed should be true after main component removal, but it is false!" );
89 |
90 | _testReactive.Update();
91 | Assert.True( EntityManager.HasComponent( entity ),
92 | "Reactive data should still be present in the second frame after main component removal, but it is NOT!" );
93 | var reactiveData3 = EntityManager.GetComponentData( entity )
94 | .Value;
95 | Assert.False( reactiveData3.Removed,
96 | "Reactive data .Removed should be false in the second frame after main component removal, but it is true!" );
97 | Assert.False( reactiveData3._AddedCheck,
98 | "Reactive data ._AddedCheck should be false in the second frame after main component removal, but it is true!" );
99 | }
100 |
101 | [Test]
102 | public void IsRemovedOnEntityDestroy()
103 | {
104 | var entity = EntityManager.CreateEntity();
105 | EntityManager.AddComponentData( entity, new TestComponent() { Value = 0 } );
106 | _testReactive.Update();
107 |
108 | var reactiveData1 = EntityManager.GetComponentData( entity )
109 | .Value;
110 | Assert.False( reactiveData1.Removed,
111 | "Reactive data .Removed should be false in first update, but it is true!" );
112 |
113 | EntityManager.DestroyEntity( entity );
114 | _testReactive.Update();
115 | var reactiveData2 = EntityManager.GetComponentData( entity )
116 | .Value;
117 | Assert.True( reactiveData2.Removed,
118 | "Reactive data .Added should be true after entity destroy, but it is false!" );
119 |
120 | _testReactive.Update();
121 | Assert.False( EntityManager.HasComponent( entity ),
122 | "Reactive data should not be present in the second frame after entity destroy, but it is!" );
123 | }
124 | }
125 |
126 | public struct TestComponent : IComponentData
127 | {
128 | public int Value;
129 | }
130 |
131 | [DisableAutoCreation]
132 | [ReactiveSystem( typeof(TestComponent), typeof(TestComponentReactive) )]
133 | public partial class TestReactiveSystem : SystemBase
134 | {
135 | public struct TestComponentReactive : ICleanupComponentData
136 | {
137 | public ComponentReactiveData Value;
138 | }
139 |
140 | protected override void OnCreate()
141 | {
142 | base.OnCreate();
143 | GetEntityQuery(
144 | ComponentType.Exclude(),
145 | ComponentType.ReadWrite() );
146 | }
147 |
148 | protected override void OnUpdate()
149 | {
150 | Dependency = this.UpdateReactiveNowWithEcb( Dependency );
151 | Dependency.Complete();
152 | }
153 | }
154 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/BasicReactiveSystemTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 9e2bef606043e58428da20673015f8ee
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/BasicReactiveSystemWithEntityManagerTests.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using Unity.Entities;
3 | using Unity.Jobs;
4 | using UnityEngine;
5 |
6 | namespace ReactiveDots.Tests
7 | {
8 | public class BasicReactiveSystemWithEntityManagerTests : TestBase
9 | {
10 | private TestReactiveWithEntityManagerSystem _testReactive;
11 |
12 | protected override void OnSetup()
13 | {
14 | _testReactive = World.AddSystemManaged( new TestReactiveWithEntityManagerSystem() );
15 | }
16 |
17 | [Test]
18 | public void HasReactiveComponent()
19 | {
20 | var entity = EntityManager.CreateEntity();
21 | EntityManager.AddComponentData( entity, new TestWithEntityManagerComponent() { Value = 0 } );
22 | _testReactive.Update();
23 | Assert.True(
24 | EntityManager.HasComponent( entity ),
25 | "Entity should have a TestSystem.TestComponentReactive but has not." );
26 | }
27 |
28 | [Test]
29 | public void IsAdded()
30 | {
31 | var entity = EntityManager.CreateEntity();
32 | EntityManager.AddComponentData( entity, new TestWithEntityManagerComponent() { Value = 0 } );
33 | _testReactive.Update();
34 |
35 | var reactiveData = EntityManager
36 | .GetComponentData( entity ).Value;
37 | Assert.True( reactiveData.Added,
38 | "Reactive data .Added should be true in first update, but it is false!" );
39 |
40 | _testReactive.Update();
41 | reactiveData = EntityManager
42 | .GetComponentData( entity ).Value;
43 | Assert.False( reactiveData.Added,
44 | "Reactive data .Added should be false in second update, but it is true!" );
45 | }
46 |
47 | [Test]
48 | public void IsChanged()
49 | {
50 | var entity = EntityManager.CreateEntity();
51 | EntityManager.AddComponentData( entity, new TestWithEntityManagerComponent() { Value = 0 } );
52 |
53 | _testReactive.Update();
54 | var reactiveData1 = EntityManager
55 | .GetComponentData( entity ).Value;
56 | Assert.False( reactiveData1.Changed,
57 | "Reactive data .Changed should be false in first update, but it is true!" );
58 |
59 | _testReactive.Update();
60 | var reactiveData2 = EntityManager
61 | .GetComponentData( entity ).Value;
62 | Assert.False( reactiveData2.Changed,
63 | "Reactive data .Changed should be false in second update, but it is true!" );
64 |
65 | EntityManager.SetComponentData( entity, new TestWithEntityManagerComponent() { Value = 1 } );
66 | _testReactive.Update();
67 | var reactiveData3 = EntityManager
68 | .GetComponentData( entity ).Value;
69 | Assert.True( reactiveData3.Changed,
70 | "Reactive data .Changed should be true after change, but it is false!" );
71 | Assert.True( reactiveData3.PreviousValue.Value == 1,
72 | "Reactive data .PreviousValue.Value should be equal to main component value after change, but it is not!" );
73 | }
74 |
75 | [Test]
76 | public void IsRemovedOnComponentRemoval()
77 | {
78 | var entity = EntityManager.CreateEntity();
79 | EntityManager.AddComponentData( entity, new TestWithEntityManagerComponent() { Value = 0 } );
80 | _testReactive.Update();
81 |
82 | var reactiveData1 = EntityManager
83 | .GetComponentData( entity ).Value;
84 | Assert.False( reactiveData1.Removed,
85 | "Reactive data .Removed should be false in first update, but it is true!" );
86 |
87 | EntityManager.RemoveComponent( entity );
88 | _testReactive.Update();
89 | var reactiveData2 = EntityManager
90 | .GetComponentData( entity ).Value;
91 | Assert.True( reactiveData2.Removed,
92 | "Reactive data .Added should be true after main component removal, but it is false!" );
93 |
94 | _testReactive.Update();
95 | Assert.True(
96 | EntityManager.HasComponent( entity ),
97 | "Reactive data should still be present in the second frame after main component removal, but it is NOT!" );
98 | var reactiveData3 = EntityManager
99 | .GetComponentData( entity ).Value;
100 | Assert.False( reactiveData3.Removed,
101 | "Reactive data .Removed should be false in the second frame after main component removal, but it is true!" );
102 | Assert.False( reactiveData3._AddedCheck,
103 | "Reactive data ._AddedCheck should be false in the second frame after main component removal, but it is true!" );
104 | }
105 |
106 | [Test]
107 | public void IsRemovedOnEntityDestroy()
108 | {
109 | var entity = EntityManager.CreateEntity();
110 | EntityManager.AddComponentData( entity, new TestWithEntityManagerComponent() { Value = 0 } );
111 | _testReactive.Update();
112 |
113 | var reactiveData1 = EntityManager
114 | .GetComponentData( entity ).Value;
115 | Assert.False( reactiveData1.Removed,
116 | "Reactive data .Removed should be false in first update, but it is true!" );
117 |
118 | EntityManager.DestroyEntity( entity );
119 | _testReactive.Update();
120 | var reactiveData2 = EntityManager
121 | .GetComponentData( entity ).Value;
122 | Assert.True( reactiveData2.Removed,
123 | "Reactive data .Added should be true after entity destroy, but it is false!" );
124 |
125 | _testReactive.Update();
126 | Assert.False(
127 | EntityManager.HasComponent( entity ),
128 | "Reactive data should not be present in the second frame after entity destroy, but it is!" );
129 | }
130 |
131 | [Test]
132 | public void MultipleEntities()
133 | {
134 | var entity = EntityManager.CreateEntity();
135 | EntityManager.AddComponentData( entity, new TestWithEntityManagerComponent() { Value = 0 } );
136 | _testReactive.Update();
137 |
138 | Assert.DoesNotThrow( () =>
139 | {
140 | var entity2 = EntityManager.CreateEntity();
141 | EntityManager.AddComponentData( entity2, new TestWithEntityManagerComponent() { Value = 0 } );
142 | _testReactive.Update();
143 | }, "Exception caught when adding second entity with reactive component." );
144 | }
145 | }
146 |
147 | public struct TestWithEntityManagerComponent : IComponentData
148 | {
149 | public int Value;
150 | }
151 |
152 | [DisableAutoCreation]
153 | [ReactiveSystem( typeof(TestWithEntityManagerComponent), typeof(TestComponentReactive) )]
154 | public partial class TestReactiveWithEntityManagerSystem : SystemBase
155 | {
156 | public struct TestComponentReactive : ICleanupComponentData
157 | {
158 | public ComponentReactiveData Value;
159 | }
160 |
161 | protected override void OnCreate()
162 | {
163 | base.OnCreate();
164 | GetEntityQuery(
165 | ComponentType.Exclude(),
166 | ComponentType.ReadWrite() );
167 | }
168 |
169 | protected override void OnUpdate()
170 | {
171 | Dependency = this.UpdateReactiveNowWithEntityManager( Dependency );
172 | Dependency.Complete();
173 | }
174 | }
175 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/BasicReactiveSystemWithEntityManagerTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 2933ed6b79594e3384ff1977b051f971
3 | timeCreated: 1655923506
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/BasicReactiveSystemWithExternalEcbTests.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using Unity.Collections;
3 | using Unity.Entities;
4 | using Unity.Jobs;
5 |
6 | namespace ReactiveDots.Tests
7 | {
8 | public class BasicReactiveSystemWithExternalEcbTests : TestBase
9 | {
10 | private TestReactiveWithExternalEcbSystem _testReactive;
11 |
12 | protected override void OnSetup()
13 | {
14 | _testReactive = World.AddSystemManaged( new TestReactiveWithExternalEcbSystem() );
15 | }
16 |
17 | [Test]
18 | public void HasReactiveComponent()
19 | {
20 | var entity = EntityManager.CreateEntity();
21 | EntityManager.AddComponentData( entity, new TestWithExternalEcbComponent() { Value = 0 } );
22 | _testReactive.Update();
23 | Assert.True( EntityManager.HasComponent( entity ),
24 | "Entity should have a TestSystem.TestComponentReactive but has not." );
25 | }
26 |
27 | [Test]
28 | public void IsAdded()
29 | {
30 | var entity = EntityManager.CreateEntity();
31 | EntityManager.AddComponentData( entity, new TestWithExternalEcbComponent() { Value = 0 } );
32 | _testReactive.Update();
33 |
34 | var reactiveData = EntityManager
35 | .GetComponentData( entity ).Value;
36 | Assert.True( reactiveData.Added,
37 | "Reactive data .Added should be true in first update, but it is false!" );
38 |
39 | _testReactive.Update();
40 | reactiveData = EntityManager
41 | .GetComponentData( entity ).Value;
42 | Assert.False( reactiveData.Added,
43 | "Reactive data .Added should be false in second update, but it is true!" );
44 | }
45 |
46 | [Test]
47 | public void IsChanged()
48 | {
49 | var entity = EntityManager.CreateEntity();
50 | EntityManager.AddComponentData( entity, new TestWithExternalEcbComponent() { Value = 0 } );
51 |
52 | _testReactive.Update();
53 | var reactiveData1 = EntityManager
54 | .GetComponentData( entity ).Value;
55 | Assert.False( reactiveData1.Changed,
56 | "Reactive data .Changed should be false in first update, but it is true!" );
57 |
58 | _testReactive.Update();
59 | var reactiveData2 = EntityManager
60 | .GetComponentData( entity ).Value;
61 | Assert.False( reactiveData2.Changed,
62 | "Reactive data .Changed should be false in second update, but it is true!" );
63 |
64 | EntityManager.SetComponentData( entity, new TestWithExternalEcbComponent() { Value = 1 } );
65 | _testReactive.Update();
66 | var reactiveData3 = EntityManager
67 | .GetComponentData( entity ).Value;
68 | Assert.True( reactiveData3.Changed,
69 | "Reactive data .Changed should be true after change, but it is false!" );
70 | Assert.True( reactiveData3.PreviousValue.Value == 1,
71 | "Reactive data .PreviousValue.Value should be equal to main component value after change, but it is not!" );
72 | }
73 |
74 | [Test]
75 | public void IsRemovedOnComponentRemoval()
76 | {
77 | var entity = EntityManager.CreateEntity();
78 | EntityManager.AddComponentData( entity, new TestWithExternalEcbComponent() { Value = 0 } );
79 | _testReactive.Update();
80 |
81 | var reactiveData1 = EntityManager
82 | .GetComponentData( entity ).Value;
83 | Assert.False( reactiveData1.Removed,
84 | "Reactive data .Removed should be false in first update, but it is true!" );
85 |
86 | EntityManager.RemoveComponent( entity );
87 | _testReactive.Update();
88 | var reactiveData2 = EntityManager
89 | .GetComponentData( entity ).Value;
90 | Assert.True( reactiveData2.Removed,
91 | "Reactive data .Added should be true after main component removal, but it is false!" );
92 |
93 | _testReactive.Update();
94 | Assert.True( EntityManager.HasComponent( entity ),
95 | "Reactive data should still be present in the second frame after main component removal, but it is NOT!" );
96 | var reactiveData3 = EntityManager
97 | .GetComponentData( entity ).Value;
98 | Assert.False( reactiveData3.Removed,
99 | "Reactive data .Removed should be false in the second frame after main component removal, but it is true!" );
100 | Assert.False( reactiveData3._AddedCheck,
101 | "Reactive data ._AddedCheck should be false in the second frame after main component removal, but it is true!" );
102 | }
103 |
104 | [Test]
105 | public void IsRemovedOnEntityDestroy()
106 | {
107 | var entity = EntityManager.CreateEntity();
108 | EntityManager.AddComponentData( entity, new TestWithExternalEcbComponent() { Value = 0 } );
109 | _testReactive.Update();
110 |
111 | var reactiveData1 = EntityManager
112 | .GetComponentData( entity ).Value;
113 | Assert.False( reactiveData1.Removed,
114 | "Reactive data .Removed should be false in first update, but it is true!" );
115 |
116 | EntityManager.DestroyEntity( entity );
117 | _testReactive.Update();
118 | var reactiveData2 = EntityManager
119 | .GetComponentData( entity ).Value;
120 | Assert.True( reactiveData2.Removed,
121 | "Reactive data .Added should be true after entity destroy, but it is false!" );
122 |
123 | _testReactive.Update();
124 | Assert.False( EntityManager.HasComponent( entity ),
125 | "Reactive data should not be present in the second frame after entity destroy, but it is!" );
126 | }
127 | }
128 |
129 | public struct TestWithExternalEcbComponent : IComponentData
130 | {
131 | public int Value;
132 | }
133 |
134 | [DisableAutoCreation]
135 | [ReactiveSystem( typeof(TestWithExternalEcbComponent), typeof(TestComponentReactive) )]
136 | public partial class TestReactiveWithExternalEcbSystem : SystemBase
137 | {
138 | public struct TestComponentReactive : ICleanupComponentData
139 | {
140 | public ComponentReactiveData Value;
141 | }
142 |
143 | protected override void OnCreate()
144 | {
145 | base.OnCreate();
146 | GetEntityQuery(
147 | ComponentType.Exclude(),
148 | ComponentType.ReadWrite() );
149 | }
150 |
151 | protected override void OnUpdate()
152 | {
153 | var ecbForAdded = new EntityCommandBuffer( Allocator.TempJob );
154 | var ecbForMissingTag = new EntityCommandBuffer( Allocator.TempJob );
155 | var ecbForCleanup = new EntityCommandBuffer( Allocator.TempJob );
156 | Dependency = this.UpdateReactive( Dependency, ecbForAdded, ecbForMissingTag, ecbForCleanup );
157 | Dependency.Complete();
158 | ecbForAdded.Playback( EntityManager );
159 | ecbForAdded.Dispose();
160 | ecbForMissingTag.Playback( EntityManager );
161 | ecbForMissingTag.Dispose();
162 | ecbForCleanup.Playback( EntityManager );
163 | ecbForCleanup.Dispose();
164 | }
165 | }
166 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/BasicReactiveSystemWithExternalEcbTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: ace1dbd40af741e9bb4107fadca0e3a6
3 | timeCreated: 1655923713
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/CrossAssembliesReactiveSystemTests.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using ReactiveDots.Tests.SecondTestAssembly;
3 | using Unity.Entities;
4 |
5 | namespace ReactiveDots.Tests
6 | {
7 | public class CrossAssembliesReactiveSystemTests : TestBase
8 | {
9 | private CrossAssembliesTestReactiveSystem _testReactive;
10 |
11 | protected override void OnSetup()
12 | {
13 | _testReactive = World.AddSystemManaged( new CrossAssembliesTestReactiveSystem() );
14 | }
15 |
16 | [Test]
17 | public void HasReactiveComponent()
18 | {
19 | var entity = EntityManager.CreateEntity();
20 | EntityManager.AddComponentData( entity, new OtherAssemblyTestComponent() { Value = 0 } );
21 | _testReactive.Update();
22 | Assert.True( EntityManager.HasComponent( entity ),
23 | "Entity should have a TestSystem.TestComponentReactive but has not." );
24 | }
25 |
26 | [Test]
27 | public void IsAdded()
28 | {
29 | var entity = EntityManager.CreateEntity();
30 | EntityManager.AddComponentData( entity, new OtherAssemblyTestComponent() { Value = 0 } );
31 | _testReactive.Update();
32 |
33 | var reactiveData = EntityManager
34 | .GetComponentData( entity ).Value;
35 | Assert.True( reactiveData.Added,
36 | "Reactive data .Added should be true in first update, but it is false!" );
37 |
38 | _testReactive.Update();
39 | reactiveData = EntityManager
40 | .GetComponentData( entity ).Value;
41 | Assert.False( reactiveData.Added,
42 | "Reactive data .Added should be false in second update, but it is true!" );
43 | }
44 |
45 | [Test]
46 | public void IsChanged()
47 | {
48 | var entity = EntityManager.CreateEntity();
49 | EntityManager.AddComponentData( entity, new OtherAssemblyTestComponent() { Value = 0 } );
50 |
51 | _testReactive.Update();
52 | var reactiveData1 = EntityManager
53 | .GetComponentData( entity ).Value;
54 | Assert.False( reactiveData1.Changed,
55 | "Reactive data .Changed should be false in first update, but it is true!" );
56 |
57 | _testReactive.Update();
58 | var reactiveData2 = EntityManager
59 | .GetComponentData( entity ).Value;
60 | Assert.False( reactiveData2.Changed,
61 | "Reactive data .Changed should be false in second update, but it is true!" );
62 |
63 | EntityManager.SetComponentData( entity, new OtherAssemblyTestComponent() { Value = 1 } );
64 | _testReactive.Update();
65 | var reactiveData3 = EntityManager
66 | .GetComponentData( entity ).Value;
67 | Assert.True( reactiveData3.Changed,
68 | "Reactive data .Changed should be true after change, but it is false!" );
69 | Assert.True( reactiveData3.PreviousValue.Value == 1,
70 | "Reactive data .PreviousValue.Value should be equal to main component value after change, but it is not!" );
71 | }
72 |
73 | [Test]
74 | public void IsRemovedOnComponentRemoval()
75 | {
76 | var entity = EntityManager.CreateEntity();
77 | EntityManager.AddComponentData( entity, new OtherAssemblyTestComponent() { Value = 0 } );
78 | _testReactive.Update();
79 |
80 | var reactiveData1 = EntityManager
81 | .GetComponentData( entity ).Value;
82 | Assert.False( reactiveData1.Removed,
83 | "Reactive data .Removed should be false in first update, but it is true!" );
84 |
85 | EntityManager.RemoveComponent( entity );
86 | _testReactive.Update();
87 | var reactiveData2 = EntityManager
88 | .GetComponentData( entity ).Value;
89 | Assert.True( reactiveData2.Removed,
90 | "Reactive data .Added should be true after main component removal, but it is false!" );
91 |
92 | _testReactive.Update();
93 | Assert.True( EntityManager.HasComponent( entity ),
94 | "Reactive data should still be present in the second frame after main component removal, but it is NOT!" );
95 | var reactiveData3 = EntityManager
96 | .GetComponentData( entity ).Value;
97 | Assert.False( reactiveData3.Removed,
98 | "Reactive data .Removed should be false in the second frame after main component removal, but it is true!" );
99 | Assert.False( reactiveData3._AddedCheck,
100 | "Reactive data ._AddedCheck should be false in the second frame after main component removal, but it is true!" );
101 | }
102 |
103 | [Test]
104 | public void IsRemovedOnEntityDestroy()
105 | {
106 | var entity = EntityManager.CreateEntity();
107 | EntityManager.AddComponentData( entity, new OtherAssemblyTestComponent() { Value = 0 } );
108 | _testReactive.Update();
109 |
110 | var reactiveData1 = EntityManager
111 | .GetComponentData( entity ).Value;
112 | Assert.False( reactiveData1.Removed,
113 | "Reactive data .Removed should be false in first update, but it is true!" );
114 |
115 | EntityManager.DestroyEntity( entity );
116 | _testReactive.Update();
117 | var reactiveData2 = EntityManager
118 | .GetComponentData( entity ).Value;
119 | Assert.True( reactiveData2.Removed,
120 | "Reactive data .Added should be true after entity destroy, but it is false!" );
121 |
122 | _testReactive.Update();
123 | Assert.False( EntityManager.HasComponent( entity ),
124 | "Reactive data should not be present in the second frame after entity destroy, but it is!" );
125 | }
126 | }
127 |
128 | [DisableAutoCreation]
129 | [ReactiveSystem( typeof(OtherAssemblyTestComponent), typeof(TestComponentReactive) )]
130 | public partial class CrossAssembliesTestReactiveSystem : SystemBase
131 | {
132 | public struct TestComponentReactive : ICleanupComponentData
133 | {
134 | public ComponentReactiveData Value;
135 | }
136 |
137 | protected override void OnUpdate()
138 | {
139 | Dependency = this.UpdateReactiveNowWithEcb( Dependency );
140 | Dependency.Complete();
141 | }
142 | }
143 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/CrossAssembliesReactiveSystemTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 9c65b203b93d4e0c86bc8a61a28ed6e7
3 | timeCreated: 1655555877
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/EnableableComponentReactiveSystemTests.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using Unity.Entities;
3 | using Unity.Jobs;
4 |
5 | namespace ReactiveDots.Tests
6 | {
7 | public class EnableableComponentReactiveSystemTests : TestBase
8 | {
9 | private TestEnableableReactiveSystem _testReactive;
10 |
11 | protected override void OnSetup()
12 | {
13 | _testReactive = World.AddSystemManaged( new TestEnableableReactiveSystem() );
14 | }
15 |
16 | [Test]
17 | public void HasReactiveComponent()
18 | {
19 | var entity = EntityManager.CreateEntity();
20 | EntityManager.AddComponentData( entity, new TestEnableableComponent() );
21 | _testReactive.Update();
22 | Assert.True( EntityManager.HasComponent( entity ),
23 | "Entity should have a TestEnableableComponentReactive but has not." );
24 | }
25 |
26 | [Test]
27 | public void DoesSetComponentEnabledTriggerAddedAndRemoved()
28 | {
29 | var entity = EntityManager.CreateEntity();
30 | EntityManager.AddComponentData( entity, new TestEnableableComponent() );
31 | _testReactive.Update();
32 |
33 | var reactiveData = EntityManager.GetComponentData( entity )
34 | .Value;
35 | Assert.True( reactiveData.Added,
36 | "Reactive data .Added should be true in first update, but it is false!" );
37 |
38 | _testReactive.Update();
39 | reactiveData = EntityManager.GetComponentData( entity )
40 | .Value;
41 | Assert.False( reactiveData.Added,
42 | "Reactive data .Added should be false in second update, but it is true!" );
43 |
44 | EntityManager.SetComponentEnabled( entity, false );
45 | _testReactive.Update();
46 | reactiveData = EntityManager.GetComponentData( entity )
47 | .Value;
48 | Assert.True( reactiveData.Removed,
49 | "Reactive data .Removed should be true if the component was disabled, but it is false!" );
50 |
51 | _testReactive.Update();
52 | reactiveData = EntityManager.GetComponentData( entity )
53 | .Value;
54 | Assert.False( reactiveData.Removed,
55 | "Reactive data .Removed should be reset to false two frames after the component was disabled, but it is true!" );
56 |
57 | EntityManager.SetComponentEnabled( entity, true );
58 | _testReactive.Update();
59 | reactiveData = EntityManager.GetComponentData( entity )
60 | .Value;
61 | Assert.True( reactiveData.Added,
62 | "Reactive data .Added should be true if the component was enabled, but it is false!" );
63 |
64 | _testReactive.Update();
65 | reactiveData = EntityManager.GetComponentData( entity )
66 | .Value;
67 | Assert.False( reactiveData.Added,
68 | "Reactive data .Added should be reset to false two frames after the component was enabled, but it is true!" );
69 | }
70 | }
71 |
72 | public struct TestEnableableComponent : IComponentData, IEnableableComponent { }
73 |
74 | [DisableAutoCreation]
75 | [ReactiveSystem( typeof(TestEnableableComponent), typeof(TestEnableableComponentReactive), FieldNameToCompare = "" )]
76 | public partial class TestEnableableReactiveSystem : SystemBase
77 | {
78 | public struct TestEnableableComponentReactive : ICleanupComponentData
79 | {
80 | public ComponentReactiveData Value;
81 | }
82 |
83 | protected override void OnCreate()
84 | {
85 | base.OnCreate();
86 | GetEntityQuery(
87 | ComponentType.Exclude(),
88 | ComponentType.ReadWrite() );
89 | }
90 |
91 | protected override void OnUpdate()
92 | {
93 | Dependency = this.UpdateReactiveNowWithEcb( Dependency );
94 | Dependency.Complete();
95 | }
96 | }
97 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/EnableableComponentReactiveSystemTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 4ec70360155145f38ec76bd553599361
3 | timeCreated: 1667510647
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/ForComponentEventSystemTests.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using ReactiveDots.Tests.SecondTestAssembly;
3 | using Unity.Entities;
4 |
5 | namespace ReactiveDots.Tests
6 | {
7 | [ReactiveEventFor( typeof(OtherAssemblyTestEventComponent) )]
8 | public class ForComponentEventSystemTests : TestBase, IAnyOtherAssemblyTestEventComponentAddedListener,
9 | IAnyOtherAssemblyTestEventComponentChangedListener,
10 | IAnyOtherAssemblyTestEventComponentRemovedListener
11 | {
12 | private DefaultEventSystem _defaultEventSystem;
13 | private bool _anyAddedInvoked;
14 | private bool _anyChangedInvoked;
15 | private bool _anyRemovedInvoked;
16 |
17 | protected override void OnSetup()
18 | {
19 | _defaultEventSystem = World.AddSystemManaged( new DefaultEventSystem() );
20 | }
21 |
22 | [Test]
23 | public void AnyAddedListener()
24 | {
25 | var entity = EntityManager.CreateEntity();
26 | EntityManager.AddComponentData( entity,
27 | new OtherAssemblyTestEventComponent() { Value = 0 } );
28 | var listener = EntityManager.CreateEntity();
29 | EntityManager.AddComponentData( listener,
30 | new AnyOtherAssemblyTestEventComponentAddedListener() { Value = this } );
31 | _anyAddedInvoked = false;
32 | _defaultEventSystem.Update();
33 | Assert.True( _anyAddedInvoked, "Any added event should have fired, but didn't!" );
34 | }
35 |
36 | public void OnAnyOtherAssemblyTestEventComponentAdded( Entity entity, OtherAssemblyTestEventComponent component,
37 | World world )
38 | {
39 | _anyAddedInvoked = true;
40 | }
41 |
42 | [Test]
43 | public void AnyChangedListener()
44 | {
45 | var entity = EntityManager.CreateEntity();
46 | EntityManager.AddComponentData( entity, new OtherAssemblyTestEventComponent() { Value = 0 } );
47 | var listener = EntityManager.CreateEntity();
48 | EntityManager.AddComponentData( listener,
49 | new AnyOtherAssemblyTestEventComponentChangedListener() { Value = this } );
50 | _anyChangedInvoked = false;
51 | _defaultEventSystem.Update();
52 | Assert.False( _anyChangedInvoked, "Any changed event should have not fired yet, but did!" );
53 |
54 | EntityManager.SetComponentData( entity, new OtherAssemblyTestEventComponent() { Value = 1 } );
55 | _defaultEventSystem.Update();
56 | Assert.True( _anyChangedInvoked, "Any changed event should have fired, but didn't!" );
57 |
58 | _anyChangedInvoked = false;
59 | _defaultEventSystem.Update();
60 | Assert.False( _anyChangedInvoked,
61 | "Any changed event should have not fired without a component change, but did!" );
62 | }
63 |
64 | public void OnAnyOtherAssemblyTestEventComponentChanged( Entity entity,
65 | OtherAssemblyTestEventComponent component, World world )
66 | {
67 | _anyChangedInvoked = true;
68 | }
69 |
70 | [Test]
71 | public void AnyRemovedListenerOnComponentRemoval()
72 | {
73 | var entity = EntityManager.CreateEntity();
74 | EntityManager.AddComponentData( entity, new OtherAssemblyTestEventComponent() { Value = 0 } );
75 | var listener = EntityManager.CreateEntity();
76 | EntityManager.AddComponentData( listener,
77 | new AnyOtherAssemblyTestEventComponentRemovedListener() { Value = this } );
78 | _anyRemovedInvoked = false;
79 | _defaultEventSystem.Update();
80 | Assert.False( _anyRemovedInvoked, "Any removed event should have not fired after component add, but did!" );
81 |
82 | EntityManager.SetComponentData( entity, new OtherAssemblyTestEventComponent() { Value = 1 } );
83 | _defaultEventSystem.Update();
84 | Assert.False( _anyRemovedInvoked,
85 | "Any removed event should have not fired after component change, but did!" );
86 |
87 | EntityManager.RemoveComponent( entity );
88 | _defaultEventSystem.Update();
89 | Assert.True( _anyRemovedInvoked, "Any removed event should have fired, but didn't!" );
90 | _anyRemovedInvoked = false;
91 |
92 | _defaultEventSystem.Update();
93 | Assert.False( _anyRemovedInvoked,
94 | "Any removed event should have not fired in the second frame after component removal, but did!" );
95 | }
96 |
97 | [Test]
98 | public void AnyRemovedListenerOnEntityDestroy()
99 | {
100 | var entity = EntityManager.CreateEntity();
101 | EntityManager.AddComponentData( entity, new OtherAssemblyTestEventComponent() { Value = 0 } );
102 | var listener = EntityManager.CreateEntity();
103 | EntityManager.AddComponentData( listener,
104 | new AnyOtherAssemblyTestEventComponentRemovedListener() { Value = this } );
105 | _anyRemovedInvoked = false;
106 | _defaultEventSystem.Update();
107 | Assert.False( _anyRemovedInvoked, "Any removed event should have not fired after component add, but did!" );
108 |
109 | EntityManager.SetComponentData( entity, new OtherAssemblyTestEventComponent() { Value = 1 } );
110 | _defaultEventSystem.Update();
111 | Assert.False( _anyRemovedInvoked,
112 | "Any removed event should have not fired after component change, but did!" );
113 |
114 | EntityManager.DestroyEntity( entity );
115 | _defaultEventSystem.Update();
116 | Assert.True( _anyRemovedInvoked, "Any removed event should have fired, but didn't!" );
117 | _anyRemovedInvoked = false;
118 |
119 | _defaultEventSystem.Update();
120 | Assert.False( _anyRemovedInvoked,
121 | "Any removed event should have not fired in the second frame after entity destroy, but did!" );
122 | }
123 |
124 | public void OnAnyOtherAssemblyTestEventComponentRemoved( Entity entity, World world )
125 | {
126 | _anyRemovedInvoked = true;
127 | }
128 | }
129 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/ForComponentEventSystemTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: e034fccd5bcc48db9e2ceff7967c2e18
3 | timeCreated: 1655560911
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/MultiReactiveSystemTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 1076d774437a4bcdb97c89a7bf228c34
3 | timeCreated: 1655561213
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/ReactiveDots.Tests.asmdef:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ReactiveDots.Tests",
3 | "rootNamespace": "",
4 | "references": [
5 | "UnityEngine.TestRunner",
6 | "UnityEditor.TestRunner",
7 | "ReactiveDotsScriptsAssembly",
8 | "Unity.Burst",
9 | "Unity.Collections",
10 | "Unity.Collections.BurstCompatibilityGen",
11 | "Unity.Entities",
12 | "Unity.Jobs",
13 | "Unity.Mathematics",
14 | "Unity.Entities.Tests",
15 | "Unity.Entities.Editor.Tests",
16 | "ReactiveDots.Tests.SecondAssembly"
17 | ],
18 | "includePlatforms": [
19 | "Editor"
20 | ],
21 | "excludePlatforms": [],
22 | "allowUnsafeCode": false,
23 | "overrideReferences": true,
24 | "precompiledReferences": [
25 | "nunit.framework.dll"
26 | ],
27 | "autoReferenced": false,
28 | "defineConstraints": [
29 | "UNITY_INCLUDE_TESTS"
30 | ],
31 | "versionDefines": [],
32 | "noEngineReferences": false
33 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/ReactiveDots.Tests.asmdef.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 106e71251e2f13d4f8755f2bf3025af4
3 | AssemblyDefinitionImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/SecondTestAssembly.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 4cc530ac11d454d43a240b65a2c37cbf
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/SecondTestAssembly/OtherAssemblyTestComponent.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 |
3 | namespace ReactiveDots.Tests.SecondTestAssembly
4 | {
5 | public struct OtherAssemblyTestComponent : IComponentData
6 | {
7 | public int Value;
8 | }
9 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/SecondTestAssembly/OtherAssemblyTestComponent.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 4bfc07d5718b405f896156043cba7b16
3 | timeCreated: 1655555817
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/SecondTestAssembly/OtherAssemblyTestEventComponent.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 |
3 | namespace ReactiveDots.Tests.SecondTestAssembly
4 | {
5 | public struct OtherAssemblyTestEventComponent : IComponentData
6 | {
7 | public int Value;
8 | }
9 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/SecondTestAssembly/OtherAssemblyTestEventComponent.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 0d78b7415b7044c09347139d1f3cf649
3 | timeCreated: 1655560848
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/SecondTestAssembly/ReactiveDots.Tests.SecondAssembly.asmdef:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ReactiveDots.Tests.SecondAssembly",
3 | "rootNamespace": "",
4 | "references": [
5 | "GUID:734d92eba21c94caba915361bd5ac177"
6 | ],
7 | "includePlatforms": [
8 | "Editor"
9 | ],
10 | "excludePlatforms": [],
11 | "allowUnsafeCode": false,
12 | "overrideReferences": false,
13 | "precompiledReferences": [],
14 | "autoReferenced": false,
15 | "defineConstraints": [],
16 | "versionDefines": [],
17 | "noEngineReferences": false
18 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/SecondTestAssembly/ReactiveDots.Tests.SecondAssembly.asmdef.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: bbc8fb5cadab6db49920df0ad8dc1bbc
3 | AssemblyDefinitionImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/TagComponentReactiveSystemTests.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using Unity.Entities;
3 | using Unity.Jobs;
4 |
5 | namespace ReactiveDots.Tests
6 | {
7 | public class TagComponentReactiveSystemTests : TestBase
8 | {
9 | private TestTagReactiveSystem _testReactive;
10 |
11 | protected override void OnSetup()
12 | {
13 | _testReactive = World.AddSystemManaged( new TestTagReactiveSystem() );
14 | }
15 |
16 | [Test]
17 | public void HasReactiveComponent()
18 | {
19 | var entity = EntityManager.CreateEntity();
20 | EntityManager.AddComponentData( entity, new TestTagComponent() );
21 | _testReactive.Update();
22 | Assert.True( EntityManager.HasComponent( entity ),
23 | "Entity should have a TestTagComponentReactive but has not." );
24 | }
25 |
26 | [Test]
27 | public void IsAdded()
28 | {
29 | var entity = EntityManager.CreateEntity();
30 | EntityManager.AddComponentData( entity, new TestTagComponent() );
31 | _testReactive.Update();
32 |
33 | var reactiveData = EntityManager.GetComponentData( entity )
34 | .Value;
35 | Assert.True( reactiveData.Added,
36 | "Reactive data .Added should be true in first update, but it is false!" );
37 |
38 | _testReactive.Update();
39 | reactiveData = EntityManager.GetComponentData( entity )
40 | .Value;
41 | Assert.False( reactiveData.Added,
42 | "Reactive data .Added should be false in second update, but it is true!" );
43 | }
44 |
45 | [Test]
46 | public void IsRemovedOnComponentRemoval()
47 | {
48 | var entity = EntityManager.CreateEntity();
49 | EntityManager.AddComponentData( entity, new TestTagComponent() );
50 | _testReactive.Update();
51 |
52 | var reactiveData1 = EntityManager.GetComponentData( entity )
53 | .Value;
54 | Assert.False( reactiveData1.Removed,
55 | "Reactive data .Removed should be false in first update, but it is true!" );
56 |
57 | EntityManager.RemoveComponent( entity );
58 | _testReactive.Update();
59 | var reactiveData2 = EntityManager.GetComponentData( entity )
60 | .Value;
61 | Assert.True( reactiveData2.Removed,
62 | "Reactive data .Removed should be true after main component removal, but it is false!" );
63 |
64 | _testReactive.Update();
65 | Assert.True( EntityManager.HasComponent( entity ),
66 | "Reactive data should still be present in the second frame after main component removal, but it is NOT!" );
67 | var reactiveData3 = EntityManager.GetComponentData( entity )
68 | .Value;
69 | Assert.False( reactiveData3.Removed,
70 | "Reactive data .Removed should be false in the second frame after main component removal, but it is true!" );
71 | Assert.False( reactiveData3._AddedCheck,
72 | "Reactive data ._AddedCheck should be false in the second frame after main component removal, but it is true!" );
73 | }
74 |
75 | [Test]
76 | public void IsRemovedOnEntityDestroy()
77 | {
78 | var entity = EntityManager.CreateEntity();
79 | EntityManager.AddComponentData( entity, new TestTagComponent() );
80 | _testReactive.Update();
81 |
82 | var reactiveData1 = EntityManager.GetComponentData( entity )
83 | .Value;
84 | Assert.False( reactiveData1.Removed,
85 | "Reactive data .Removed should be false in first update, but it is true!" );
86 |
87 | EntityManager.DestroyEntity( entity );
88 | _testReactive.Update();
89 | var reactiveData2 = EntityManager.GetComponentData( entity )
90 | .Value;
91 | Assert.True( reactiveData2.Removed,
92 | "Reactive data .Added should be true after entity destroy, but it is false!" );
93 |
94 | _testReactive.Update();
95 | Assert.False( EntityManager.HasComponent( entity ),
96 | "Reactive data should not be present in the second frame after entity destroy, but it is!" );
97 | }
98 | }
99 |
100 | public struct TestTagComponent : IComponentData { }
101 |
102 | [DisableAutoCreation]
103 | [ReactiveSystem( typeof(TestTagComponent), typeof(TestTagComponentReactive), FieldNameToCompare = "" )]
104 | public partial class TestTagReactiveSystem : SystemBase
105 | {
106 | public struct TestTagComponentReactive : ICleanupComponentData
107 | {
108 | public ComponentReactiveData Value;
109 | }
110 |
111 | protected override void OnCreate()
112 | {
113 | base.OnCreate();
114 | GetEntityQuery(
115 | ComponentType.Exclude(),
116 | ComponentType.ReadWrite() );
117 | }
118 |
119 | protected override void OnUpdate()
120 | {
121 | Dependency = this.UpdateReactiveNowWithEcb( Dependency );
122 | Dependency.Complete();
123 | }
124 | }
125 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/TagComponentReactiveSystemTests.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d7726b2f7cd74108b35a6842c6771136
3 | timeCreated: 1667510358
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/TestBase.cs:
--------------------------------------------------------------------------------
1 | using NUnit.Framework;
2 | using Unity.Entities;
3 |
4 | namespace ReactiveDots.Tests
5 | {
6 | public abstract class TestBase
7 | {
8 | protected EntityManager EntityManager { private set; get; }
9 | protected World World { private set; get; }
10 |
11 | [SetUp]
12 | public void Setup()
13 | {
14 | World = new World( "Test World" );
15 | EntityManager = World.EntityManager;
16 | OnSetup();
17 | }
18 |
19 | protected virtual void OnSetup() { }
20 |
21 | [TearDown]
22 | public void TearDown()
23 | {
24 | if ( World != null && World.IsCreated ) {
25 | while ( World.Systems.Count > 0 )
26 | World.DestroySystem( World.Systems[0].SystemHandle );
27 | World.Dispose();
28 | }
29 |
30 | OnTearDown();
31 | }
32 |
33 | protected virtual void OnTearDown() { }
34 | }
35 | }
--------------------------------------------------------------------------------
/Assets/ReactiveDots/Tests/TestBase.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a77db1c0ece44c5fb9e43fe76b9e894b
3 | timeCreated: 1655485658
--------------------------------------------------------------------------------
/Assets/Sample.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 0f17f9a66617c9d46a0127754750b422
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Materials.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: dffe45ad00072c24cb6f713380e4da36
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Materials/Arena.mat:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &-2155446658487267480
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 11
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
13 | m_Name:
14 | m_EditorClassIdentifier:
15 | version: 7
16 | --- !u!21 &2100000
17 | Material:
18 | serializedVersion: 8
19 | m_ObjectHideFlags: 0
20 | m_CorrespondingSourceObject: {fileID: 0}
21 | m_PrefabInstance: {fileID: 0}
22 | m_PrefabAsset: {fileID: 0}
23 | m_Name: Arena
24 | m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
25 | m_Parent: {fileID: 0}
26 | m_ModifiedSerializedProperties: 0
27 | m_ValidKeywords: []
28 | m_InvalidKeywords: []
29 | m_LightmapFlags: 4
30 | m_EnableInstancingVariants: 0
31 | m_DoubleSidedGI: 0
32 | m_CustomRenderQueue: 2000
33 | stringTagMap:
34 | RenderType: Opaque
35 | disabledShaderPasses: []
36 | m_LockedProperties:
37 | m_SavedProperties:
38 | serializedVersion: 3
39 | m_TexEnvs:
40 | - _BaseMap:
41 | m_Texture: {fileID: 0}
42 | m_Scale: {x: 1, y: 1}
43 | m_Offset: {x: 0, y: 0}
44 | - _BumpMap:
45 | m_Texture: {fileID: 0}
46 | m_Scale: {x: 1, y: 1}
47 | m_Offset: {x: 0, y: 0}
48 | - _DetailAlbedoMap:
49 | m_Texture: {fileID: 0}
50 | m_Scale: {x: 1, y: 1}
51 | m_Offset: {x: 0, y: 0}
52 | - _DetailMask:
53 | m_Texture: {fileID: 0}
54 | m_Scale: {x: 1, y: 1}
55 | m_Offset: {x: 0, y: 0}
56 | - _DetailNormalMap:
57 | m_Texture: {fileID: 0}
58 | m_Scale: {x: 1, y: 1}
59 | m_Offset: {x: 0, y: 0}
60 | - _EmissionMap:
61 | m_Texture: {fileID: 0}
62 | m_Scale: {x: 1, y: 1}
63 | m_Offset: {x: 0, y: 0}
64 | - _MainTex:
65 | m_Texture: {fileID: 0}
66 | m_Scale: {x: 1, y: 1}
67 | m_Offset: {x: 0, y: 0}
68 | - _MetallicGlossMap:
69 | m_Texture: {fileID: 0}
70 | m_Scale: {x: 1, y: 1}
71 | m_Offset: {x: 0, y: 0}
72 | - _OcclusionMap:
73 | m_Texture: {fileID: 0}
74 | m_Scale: {x: 1, y: 1}
75 | m_Offset: {x: 0, y: 0}
76 | - _ParallaxMap:
77 | m_Texture: {fileID: 0}
78 | m_Scale: {x: 1, y: 1}
79 | m_Offset: {x: 0, y: 0}
80 | - _SpecGlossMap:
81 | m_Texture: {fileID: 0}
82 | m_Scale: {x: 1, y: 1}
83 | m_Offset: {x: 0, y: 0}
84 | - unity_Lightmaps:
85 | m_Texture: {fileID: 0}
86 | m_Scale: {x: 1, y: 1}
87 | m_Offset: {x: 0, y: 0}
88 | - unity_LightmapsInd:
89 | m_Texture: {fileID: 0}
90 | m_Scale: {x: 1, y: 1}
91 | m_Offset: {x: 0, y: 0}
92 | - unity_ShadowMasks:
93 | m_Texture: {fileID: 0}
94 | m_Scale: {x: 1, y: 1}
95 | m_Offset: {x: 0, y: 0}
96 | m_Ints: []
97 | m_Floats:
98 | - _AlphaClip: 0
99 | - _AlphaToMask: 0
100 | - _Blend: 0
101 | - _BlendModePreserveSpecular: 1
102 | - _BumpScale: 1
103 | - _ClearCoatMask: 0
104 | - _ClearCoatSmoothness: 0
105 | - _Cull: 2
106 | - _Cutoff: 0.5
107 | - _DetailAlbedoMapScale: 1
108 | - _DetailNormalMapScale: 1
109 | - _DstBlend: 0
110 | - _DstBlendAlpha: 0
111 | - _EnvironmentReflections: 1
112 | - _GlossMapScale: 1
113 | - _Glossiness: 0.645
114 | - _GlossyReflections: 1
115 | - _Metallic: 0
116 | - _Mode: 0
117 | - _OcclusionStrength: 1
118 | - _Parallax: 0.02
119 | - _QueueOffset: 0
120 | - _ReceiveShadows: 1
121 | - _Smoothness: 0.645
122 | - _SmoothnessTextureChannel: 0
123 | - _SpecularHighlights: 1
124 | - _SrcBlend: 1
125 | - _SrcBlendAlpha: 1
126 | - _Surface: 0
127 | - _UVSec: 0
128 | - _WorkflowMode: 1
129 | - _ZWrite: 1
130 | m_Colors:
131 | - _BaseColor: {r: 0.122641504, g: 0.122641504, b: 0.122641504, a: 1}
132 | - _Color: {r: 0.122641504, g: 0.122641504, b: 0.122641504, a: 1}
133 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
134 | - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
135 | m_BuildTextureStacks: []
136 |
--------------------------------------------------------------------------------
/Assets/Sample/Materials/Arena.mat.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 8487dd3a0e392484a816762248db4405
3 | NativeFormatImporter:
4 | externalObjects: {}
5 | mainObjectFileID: 2100000
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Materials/Ball.mat:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &-2149380126026704312
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 11
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
13 | m_Name:
14 | m_EditorClassIdentifier:
15 | version: 7
16 | --- !u!21 &2100000
17 | Material:
18 | serializedVersion: 8
19 | m_ObjectHideFlags: 0
20 | m_CorrespondingSourceObject: {fileID: 0}
21 | m_PrefabInstance: {fileID: 0}
22 | m_PrefabAsset: {fileID: 0}
23 | m_Name: Ball
24 | m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
25 | m_Parent: {fileID: 0}
26 | m_ModifiedSerializedProperties: 0
27 | m_ValidKeywords: []
28 | m_InvalidKeywords: []
29 | m_LightmapFlags: 4
30 | m_EnableInstancingVariants: 1
31 | m_DoubleSidedGI: 0
32 | m_CustomRenderQueue: 2000
33 | stringTagMap:
34 | RenderType: Opaque
35 | disabledShaderPasses: []
36 | m_LockedProperties:
37 | m_SavedProperties:
38 | serializedVersion: 3
39 | m_TexEnvs:
40 | - _BaseMap:
41 | m_Texture: {fileID: 0}
42 | m_Scale: {x: 1, y: 1}
43 | m_Offset: {x: 0, y: 0}
44 | - _BumpMap:
45 | m_Texture: {fileID: 0}
46 | m_Scale: {x: 1, y: 1}
47 | m_Offset: {x: 0, y: 0}
48 | - _DetailAlbedoMap:
49 | m_Texture: {fileID: 0}
50 | m_Scale: {x: 1, y: 1}
51 | m_Offset: {x: 0, y: 0}
52 | - _DetailMask:
53 | m_Texture: {fileID: 0}
54 | m_Scale: {x: 1, y: 1}
55 | m_Offset: {x: 0, y: 0}
56 | - _DetailNormalMap:
57 | m_Texture: {fileID: 0}
58 | m_Scale: {x: 1, y: 1}
59 | m_Offset: {x: 0, y: 0}
60 | - _EmissionMap:
61 | m_Texture: {fileID: 0}
62 | m_Scale: {x: 1, y: 1}
63 | m_Offset: {x: 0, y: 0}
64 | - _MainTex:
65 | m_Texture: {fileID: 0}
66 | m_Scale: {x: 1, y: 1}
67 | m_Offset: {x: 0, y: 0}
68 | - _MetallicGlossMap:
69 | m_Texture: {fileID: 0}
70 | m_Scale: {x: 1, y: 1}
71 | m_Offset: {x: 0, y: 0}
72 | - _OcclusionMap:
73 | m_Texture: {fileID: 0}
74 | m_Scale: {x: 1, y: 1}
75 | m_Offset: {x: 0, y: 0}
76 | - _ParallaxMap:
77 | m_Texture: {fileID: 0}
78 | m_Scale: {x: 1, y: 1}
79 | m_Offset: {x: 0, y: 0}
80 | - _SpecGlossMap:
81 | m_Texture: {fileID: 0}
82 | m_Scale: {x: 1, y: 1}
83 | m_Offset: {x: 0, y: 0}
84 | - unity_Lightmaps:
85 | m_Texture: {fileID: 0}
86 | m_Scale: {x: 1, y: 1}
87 | m_Offset: {x: 0, y: 0}
88 | - unity_LightmapsInd:
89 | m_Texture: {fileID: 0}
90 | m_Scale: {x: 1, y: 1}
91 | m_Offset: {x: 0, y: 0}
92 | - unity_ShadowMasks:
93 | m_Texture: {fileID: 0}
94 | m_Scale: {x: 1, y: 1}
95 | m_Offset: {x: 0, y: 0}
96 | m_Ints: []
97 | m_Floats:
98 | - _AlphaClip: 0
99 | - _AlphaToMask: 0
100 | - _Blend: 0
101 | - _BlendModePreserveSpecular: 1
102 | - _BumpScale: 1
103 | - _ClearCoatMask: 0
104 | - _ClearCoatSmoothness: 0
105 | - _Cull: 2
106 | - _Cutoff: 0.5
107 | - _DetailAlbedoMapScale: 1
108 | - _DetailNormalMapScale: 1
109 | - _DstBlend: 0
110 | - _DstBlendAlpha: 0
111 | - _EnvironmentReflections: 1
112 | - _GlossMapScale: 1
113 | - _Glossiness: 0
114 | - _GlossyReflections: 1
115 | - _Metallic: 0
116 | - _Mode: 0
117 | - _OcclusionStrength: 1
118 | - _Parallax: 0.02
119 | - _QueueOffset: 0
120 | - _ReceiveShadows: 1
121 | - _Smoothness: 0
122 | - _SmoothnessTextureChannel: 0
123 | - _SpecularHighlights: 1
124 | - _SrcBlend: 1
125 | - _SrcBlendAlpha: 1
126 | - _Surface: 0
127 | - _UVSec: 0
128 | - _WorkflowMode: 1
129 | - _ZWrite: 1
130 | m_Colors:
131 | - _BaseColor: {r: 0.5518868, g: 0.9475968, b: 1, a: 1}
132 | - _Color: {r: 0.5518868, g: 0.9475968, b: 1, a: 1}
133 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
134 | - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
135 | m_BuildTextureStacks: []
136 |
--------------------------------------------------------------------------------
/Assets/Sample/Materials/Ball.mat.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c5f2d32566a2607489eb4470cd0f6b74
3 | NativeFormatImporter:
4 | externalObjects: {}
5 | mainObjectFileID: 2100000
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Prefabs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 52bc928bd7f175b47a119cc083acccbc
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Prefabs/Ball.prefab:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1 &5568810793940415486
4 | GameObject:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | serializedVersion: 6
10 | m_Component:
11 | - component: {fileID: 5568810793940415483}
12 | - component: {fileID: 5568810793940415485}
13 | - component: {fileID: 5568810793940415484}
14 | - component: {fileID: 5568810793940415487}
15 | m_Layer: 0
16 | m_Name: Ball
17 | m_TagString: Untagged
18 | m_Icon: {fileID: 0}
19 | m_NavMeshLayer: 0
20 | m_StaticEditorFlags: 0
21 | m_IsActive: 1
22 | --- !u!4 &5568810793940415483
23 | Transform:
24 | m_ObjectHideFlags: 0
25 | m_CorrespondingSourceObject: {fileID: 0}
26 | m_PrefabInstance: {fileID: 0}
27 | m_PrefabAsset: {fileID: 0}
28 | m_GameObject: {fileID: 5568810793940415486}
29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
30 | m_LocalPosition: {x: 0, y: 0, z: 0}
31 | m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
32 | m_ConstrainProportionsScale: 0
33 | m_Children: []
34 | m_Father: {fileID: 0}
35 | m_RootOrder: 0
36 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
37 | --- !u!114 &5568810793940415485
38 | MonoBehaviour:
39 | m_ObjectHideFlags: 0
40 | m_CorrespondingSourceObject: {fileID: 0}
41 | m_PrefabInstance: {fileID: 0}
42 | m_PrefabAsset: {fileID: 0}
43 | m_GameObject: {fileID: 5568810793940415486}
44 | m_Enabled: 1
45 | m_EditorHideFlags: 0
46 | m_Script: {fileID: 11500000, guid: f944fc8427a04d2b88f6f577892ecec1, type: 3}
47 | m_Name:
48 | m_EditorClassIdentifier:
49 | --- !u!33 &5568810793940415484
50 | MeshFilter:
51 | m_ObjectHideFlags: 0
52 | m_CorrespondingSourceObject: {fileID: 0}
53 | m_PrefabInstance: {fileID: 0}
54 | m_PrefabAsset: {fileID: 0}
55 | m_GameObject: {fileID: 5568810793940415486}
56 | m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
57 | --- !u!23 &5568810793940415487
58 | MeshRenderer:
59 | m_ObjectHideFlags: 0
60 | m_CorrespondingSourceObject: {fileID: 0}
61 | m_PrefabInstance: {fileID: 0}
62 | m_PrefabAsset: {fileID: 0}
63 | m_GameObject: {fileID: 5568810793940415486}
64 | m_Enabled: 1
65 | m_CastShadows: 1
66 | m_ReceiveShadows: 1
67 | m_DynamicOccludee: 1
68 | m_StaticShadowCaster: 0
69 | m_MotionVectors: 1
70 | m_LightProbeUsage: 1
71 | m_ReflectionProbeUsage: 1
72 | m_RayTracingMode: 2
73 | m_RayTraceProcedural: 0
74 | m_RenderingLayerMask: 1
75 | m_RendererPriority: 0
76 | m_Materials:
77 | - {fileID: 2100000, guid: c5f2d32566a2607489eb4470cd0f6b74, type: 2}
78 | m_StaticBatchInfo:
79 | firstSubMesh: 0
80 | subMeshCount: 0
81 | m_StaticBatchRoot: {fileID: 0}
82 | m_ProbeAnchor: {fileID: 0}
83 | m_LightProbeVolumeOverride: {fileID: 0}
84 | m_ScaleInLightmap: 1
85 | m_ReceiveGI: 1
86 | m_PreserveUVs: 0
87 | m_IgnoreNormalsForChartDetection: 0
88 | m_ImportantGI: 0
89 | m_StitchLightmapSeams: 1
90 | m_SelectedEditorRenderState: 3
91 | m_MinimumChartSize: 4
92 | m_AutoUVMaxDistance: 0.5
93 | m_AutoUVMaxAngle: 89
94 | m_LightmapParameters: {fileID: 0}
95 | m_SortingLayerID: 0
96 | m_SortingLayer: 0
97 | m_SortingOrder: 0
98 | m_AdditionalVertexStreams: {fileID: 0}
99 |
--------------------------------------------------------------------------------
/Assets/Sample/Prefabs/Ball.prefab.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 7e6c38d84de1dd640b99f8e5850686f6
3 | PrefabImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/Sample/Scenes.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 27075e0ec319517489b5582ba88fea4a
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Scenes/SampleScene.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 55ba1906e7659134eb2e55b554ad1709
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Scenes/SampleScene.unity.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 9fc0d4010bbf28b4594072e72b8655ab
3 | DefaultImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/Sample/Scenes/SampleScene/SampleScene_SubScene.unity:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!29 &1
4 | OcclusionCullingSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_OcclusionBakeSettings:
8 | smallestOccluder: 5
9 | smallestHole: 0.25
10 | backfaceThreshold: 100
11 | m_SceneGUID: 00000000000000000000000000000000
12 | m_OcclusionCullingData: {fileID: 0}
13 | --- !u!104 &2
14 | RenderSettings:
15 | m_ObjectHideFlags: 0
16 | serializedVersion: 9
17 | m_Fog: 0
18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
19 | m_FogMode: 3
20 | m_FogDensity: 0.01
21 | m_LinearFogStart: 0
22 | m_LinearFogEnd: 300
23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
26 | m_AmbientIntensity: 1
27 | m_AmbientMode: 0
28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
30 | m_HaloStrength: 0.5
31 | m_FlareStrength: 1
32 | m_FlareFadeSpeed: 3
33 | m_HaloTexture: {fileID: 0}
34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
35 | m_DefaultReflectionMode: 0
36 | m_DefaultReflectionResolution: 128
37 | m_ReflectionBounces: 1
38 | m_ReflectionIntensity: 1
39 | m_CustomReflection: {fileID: 0}
40 | m_Sun: {fileID: 0}
41 | m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
42 | m_UseRadianceAmbientProbe: 0
43 | --- !u!157 &3
44 | LightmapSettings:
45 | m_ObjectHideFlags: 0
46 | serializedVersion: 12
47 | m_GIWorkflowMode: 1
48 | m_GISettings:
49 | serializedVersion: 2
50 | m_BounceScale: 1
51 | m_IndirectOutputScale: 1
52 | m_AlbedoBoost: 1
53 | m_EnvironmentLightingMode: 0
54 | m_EnableBakedLightmaps: 1
55 | m_EnableRealtimeLightmaps: 0
56 | m_LightmapEditorSettings:
57 | serializedVersion: 12
58 | m_Resolution: 2
59 | m_BakeResolution: 40
60 | m_AtlasSize: 1024
61 | m_AO: 0
62 | m_AOMaxDistance: 1
63 | m_CompAOExponent: 1
64 | m_CompAOExponentDirect: 0
65 | m_ExtractAmbientOcclusion: 0
66 | m_Padding: 2
67 | m_LightmapParameters: {fileID: 0}
68 | m_LightmapsBakeMode: 1
69 | m_TextureCompression: 1
70 | m_FinalGather: 0
71 | m_FinalGatherFiltering: 1
72 | m_FinalGatherRayCount: 256
73 | m_ReflectionCompression: 2
74 | m_MixedBakeMode: 2
75 | m_BakeBackend: 1
76 | m_PVRSampling: 1
77 | m_PVRDirectSampleCount: 32
78 | m_PVRSampleCount: 512
79 | m_PVRBounces: 2
80 | m_PVREnvironmentSampleCount: 256
81 | m_PVREnvironmentReferencePointCount: 2048
82 | m_PVRFilteringMode: 1
83 | m_PVRDenoiserTypeDirect: 1
84 | m_PVRDenoiserTypeIndirect: 1
85 | m_PVRDenoiserTypeAO: 1
86 | m_PVRFilterTypeDirect: 0
87 | m_PVRFilterTypeIndirect: 0
88 | m_PVRFilterTypeAO: 0
89 | m_PVREnvironmentMIS: 1
90 | m_PVRCulling: 1
91 | m_PVRFilteringGaussRadiusDirect: 1
92 | m_PVRFilteringGaussRadiusIndirect: 5
93 | m_PVRFilteringGaussRadiusAO: 2
94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5
95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2
96 | m_PVRFilteringAtrousPositionSigmaAO: 1
97 | m_ExportTrainingData: 0
98 | m_TrainingDataDestination: TrainingData
99 | m_LightProbeSampleCountMultiplier: 4
100 | m_LightingDataAsset: {fileID: 0}
101 | m_LightingSettings: {fileID: 0}
102 | --- !u!196 &4
103 | NavMeshSettings:
104 | serializedVersion: 2
105 | m_ObjectHideFlags: 0
106 | m_BuildSettings:
107 | serializedVersion: 3
108 | agentTypeID: 0
109 | agentRadius: 0.5
110 | agentHeight: 2
111 | agentSlope: 45
112 | agentClimb: 0.4
113 | ledgeDropHeight: 0
114 | maxJumpAcrossDistance: 0
115 | minRegionArea: 2
116 | manualCellSize: 0
117 | cellSize: 0.16666667
118 | manualTileSize: 0
119 | tileSize: 256
120 | buildHeightMesh: 0
121 | maxJobWorkers: 0
122 | preserveTilesOutsideBounds: 0
123 | debug:
124 | m_Flags: 0
125 | m_NavMeshData: {fileID: 0}
126 | --- !u!1 &966083334
127 | GameObject:
128 | m_ObjectHideFlags: 0
129 | m_CorrespondingSourceObject: {fileID: 0}
130 | m_PrefabInstance: {fileID: 0}
131 | m_PrefabAsset: {fileID: 0}
132 | serializedVersion: 6
133 | m_Component:
134 | - component: {fileID: 966083339}
135 | - component: {fileID: 966083336}
136 | - component: {fileID: 966083335}
137 | - component: {fileID: 966083340}
138 | m_Layer: 0
139 | m_Name: Arena
140 | m_TagString: Untagged
141 | m_Icon: {fileID: 0}
142 | m_NavMeshLayer: 0
143 | m_StaticEditorFlags: 0
144 | m_IsActive: 1
145 | --- !u!23 &966083335
146 | MeshRenderer:
147 | m_ObjectHideFlags: 0
148 | m_CorrespondingSourceObject: {fileID: 0}
149 | m_PrefabInstance: {fileID: 0}
150 | m_PrefabAsset: {fileID: 0}
151 | m_GameObject: {fileID: 966083334}
152 | m_Enabled: 1
153 | m_CastShadows: 1
154 | m_ReceiveShadows: 1
155 | m_DynamicOccludee: 1
156 | m_StaticShadowCaster: 0
157 | m_MotionVectors: 1
158 | m_LightProbeUsage: 1
159 | m_ReflectionProbeUsage: 1
160 | m_RayTracingMode: 2
161 | m_RayTraceProcedural: 0
162 | m_RenderingLayerMask: 1
163 | m_RendererPriority: 0
164 | m_Materials:
165 | - {fileID: 2100000, guid: 8487dd3a0e392484a816762248db4405, type: 2}
166 | m_StaticBatchInfo:
167 | firstSubMesh: 0
168 | subMeshCount: 0
169 | m_StaticBatchRoot: {fileID: 0}
170 | m_ProbeAnchor: {fileID: 0}
171 | m_LightProbeVolumeOverride: {fileID: 0}
172 | m_ScaleInLightmap: 1
173 | m_ReceiveGI: 1
174 | m_PreserveUVs: 0
175 | m_IgnoreNormalsForChartDetection: 0
176 | m_ImportantGI: 0
177 | m_StitchLightmapSeams: 1
178 | m_SelectedEditorRenderState: 3
179 | m_MinimumChartSize: 4
180 | m_AutoUVMaxDistance: 0.5
181 | m_AutoUVMaxAngle: 89
182 | m_LightmapParameters: {fileID: 0}
183 | m_SortingLayerID: 0
184 | m_SortingLayer: 0
185 | m_SortingOrder: 0
186 | m_AdditionalVertexStreams: {fileID: 0}
187 | --- !u!33 &966083336
188 | MeshFilter:
189 | m_ObjectHideFlags: 0
190 | m_CorrespondingSourceObject: {fileID: 0}
191 | m_PrefabInstance: {fileID: 0}
192 | m_PrefabAsset: {fileID: 0}
193 | m_GameObject: {fileID: 966083334}
194 | m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
195 | --- !u!4 &966083339
196 | Transform:
197 | m_ObjectHideFlags: 0
198 | m_CorrespondingSourceObject: {fileID: 0}
199 | m_PrefabInstance: {fileID: 0}
200 | m_PrefabAsset: {fileID: 0}
201 | m_GameObject: {fileID: 966083334}
202 | m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
203 | m_LocalPosition: {x: 0, y: 0, z: 0}
204 | m_LocalScale: {x: 10, y: 10, z: 1}
205 | m_ConstrainProportionsScale: 0
206 | m_Children: []
207 | m_Father: {fileID: 0}
208 | m_RootOrder: 0
209 | m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
210 | --- !u!114 &966083340
211 | MonoBehaviour:
212 | m_ObjectHideFlags: 0
213 | m_CorrespondingSourceObject: {fileID: 0}
214 | m_PrefabInstance: {fileID: 0}
215 | m_PrefabAsset: {fileID: 0}
216 | m_GameObject: {fileID: 966083334}
217 | m_Enabled: 1
218 | m_EditorHideFlags: 0
219 | m_Script: {fileID: 11500000, guid: a157f33e150f4b14a8812f684f0b1740, type: 3}
220 | m_Name:
221 | m_EditorClassIdentifier:
222 | size: 10
223 | ballPrefab: {fileID: 5568810793940415486, guid: 7e6c38d84de1dd640b99f8e5850686f6, type: 3}
224 |
--------------------------------------------------------------------------------
/Assets/Sample/Scenes/SampleScene/SampleScene_SubScene.unity.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 91ba7748e21932247812702ffeac52b6
3 | DefaultImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/Sample/Scripts.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 91f4ab1aab3a2674582fbd5c6ab5754e
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Authoring.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d0b55602794d43df9b37f044c5c663e2
3 | timeCreated: 1654540556
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Authoring/ArenaAuthoring.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 | using UnityEngine;
3 |
4 | namespace ReactiveDotsSample
5 | {
6 | public class ArenaAuthoring : MonoBehaviour
7 | {
8 | public float size;
9 | public GameObject ballPrefab;
10 |
11 | public class Baker : Baker
12 | {
13 | public override void Bake( ArenaAuthoring authoring )
14 | {
15 | AddComponent( new Arena {
16 | Size = authoring.size,
17 | BallPrefab = GetEntity( authoring.ballPrefab )
18 | } );
19 | }
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Authoring/ArenaAuthoring.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a157f33e150f4b14a8812f684f0b1740
3 | timeCreated: 1665697147
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Authoring/BallAuthoring.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 | using UnityEngine;
3 |
4 | namespace ReactiveDotsSample
5 | {
6 | public class BallAuthoring : MonoBehaviour
7 | {
8 | public class Baker : Baker
9 | {
10 | public override void Bake( BallAuthoring authoring )
11 | {
12 | AddComponent( new ComponentTypeSet(
13 | typeof(Ball),
14 | typeof(MoveDirection),
15 | typeof(Bounces),
16 | typeof(Speed) )
17 | );
18 | }
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Authoring/BallAuthoring.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: f944fc8427a04d2b88f6f577892ecec1
3 | timeCreated: 1654540569
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: cb9b3d6b4e794ff3b4dedc3f4a750755
3 | timeCreated: 1654538394
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/Arena.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 | using Unity.Mathematics;
3 | using UnityEngine;
4 |
5 | namespace ReactiveDotsSample
6 | {
7 | public struct Arena : IComponentData
8 | {
9 | public float2 Size;
10 | public Entity BallPrefab;
11 | }
12 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/Arena.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 74e0be792dfa44ab838f519b904bc1c5
3 | timeCreated: 1654538690
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/Ball.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 |
3 | namespace ReactiveDotsSample
4 | {
5 | public struct Ball : IComponentData { }
6 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/Ball.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: b56a38e770be4336bf97a2208c576549
3 | timeCreated: 1654538406
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/Bounces.cs:
--------------------------------------------------------------------------------
1 | using ReactiveDots;
2 | using Unity.Entities;
3 |
4 | namespace ReactiveDotsSample
5 | {
6 | [ReactiveEvent( EventType.All )]
7 | public struct Bounces : IComponentData, IEnableableComponent
8 | {
9 | public int Value;
10 | }
11 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/Bounces.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 4d5424f0a8fb4dcf8669872d3de0a7c0
3 | timeCreated: 1654538453
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/MoveDirection.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 | using Unity.Mathematics;
3 |
4 | namespace ReactiveDotsSample
5 | {
6 | public struct MoveDirection : IComponentData, IEnableableComponent
7 | {
8 | public float3 Value;
9 | public int Test;
10 | }
11 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/MoveDirection.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c825d3a4870b4724b64657db09e1c459
3 | timeCreated: 1654538547
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/ReactiveComponentStateChangeRequest.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 |
3 | namespace ReactiveDotsSample
4 | {
5 | public struct ReactiveComponentStateChangeRequest : IComponentData
6 | {
7 | public bool newState;
8 | }
9 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/ReactiveComponentStateChangeRequest.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: cb4bab3d4169402ba746bc87603e1956
3 | timeCreated: 1666647935
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/Speed.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 |
3 | namespace ReactiveDotsSample
4 | {
5 | public struct Speed : IComponentData
6 | {
7 | public float Value;
8 | }
9 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Components/Speed.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: da49148a35224278916b4444084e6a1b
3 | timeCreated: 1654538476
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Listeners.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: ccd51013f0c17264dbd8081e47d4c299
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Listeners/BouncesListener.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 | using UnityEngine;
3 |
4 | namespace ReactiveDotsSample
5 | {
6 | public class BouncesListener : MonoBehaviour, IAnyBouncesAddedListener, IAnyBouncesChangedListener,
7 | IAnyBouncesRemovedListener
8 | {
9 | private void Awake()
10 | {
11 | var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
12 | var listenerEntity = entityManager.CreateEntity();
13 | entityManager.AddComponentData( listenerEntity, new AnyBouncesAddedListener() { Value = this } );
14 | entityManager.AddComponentData( listenerEntity, new AnyBouncesRemovedListener() { Value = this } );
15 | entityManager.AddComponentData( listenerEntity, new AnyBouncesChangedListener() { Value = this } );
16 | }
17 |
18 | public void OnAnyBouncesAdded( Entity entity, Bounces bounces, World world )
19 | {
20 | Debug.Log(
21 | $"New bounce #{bounces.Value} for entity with id={entity.Index}" );
22 | }
23 |
24 | public void OnAnyBouncesChanged( Entity entity, Bounces bounces, World world )
25 | {
26 | Debug.Log(
27 | $"Updated bounce #{bounces.Value} for entity with id={entity.Index}" );
28 | }
29 |
30 | public void OnAnyBouncesRemoved( Entity entity, World world )
31 | {
32 | Debug.Log(
33 | $"Bounce removed from entity with id={entity.Index}" );
34 | }
35 | }
36 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Listeners/BouncesListener.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 47e56041c5d34b7f896da02a34a77e64
3 | timeCreated: 1654550102
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Listeners/SpeedListener.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 | using UnityEngine;
3 |
4 | namespace ReactiveDotsSample
5 | {
6 | public class SpeedListener : MonoBehaviour, IAnySpeedAddedListener, IAnySpeedChangedListener,
7 | IAnySpeedRemovedListener
8 | {
9 | private void Awake()
10 | {
11 | var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
12 | var listenerEntity = entityManager.CreateEntity();
13 | entityManager.AddComponentData( listenerEntity, new AnySpeedAddedListener() { Value = this } );
14 | entityManager.AddComponentData( listenerEntity, new AnySpeedRemovedListener() { Value = this } );
15 | entityManager.AddComponentData( listenerEntity, new AnySpeedChangedListener() { Value = this } );
16 | }
17 |
18 | public void OnAnySpeedAdded( Entity entity, Speed component, World world )
19 | {
20 | Debug.Log(
21 | $"New speed={component.Value} for entity with id={entity.Index}" );
22 | }
23 |
24 | public void OnAnySpeedChanged( Entity entity, Speed component, World world )
25 | {
26 | Debug.Log(
27 | $"Updated speed={component.Value} for entity with id={entity.Index}" );
28 | }
29 |
30 | public void OnAnySpeedRemoved( Entity entity, World world )
31 | {
32 | Debug.Log(
33 | $"Speed removed from entity with id={entity.Index}" );
34 | }
35 | }
36 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Listeners/SpeedListener.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: ef33001943154918a197d6ab81a35227
3 | timeCreated: 1655559933
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 802866c1fc0b41e683afc2eadca57636
3 | timeCreated: 1654538491
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/BallInitSystem.cs:
--------------------------------------------------------------------------------
1 | using ReactiveDots;
2 | using Unity.Entities;
3 | using Unity.Mathematics;
4 | using UnityEngine;
5 |
6 | namespace ReactiveDotsSample
7 | {
8 | [UpdateBefore( typeof(BallMovementSystem) )]
9 | [ReactiveSystem( typeof(MoveDirection), typeof(MoveDirectionReactive) )]
10 | public partial class BallInitSystem : SystemBase
11 | {
12 | public struct MoveDirectionReactive : ICleanupComponentData
13 | {
14 | public ComponentReactiveData Value;
15 | }
16 |
17 | protected override void OnUpdate()
18 | {
19 | Dependency = Entities.WithNone().ForEach(
20 | ( Entity e, ref MoveDirection moveDir, ref Speed speed ) =>
21 | {
22 | var random = Unity.Mathematics.Random.CreateFromIndex( (uint)e.Index );
23 | var randomRot = random.NextFloat( 0, 360 );
24 | var randomSpeed = random.NextFloat( 1f, 5f );
25 | moveDir.Value = math.mul( quaternion.RotateY( randomRot ), new float3( 0f, 0f, 1f ) );
26 | speed.Value = randomSpeed;
27 | } ).ScheduleParallel( Dependency );
28 | Dependency = this.UpdateReactive( Dependency );
29 | }
30 | }
31 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/BallInitSystem.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: eb8a09123bce49fb9e2ea6b724068ac1
3 | timeCreated: 1655847142
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/BallMovementSystem.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 | using Unity.Mathematics;
3 | using Unity.Transforms;
4 |
5 | namespace ReactiveDotsSample
6 | {
7 | public partial class BallMovementSystem : SystemBase
8 | {
9 | protected override void OnCreate()
10 | {
11 | RequireForUpdate();
12 | }
13 |
14 | protected override void OnUpdate()
15 | {
16 | var arenaSize = GetSingleton().Size;
17 | var arenaBounds = new float4( -arenaSize.x / 2f, -arenaSize.y / 2f, arenaSize.x / 2f, arenaSize.y / 2f );
18 | var dt = SystemAPI.Time.DeltaTime;
19 |
20 | Entities.ForEach( ( ref MoveDirection direction, ref LocalToWorldTransform transform, in Speed speed ) =>
21 | {
22 | var pos = transform.Value.Position;
23 | var moveDelta = direction.Value * speed.Value * dt;
24 | var newPos = pos + moveDelta;
25 | if ( IsInBounds( newPos, arenaBounds ) )
26 | transform.Value.Position = newPos;
27 | else
28 | direction.Value = GetNewDirection( direction.Value, newPos, arenaBounds );
29 | } ).ScheduleParallel();
30 | }
31 |
32 | private static float3 GetNewDirection( float3 directionValue, float3 pos, float4 bounds )
33 | {
34 | if ( pos.x < bounds.x )
35 | directionValue.x *= -1;
36 | if ( pos.z < bounds.y )
37 | directionValue.z *= -1;
38 | if ( pos.x > bounds.z )
39 | directionValue.x *= -1;
40 | if ( pos.z > bounds.w )
41 | directionValue.z *= -1;
42 | return directionValue;
43 | }
44 |
45 | private static bool IsInBounds( float3 pos, float4 bounds )
46 | {
47 | if ( pos.x < bounds.x )
48 | return false;
49 | if ( pos.z < bounds.y )
50 | return false;
51 | if ( pos.x > bounds.z )
52 | return false;
53 | if ( pos.z > bounds.w )
54 | return false;
55 | return true;
56 | }
57 | }
58 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/BallMovementSystem.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 25440ffe57084df3824025b38d34fc1e
3 | timeCreated: 1654538503
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/BounceCountSystem.cs:
--------------------------------------------------------------------------------
1 | using ReactiveDots;
2 | using Unity.Entities;
3 |
4 | namespace ReactiveDotsSample
5 | {
6 | [UpdateAfter( typeof(BallMovementSystem) )]
7 | [ReactiveSystem( typeof(MoveDirection), typeof(MoveDirectionReactive) )]
8 | public partial class BounceCountSystem : SystemBase
9 | {
10 | public struct MoveDirectionReactive : ICleanupComponentData
11 | {
12 | public ComponentReactiveData Value;
13 | }
14 |
15 | public enum UpdateType
16 | {
17 | NowWithEntityManager,
18 | NowWithEcb,
19 | WithExternalEcb
20 | }
21 |
22 | public UpdateType updateType;
23 |
24 | private EndSimulationEntityCommandBufferSystem _externalCommandBufferSystem;
25 |
26 | protected override void OnCreate()
27 | {
28 | base.OnCreate();
29 | _externalCommandBufferSystem = World.GetOrCreateSystemManaged();
30 | }
31 |
32 | protected override void OnUpdate()
33 | {
34 | Entities.ForEach( ( ref Bounces bounces, in MoveDirectionReactive moveDirReactive ) =>
35 | {
36 | if ( moveDirReactive.Value.Changed )
37 | bounces.Value += 1;
38 | } ).ScheduleParallel();
39 |
40 | switch ( updateType ) {
41 | case UpdateType.NowWithEntityManager:
42 | Dependency = this.UpdateReactiveNowWithEntityManager( Dependency );
43 | break;
44 | case UpdateType.NowWithEcb:
45 | Dependency = this.UpdateReactiveNowWithEcb( Dependency );
46 | break;
47 | case UpdateType.WithExternalEcb:
48 | var ecbForAdded = _externalCommandBufferSystem.CreateCommandBuffer();
49 | var ecbForMissingTag = _externalCommandBufferSystem.CreateCommandBuffer();
50 | var ecbForCleanup = _externalCommandBufferSystem.CreateCommandBuffer();
51 | Dependency = this.UpdateReactive( Dependency, ecbForAdded, ecbForMissingTag, ecbForCleanup );
52 | _externalCommandBufferSystem.AddJobHandleForProducer( Dependency );
53 | break;
54 | }
55 | }
56 | }
57 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/BounceCountSystem.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 2f6bf2fd9fb24e1588f935ae3a0093a9
3 | timeCreated: 1654540010
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/CustomEventSystem.cs:
--------------------------------------------------------------------------------
1 | using ReactiveDots;
2 | using Unity.Collections;
3 | using Unity.Entities;
4 |
5 | namespace ReactiveDotsSample
6 | {
7 | [ReactiveEventFor( typeof(Speed), EventType.All, typeof(CustomEventSystem) )]
8 | [UpdateInGroup( typeof(LateSimulationSystemGroup) )]
9 | [ReactiveEventSystem]
10 | public partial class CustomEventSystem : SystemBase
11 | {
12 | protected override void OnCreate()
13 | {
14 | base.OnCreate();
15 | InitWithAttribute.InvokeInitMethodsFor( this );
16 | }
17 |
18 | protected override void OnUpdate()
19 | {
20 | var ecbForAdded = new EntityCommandBuffer( Allocator.TempJob );
21 | var ecbForMissingTag = new EntityCommandBuffer( Allocator.TempJob );
22 | var ecbForCleanup = new EntityCommandBuffer( Allocator.TempJob );
23 | Dependency = UpdateReactive( Dependency, ecbForAdded.AsParallelWriter(),
24 | ecbForMissingTag.AsParallelWriter(), ecbForCleanup.AsParallelWriter() );
25 | Dependency.Complete();
26 | ecbForAdded.Playback( EntityManager );
27 | ecbForAdded.Dispose();
28 | Dependency = FireEvents( Dependency );
29 | ecbForMissingTag.Playback( EntityManager );
30 | ecbForMissingTag.Dispose();
31 | ecbForCleanup.Playback( EntityManager );
32 | ecbForCleanup.Dispose();
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/CustomEventSystem.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 8947a3576e944b8f9d3868c3be151de8
3 | timeCreated: 1654549059
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/ReactiveComponentEnableableStateChangeSystem.cs:
--------------------------------------------------------------------------------
1 | using Unity.Entities;
2 |
3 | namespace ReactiveDotsSample
4 | {
5 | public partial class ReactiveComponentEnableableStateChangeSystem : SystemBase
6 | {
7 | private EndSimulationEntityCommandBufferSystem _commandBufferSystem;
8 |
9 | protected override void OnCreate()
10 | {
11 | RequireForUpdate();
12 | _commandBufferSystem = World.GetOrCreateSystemManaged();
13 | }
14 |
15 | protected override void OnUpdate()
16 | {
17 | var ecb = _commandBufferSystem.CreateCommandBuffer().AsParallelWriter();
18 | var ecbForRequest = _commandBufferSystem.CreateCommandBuffer().AsParallelWriter();
19 | var newState = GetSingleton().newState;
20 |
21 | Entities.WithAll()
22 | .WithEntityQueryOptions( EntityQueryOptions.IgnoreComponentEnabledState )
23 | .ForEach( ( Entity entity, int entityInQueryIndex ) =>
24 | {
25 | ecb.SetComponentEnabled( entityInQueryIndex, entity, newState );
26 | } )
27 | .ScheduleParallel();
28 |
29 | Entities.WithAll()
30 | .ForEach( ( Entity entity, int entityInQueryIndex ) =>
31 | {
32 | ecbForRequest.DestroyEntity( entityInQueryIndex, entity );
33 | } )
34 | .ScheduleParallel();
35 |
36 | _commandBufferSystem.AddJobHandleForProducer( Dependency );
37 | }
38 | }
39 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Systems/ReactiveComponentEnableableStateChangeSystem.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 198f26bd6ae647b0abe91e4997212816
3 | timeCreated: 1666648159
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Views.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 64252d0679f04fbea4bd90595214bd7b
3 | timeCreated: 1654550043
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Views/UiManager.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using ReactiveDots;
3 | using Unity.Collections;
4 | using Unity.Entities;
5 | using UnityEngine;
6 | using UnityEngine.UI;
7 |
8 | namespace ReactiveDotsSample
9 | {
10 | public class UiManager : MonoBehaviour
11 | {
12 | public Button destroyAllBalls;
13 | public Button spawnBallButton;
14 | public Button spawnBalls100Button;
15 | public Button spawnBalls10000Button;
16 | public Button spawnBalls100000Button;
17 | public Button spawnBalls1000000Button;
18 | public Toggle everyFrameSpawn;
19 | public InputField everyFrameSpawnAmountField;
20 | public Toggle eventSystemsToggle;
21 | public Text eventSystemInfo;
22 | public Button updateWithoutEcbButton;
23 | public Button updateWithTempEcbButton;
24 | public Button updateWithExternalEcbButton;
25 | public Button switchComponentStateButton;
26 | public Text switchComponentStateLabel;
27 |
28 | private bool _currentComponentState = false;
29 |
30 | private void Awake()
31 | {
32 | destroyAllBalls.onClick.AddListener( DestroyAllBalls );
33 | spawnBallButton.onClick.AddListener( () => SpawnBalls( 1 ) );
34 | spawnBalls100Button.onClick.AddListener( () => SpawnBalls( 100 ) );
35 | spawnBalls10000Button.onClick.AddListener( () => SpawnBalls( 10000 ) );
36 | spawnBalls100000Button.onClick.AddListener( () => SpawnBalls( 100000 ) );
37 | spawnBalls1000000Button.onClick.AddListener( () => SpawnBalls( 1000000 ) );
38 | eventSystemsToggle.onValueChanged.AddListener( ( _ ) => UpdateEventSystems() );
39 | updateWithoutEcbButton.onClick.AddListener( () =>
40 | SetUpdate( BounceCountSystem.UpdateType.NowWithEntityManager ) );
41 | updateWithTempEcbButton.onClick.AddListener( () => SetUpdate( BounceCountSystem.UpdateType.NowWithEcb ) );
42 | updateWithExternalEcbButton.onClick.AddListener( () =>
43 | SetUpdate( BounceCountSystem.UpdateType.WithExternalEcb ) );
44 | switchComponentStateButton.onClick.AddListener( SwitchComponentState );
45 | SwitchComponentState();
46 | UpdateEventSystems();
47 | SetUpdate( BounceCountSystem.UpdateType.NowWithEcb );
48 | }
49 |
50 | private void SwitchComponentState()
51 | {
52 | _currentComponentState = !_currentComponentState;
53 | switchComponentStateLabel.text =
54 | _currentComponentState ? "Reactive component enabled" : "Reactive component disabled";
55 | var requestEntity = World.DefaultGameObjectInjectionWorld.EntityManager.CreateEntity();
56 | World.DefaultGameObjectInjectionWorld.EntityManager.AddComponentData(
57 | requestEntity,
58 | new ReactiveComponentStateChangeRequest() { newState = _currentComponentState }
59 | );
60 | }
61 |
62 | private void Update()
63 | {
64 | if ( everyFrameSpawn.isOn ) {
65 | var amount = int.Parse( everyFrameSpawnAmountField.text );
66 | SpawnBalls( amount );
67 | }
68 | }
69 |
70 | private void DestroyAllBalls()
71 | {
72 | var em = World.DefaultGameObjectInjectionWorld.EntityManager;
73 | var query = em.CreateEntityQuery( typeof(Ball) );
74 | var balls = query.ToEntityArray( Allocator.Temp );
75 | em.DestroyEntity( balls );
76 | balls.Dispose();
77 | }
78 |
79 | private void SetUpdate( BounceCountSystem.UpdateType type )
80 | {
81 | switch ( type ) {
82 | case BounceCountSystem.UpdateType.NowWithEntityManager:
83 | updateWithoutEcbButton.GetComponent().color = Color.green;
84 | updateWithTempEcbButton.GetComponent().color = Color.white;
85 | updateWithExternalEcbButton.GetComponent().color = Color.white;
86 | break;
87 | case BounceCountSystem.UpdateType.NowWithEcb:
88 | updateWithoutEcbButton.GetComponent().color = Color.white;
89 | updateWithTempEcbButton.GetComponent().color = Color.green;
90 | updateWithExternalEcbButton.GetComponent().color = Color.white;
91 | break;
92 | case BounceCountSystem.UpdateType.WithExternalEcb:
93 | updateWithoutEcbButton.GetComponent().color = Color.white;
94 | updateWithTempEcbButton.GetComponent().color = Color.white;
95 | updateWithExternalEcbButton.GetComponent().color = Color.green;
96 | break;
97 | }
98 |
99 | World.DefaultGameObjectInjectionWorld.GetOrCreateSystemManaged().updateType = type;
100 | }
101 |
102 | private void UpdateEventSystems()
103 | {
104 | var enabled = eventSystemsToggle.isOn;
105 | World.DefaultGameObjectInjectionWorld.GetOrCreateSystemManaged().Enabled = enabled;
106 | World.DefaultGameObjectInjectionWorld.GetOrCreateSystemManaged().Enabled = enabled;
107 | eventSystemInfo.text = enabled
108 | ? "Event systems are now enabled. Disable them if you are testing a large number of entities."
109 | : "Event systems are now disabled. Keep them disable if you are testing a large number of entities.";
110 | }
111 |
112 | private void SpawnBalls( int amount )
113 | {
114 | var prefab = World.DefaultGameObjectInjectionWorld.GetOrCreateSystemManaged()
115 | .GetSingleton().BallPrefab;
116 | World.DefaultGameObjectInjectionWorld.EntityManager
117 | .Instantiate( prefab, amount, Allocator.Temp )
118 | .Dispose();
119 | }
120 | }
121 | }
--------------------------------------------------------------------------------
/Assets/Sample/Scripts/Views/UiManager.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 5444041e1e9746f59b2b847c1a7b2eba
3 | timeCreated: 1654538177
--------------------------------------------------------------------------------
/Assets/Sample/UniversalRenderPipelineAsset.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &11400000
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
13 | m_Name: UniversalRenderPipelineAsset
14 | m_EditorClassIdentifier:
15 | k_AssetVersion: 11
16 | k_AssetPreviousVersion: 11
17 | m_RendererType: 1
18 | m_RendererData: {fileID: 0}
19 | m_RendererDataList:
20 | - {fileID: 11400000, guid: 76dc0b1dddce920449c453592752ddd0, type: 2}
21 | m_DefaultRendererIndex: 0
22 | m_RequireDepthTexture: 0
23 | m_RequireOpaqueTexture: 0
24 | m_OpaqueDownsampling: 1
25 | m_SupportsTerrainHoles: 1
26 | m_SupportsHDR: 1
27 | m_HDRColorBufferPrecision: 0
28 | m_MSAA: 1
29 | m_RenderScale: 1
30 | m_UpscalingFilter: 0
31 | m_FsrOverrideSharpness: 0
32 | m_FsrSharpness: 0.92
33 | m_EnableLODCrossFade: 1
34 | m_LODCrossFadeDitheringType: 1
35 | m_MainLightRenderingMode: 1
36 | m_MainLightShadowsSupported: 1
37 | m_MainLightShadowmapResolution: 2048
38 | m_AdditionalLightsRenderingMode: 1
39 | m_AdditionalLightsPerObjectLimit: 4
40 | m_AdditionalLightShadowsSupported: 0
41 | m_AdditionalLightsShadowmapResolution: 512
42 | m_AdditionalLightsShadowResolutionTierLow: 128
43 | m_AdditionalLightsShadowResolutionTierMedium: 256
44 | m_AdditionalLightsShadowResolutionTierHigh: 512
45 | m_ReflectionProbeBlending: 0
46 | m_ReflectionProbeBoxProjection: 0
47 | m_ShadowDistance: 50
48 | m_ShadowCascadeCount: 1
49 | m_Cascade2Split: 0.25
50 | m_Cascade3Split: {x: 0.1, y: 0.3}
51 | m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467}
52 | m_CascadeBorder: 0.1
53 | m_ShadowDepthBias: 1
54 | m_ShadowNormalBias: 1
55 | m_SoftShadowsSupported: 0
56 | m_ConservativeEnclosingSphere: 0
57 | m_NumIterationsEnclosingSphere: 64
58 | m_AdditionalLightsCookieResolution: 2048
59 | m_AdditionalLightsCookieFormat: 3
60 | m_UseSRPBatcher: 1
61 | m_SupportsDynamicBatching: 0
62 | m_MixedLightingSupported: 1
63 | m_SupportsLightCookies: 1
64 | m_SupportsLightLayers: 0
65 | m_DebugLevel: 0
66 | m_StoreActionsOptimization: 0
67 | m_EnableRenderGraph: 0
68 | m_UseAdaptivePerformance: 1
69 | m_ColorGradingMode: 0
70 | m_ColorGradingLutSize: 32
71 | m_UseFastSRGBLinearConversion: 0
72 | m_ShadowType: 1
73 | m_LocalShadowsSupported: 0
74 | m_LocalShadowsAtlasResolution: 256
75 | m_MaxPixelLights: 0
76 | m_ShadowAtlasResolution: 256
77 | m_VolumeFrameworkUpdateMode: 0
78 | m_Textures:
79 | blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3}
80 | bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3}
81 | m_ShaderVariantLogLevel: 0
82 | m_ShadowCascades: 0
83 |
--------------------------------------------------------------------------------
/Assets/Sample/UniversalRenderPipelineAsset.asset.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: dcfb393475f9db349b0e942359d96e97
3 | NativeFormatImporter:
4 | externalObjects: {}
5 | mainObjectFileID: 11400000
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/Sample/UniversalRenderPipelineAsset_Renderer.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &11400000
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3}
13 | m_Name: UniversalRenderPipelineAsset_Renderer
14 | m_EditorClassIdentifier:
15 | debugShaders:
16 | debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3}
17 | m_RendererFeatures: []
18 | m_RendererFeatureMap:
19 | m_UseNativeRenderPass: 0
20 | postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2}
21 | xrSystemData: {fileID: 11400000, guid: 60e1133243b97e347b653163a8c01b64, type: 2}
22 | shaders:
23 | blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3}
24 | copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3}
25 | screenSpaceShadowPS: {fileID: 4800000, guid: 0f854b35a0cf61a429bd5dcfea30eddd, type: 3}
26 | samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3}
27 | stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3}
28 | fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3}
29 | fallbackLoadingPS: {fileID: 4800000, guid: 7f888aff2ac86494babad1c2c5daeee2, type: 3}
30 | materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3}
31 | coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3}
32 | coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3}
33 | cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, type: 3}
34 | objectMotionVector: {fileID: 4800000, guid: 7b3ede40266cd49a395def176e1bc486, type: 3}
35 | m_AssetVersion: 2
36 | m_OpaqueLayerMask:
37 | serializedVersion: 2
38 | m_Bits: 4294967295
39 | m_TransparentLayerMask:
40 | serializedVersion: 2
41 | m_Bits: 4294967295
42 | m_DefaultStencilState:
43 | overrideStencilState: 0
44 | stencilReference: 0
45 | stencilCompareFunction: 8
46 | passOperation: 2
47 | failOperation: 0
48 | zFailOperation: 0
49 | m_ShadowTransparentReceive: 1
50 | m_RenderingMode: 0
51 | m_DepthPrimingMode: 0
52 | m_CopyDepthMode: 0
53 | m_AccurateGbufferNormals: 0
54 | m_IntermediateTextureMode: 1
55 |
--------------------------------------------------------------------------------
/Assets/Sample/UniversalRenderPipelineAsset_Renderer.asset.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 76dc0b1dddce920449c453592752ddd0
3 | NativeFormatImporter:
4 | externalObjects: {}
5 | mainObjectFileID: 11400000
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/SceneDependencyCache.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c69cc04bd04b5f64da74a1e099cd94f4
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Assets/SceneDependencyCache/95073d28cdb5319dcd180fba5272fc04.sceneWithBuildSettings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PanMadzior/ReactiveDots/b8b41ae7021426a943b089339c1771c18e573c8f/Assets/SceneDependencyCache/95073d28cdb5319dcd180fba5272fc04.sceneWithBuildSettings
--------------------------------------------------------------------------------
/Assets/SceneDependencyCache/95073d28cdb5319dcd180fba5272fc04.sceneWithBuildSettings.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 95073d28cdb5319dcd180fba5272fc04
3 | DefaultImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/SceneDependencyCache/9f093bd59a522979f4b40bb81c6d6151.sceneWithBuildSettings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PanMadzior/ReactiveDots/b8b41ae7021426a943b089339c1771c18e573c8f/Assets/SceneDependencyCache/9f093bd59a522979f4b40bb81c6d6151.sceneWithBuildSettings
--------------------------------------------------------------------------------
/Assets/SceneDependencyCache/9f093bd59a522979f4b40bb81c6d6151.sceneWithBuildSettings.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 9f093bd59a522979f4b40bb81c6d6151
3 | DefaultImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Assets/UniversalRenderPipelineGlobalSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &11400000
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 11500000, guid: 2ec995e51a6e251468d2a3fd8a686257, type: 3}
13 | m_Name: UniversalRenderPipelineGlobalSettings
14 | m_EditorClassIdentifier:
15 | k_AssetVersion: 3
16 | m_RenderingLayerNames:
17 | - Default
18 | m_ValidRenderingLayers: 1
19 | lightLayerName0:
20 | lightLayerName1:
21 | lightLayerName2:
22 | lightLayerName3:
23 | lightLayerName4:
24 | lightLayerName5:
25 | lightLayerName6:
26 | lightLayerName7:
27 | m_StripDebugVariants: 1
28 | m_StripUnusedPostProcessingVariants: 0
29 | m_StripUnusedVariants: 1
30 | m_StripUnusedLODCrossFadeVariants: 1
31 | m_StripScreenCoordOverrideVariants: 1
32 | supportRuntimeDebugDisplay: 0
33 | m_ShaderVariantLogLevel: 0
34 | m_ExportShaderVariants: 1
35 |
--------------------------------------------------------------------------------
/Assets/UniversalRenderPipelineGlobalSettings.asset.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a8961b5000a4fe04890420c8d9c64a96
3 | NativeFormatImporter:
4 | externalObjects: {}
5 | mainObjectFileID: 11400000
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Packages/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "com.unity.ai.navigation": "1.1.0-pre.1",
4 | "com.unity.collab-proxy": "1.17.2",
5 | "com.unity.collections": "1.2.4",
6 | "com.unity.entities": "1.0.0-exp.12",
7 | "com.unity.ide.rider": "3.0.15",
8 | "com.unity.ide.visualstudio": "2.0.16",
9 | "com.unity.ide.vscode": "1.2.5",
10 | "com.unity.render-pipelines.universal": "14.0.3",
11 | "com.unity.rendering.hybrid": "0.61.0-preview.7",
12 | "com.unity.test-framework": "1.1.33",
13 | "com.unity.textmeshpro": "3.0.6",
14 | "com.unity.timeline": "1.7.1",
15 | "com.unity.ugui": "1.0.0",
16 | "com.unity.modules.ai": "1.0.0",
17 | "com.unity.modules.androidjni": "1.0.0",
18 | "com.unity.modules.animation": "1.0.0",
19 | "com.unity.modules.assetbundle": "1.0.0",
20 | "com.unity.modules.audio": "1.0.0",
21 | "com.unity.modules.cloth": "1.0.0",
22 | "com.unity.modules.director": "1.0.0",
23 | "com.unity.modules.imageconversion": "1.0.0",
24 | "com.unity.modules.imgui": "1.0.0",
25 | "com.unity.modules.jsonserialize": "1.0.0",
26 | "com.unity.modules.particlesystem": "1.0.0",
27 | "com.unity.modules.physics": "1.0.0",
28 | "com.unity.modules.physics2d": "1.0.0",
29 | "com.unity.modules.screencapture": "1.0.0",
30 | "com.unity.modules.terrain": "1.0.0",
31 | "com.unity.modules.terrainphysics": "1.0.0",
32 | "com.unity.modules.tilemap": "1.0.0",
33 | "com.unity.modules.ui": "1.0.0",
34 | "com.unity.modules.uielements": "1.0.0",
35 | "com.unity.modules.umbra": "1.0.0",
36 | "com.unity.modules.unityanalytics": "1.0.0",
37 | "com.unity.modules.unitywebrequest": "1.0.0",
38 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
39 | "com.unity.modules.unitywebrequestaudio": "1.0.0",
40 | "com.unity.modules.unitywebrequesttexture": "1.0.0",
41 | "com.unity.modules.unitywebrequestwww": "1.0.0",
42 | "com.unity.modules.vehicles": "1.0.0",
43 | "com.unity.modules.video": "1.0.0",
44 | "com.unity.modules.vr": "1.0.0",
45 | "com.unity.modules.wind": "1.0.0",
46 | "com.unity.modules.xr": "1.0.0"
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/ProjectSettings/AudioManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!11 &1
4 | AudioManager:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_Volume: 1
8 | Rolloff Scale: 1
9 | Doppler Factor: 1
10 | Default Speaker Mode: 2
11 | m_SampleRate: 0
12 | m_DSPBufferSize: 1024
13 | m_VirtualVoiceCount: 512
14 | m_RealVoiceCount: 32
15 | m_SpatializerPlugin:
16 | m_AmbisonicDecoderPlugin:
17 | m_DisableAudio: 0
18 | m_VirtualizeEffects: 1
19 | m_RequestedDSPBufferSize: 1024
20 |
--------------------------------------------------------------------------------
/ProjectSettings/ClusterInputManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!236 &1
4 | ClusterInputManager:
5 | m_ObjectHideFlags: 0
6 | m_Inputs: []
7 |
--------------------------------------------------------------------------------
/ProjectSettings/DynamicsManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!55 &1
4 | PhysicsManager:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 11
7 | m_Gravity: {x: 0, y: -9.81, z: 0}
8 | m_DefaultMaterial: {fileID: 0}
9 | m_BounceThreshold: 2
10 | m_SleepThreshold: 0.005
11 | m_DefaultContactOffset: 0.01
12 | m_DefaultSolverIterations: 6
13 | m_DefaultSolverVelocityIterations: 1
14 | m_QueriesHitBackfaces: 0
15 | m_QueriesHitTriggers: 1
16 | m_EnableAdaptiveForce: 0
17 | m_ClothInterCollisionDistance: 0
18 | m_ClothInterCollisionStiffness: 0
19 | m_ContactsGeneration: 1
20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
21 | m_AutoSimulation: 1
22 | m_AutoSyncTransforms: 0
23 | m_ReuseCollisionCallbacks: 1
24 | m_ClothInterCollisionSettingsToggle: 0
25 | m_ContactPairsMode: 0
26 | m_BroadphaseType: 0
27 | m_WorldBounds:
28 | m_Center: {x: 0, y: 0, z: 0}
29 | m_Extent: {x: 250, y: 250, z: 250}
30 | m_WorldSubdivisions: 8
31 | m_FrictionType: 0
32 | m_EnableEnhancedDeterminism: 0
33 | m_EnableUnifiedHeightmaps: 1
34 | m_DefaultMaxAngluarSpeed: 7
35 |
--------------------------------------------------------------------------------
/ProjectSettings/EditorBuildSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1045 &1
4 | EditorBuildSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_Scenes: []
8 | m_configObjects: {}
9 |
--------------------------------------------------------------------------------
/ProjectSettings/EditorSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!159 &1
4 | EditorSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 11
7 | m_ExternalVersionControlSupport: Visible Meta Files
8 | m_SerializationMode: 2
9 | m_LineEndingsForNewScripts: 0
10 | m_DefaultBehaviorMode: 0
11 | m_PrefabRegularEnvironment: {fileID: 0}
12 | m_PrefabUIEnvironment: {fileID: 0}
13 | m_SpritePackerMode: 0
14 | m_SpritePackerPaddingPower: 1
15 | m_EtcTextureCompressorBehavior: 1
16 | m_EtcTextureFastCompressor: 1
17 | m_EtcTextureNormalCompressor: 2
18 | m_EtcTextureBestCompressor: 4
19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref
20 | m_ProjectGenerationRootNamespace:
21 | m_CollabEditorSettings:
22 | inProgressEnabled: 1
23 | m_EnableTextureStreamingInEditMode: 1
24 | m_EnableTextureStreamingInPlayMode: 1
25 | m_AsyncShaderCompilation: 1
26 | m_EnterPlayModeOptionsEnabled: 0
27 | m_EnterPlayModeOptions: 3
28 | m_ShowLightmapResolutionOverlay: 1
29 | m_UseLegacyProbeSampleCount: 0
30 | m_SerializeInlineMappingsOnOneLine: 1
--------------------------------------------------------------------------------
/ProjectSettings/GraphicsSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!30 &1
4 | GraphicsSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 15
7 | m_Deferred:
8 | m_Mode: 1
9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}
10 | m_DeferredReflections:
11 | m_Mode: 1
12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0}
13 | m_ScreenSpaceShadows:
14 | m_Mode: 1
15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0}
16 | m_DepthNormals:
17 | m_Mode: 1
18 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0}
19 | m_MotionVectors:
20 | m_Mode: 1
21 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0}
22 | m_LightHalo:
23 | m_Mode: 1
24 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0}
25 | m_LensFlare:
26 | m_Mode: 1
27 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0}
28 | m_VideoShadersIncludeMode: 2
29 | m_AlwaysIncludedShaders:
30 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
31 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0}
32 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0}
33 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
34 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
35 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
36 | m_PreloadedShaders: []
37 | m_PreloadShadersBatchTimeLimit: -1
38 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
39 | m_CustomRenderPipeline: {fileID: 11400000, guid: dcfb393475f9db349b0e942359d96e97, type: 2}
40 | m_TransparencySortMode: 0
41 | m_TransparencySortAxis: {x: 0, y: 0, z: 1}
42 | m_DefaultRenderingPath: 1
43 | m_DefaultMobileRenderingPath: 1
44 | m_TierSettings: []
45 | m_LightmapStripping: 0
46 | m_FogStripping: 0
47 | m_InstancingStripping: 0
48 | m_BrgStripping: 0
49 | m_LightmapKeepPlain: 1
50 | m_LightmapKeepDirCombined: 1
51 | m_LightmapKeepDynamicPlain: 1
52 | m_LightmapKeepDynamicDirCombined: 1
53 | m_LightmapKeepShadowMask: 1
54 | m_LightmapKeepSubtractive: 1
55 | m_FogKeepLinear: 1
56 | m_FogKeepExp: 1
57 | m_FogKeepExp2: 1
58 | m_AlbedoSwatchInfos: []
59 | m_LightsUseLinearIntensity: 0
60 | m_LightsUseColorTemperature: 1
61 | m_DefaultRenderingLayerMask: 1
62 | m_LogWhenShaderIsCompiled: 0
63 | m_SRPDefaultSettings:
64 | UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: a8961b5000a4fe04890420c8d9c64a96, type: 2}
65 | m_LightProbeOutsideHullStrategy: 0
66 |
--------------------------------------------------------------------------------
/ProjectSettings/MemorySettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!387306366 &1
4 | MemorySettings:
5 | m_ObjectHideFlags: 0
6 | m_EditorMemorySettings:
7 | m_MainAllocatorBlockSize: -1
8 | m_ThreadAllocatorBlockSize: -1
9 | m_MainGfxBlockSize: -1
10 | m_ThreadGfxBlockSize: -1
11 | m_CacheBlockSize: -1
12 | m_TypetreeBlockSize: -1
13 | m_ProfilerBlockSize: -1
14 | m_ProfilerEditorBlockSize: -1
15 | m_BucketAllocatorGranularity: -1
16 | m_BucketAllocatorBucketsCount: -1
17 | m_BucketAllocatorBlockSize: -1
18 | m_BucketAllocatorBlockCount: -1
19 | m_ProfilerBucketAllocatorGranularity: -1
20 | m_ProfilerBucketAllocatorBucketsCount: -1
21 | m_ProfilerBucketAllocatorBlockSize: -1
22 | m_ProfilerBucketAllocatorBlockCount: -1
23 | m_TempAllocatorSizeMain: -1
24 | m_JobTempAllocatorBlockSize: -1
25 | m_BackgroundJobTempAllocatorBlockSize: -1
26 | m_JobTempAllocatorReducedBlockSize: -1
27 | m_TempAllocatorSizeGIBakingWorker: -1
28 | m_TempAllocatorSizeNavMeshWorker: -1
29 | m_TempAllocatorSizeAudioWorker: -1
30 | m_TempAllocatorSizeCloudWorker: -1
31 | m_TempAllocatorSizeGfx: -1
32 | m_TempAllocatorSizeJobWorker: -1
33 | m_TempAllocatorSizeBackgroundWorker: -1
34 | m_TempAllocatorSizePreloadManager: -1
35 | m_PlatformMemorySettings: {}
36 |
--------------------------------------------------------------------------------
/ProjectSettings/NavMeshAreas.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!126 &1
4 | NavMeshProjectSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | areas:
8 | - name: Walkable
9 | cost: 1
10 | - name: Not Walkable
11 | cost: 1
12 | - name: Jump
13 | cost: 2
14 | - name:
15 | cost: 1
16 | - name:
17 | cost: 1
18 | - name:
19 | cost: 1
20 | - name:
21 | cost: 1
22 | - name:
23 | cost: 1
24 | - name:
25 | cost: 1
26 | - name:
27 | cost: 1
28 | - name:
29 | cost: 1
30 | - name:
31 | cost: 1
32 | - name:
33 | cost: 1
34 | - name:
35 | cost: 1
36 | - name:
37 | cost: 1
38 | - name:
39 | cost: 1
40 | - name:
41 | cost: 1
42 | - name:
43 | cost: 1
44 | - name:
45 | cost: 1
46 | - name:
47 | cost: 1
48 | - name:
49 | cost: 1
50 | - name:
51 | cost: 1
52 | - name:
53 | cost: 1
54 | - name:
55 | cost: 1
56 | - name:
57 | cost: 1
58 | - name:
59 | cost: 1
60 | - name:
61 | cost: 1
62 | - name:
63 | cost: 1
64 | - name:
65 | cost: 1
66 | - name:
67 | cost: 1
68 | - name:
69 | cost: 1
70 | - name:
71 | cost: 1
72 | m_LastAgentTypeID: -887442657
73 | m_Settings:
74 | - serializedVersion: 2
75 | agentTypeID: 0
76 | agentRadius: 0.5
77 | agentHeight: 2
78 | agentSlope: 45
79 | agentClimb: 0.75
80 | ledgeDropHeight: 0
81 | maxJumpAcrossDistance: 0
82 | minRegionArea: 2
83 | manualCellSize: 0
84 | cellSize: 0.16666667
85 | manualTileSize: 0
86 | tileSize: 256
87 | accuratePlacement: 0
88 | debug:
89 | m_Flags: 0
90 | m_SettingNames:
91 | - Humanoid
92 |
--------------------------------------------------------------------------------
/ProjectSettings/PackageManagerSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &1
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 61
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0}
13 | m_Name:
14 | m_EditorClassIdentifier:
15 | m_EnablePreviewPackages: 0
16 | m_EnablePackageDependencies: 0
17 | m_AdvancedSettingsExpanded: 1
18 | m_ScopedRegistriesSettingsExpanded: 1
19 | oneTimeWarningShown: 0
20 | m_Registries:
21 | - m_Id: main
22 | m_Name:
23 | m_Url: https://packages.unity.com
24 | m_Scopes: []
25 | m_IsDefault: 1
26 | m_Capabilities: 7
27 | m_UserSelectedRegistryName:
28 | m_UserAddingNewScopedRegistry: 0
29 | m_RegistryInfoDraft:
30 | m_ErrorMessage:
31 | m_Original:
32 | m_Id:
33 | m_Name:
34 | m_Url:
35 | m_Scopes: []
36 | m_IsDefault: 0
37 | m_Capabilities: 0
38 | m_Modified: 0
39 | m_Name:
40 | m_Url:
41 | m_Scopes:
42 | -
43 | m_SelectedScopeIndex: 0
44 |
--------------------------------------------------------------------------------
/ProjectSettings/Physics2DSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!19 &1
4 | Physics2DSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 4
7 | m_Gravity: {x: 0, y: -9.81}
8 | m_DefaultMaterial: {fileID: 0}
9 | m_VelocityIterations: 8
10 | m_PositionIterations: 3
11 | m_VelocityThreshold: 1
12 | m_MaxLinearCorrection: 0.2
13 | m_MaxAngularCorrection: 8
14 | m_MaxTranslationSpeed: 100
15 | m_MaxRotationSpeed: 360
16 | m_BaumgarteScale: 0.2
17 | m_BaumgarteTimeOfImpactScale: 0.75
18 | m_TimeToSleep: 0.5
19 | m_LinearSleepTolerance: 0.01
20 | m_AngularSleepTolerance: 2
21 | m_DefaultContactOffset: 0.01
22 | m_JobOptions:
23 | serializedVersion: 2
24 | useMultithreading: 0
25 | useConsistencySorting: 0
26 | m_InterpolationPosesPerJob: 100
27 | m_NewContactsPerJob: 30
28 | m_CollideContactsPerJob: 100
29 | m_ClearFlagsPerJob: 200
30 | m_ClearBodyForcesPerJob: 200
31 | m_SyncDiscreteFixturesPerJob: 50
32 | m_SyncContinuousFixturesPerJob: 50
33 | m_FindNearestContactsPerJob: 100
34 | m_UpdateTriggerContactsPerJob: 100
35 | m_IslandSolverCostThreshold: 100
36 | m_IslandSolverBodyCostScale: 1
37 | m_IslandSolverContactCostScale: 10
38 | m_IslandSolverJointCostScale: 10
39 | m_IslandSolverBodiesPerJob: 50
40 | m_IslandSolverContactsPerJob: 50
41 | m_AutoSimulation: 1
42 | m_QueriesHitTriggers: 1
43 | m_QueriesStartInColliders: 1
44 | m_CallbacksOnDisable: 1
45 | m_ReuseCollisionCallbacks: 1
46 | m_AutoSyncTransforms: 0
47 | m_AlwaysShowColliders: 0
48 | m_ShowColliderSleep: 1
49 | m_ShowColliderContacts: 0
50 | m_ShowColliderAABB: 0
51 | m_ContactArrowScale: 0.2
52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412}
53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
57 |
--------------------------------------------------------------------------------
/ProjectSettings/PresetManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1386491679 &1
4 | PresetManager:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_DefaultPresets: {}
8 |
--------------------------------------------------------------------------------
/ProjectSettings/ProjectVersion.txt:
--------------------------------------------------------------------------------
1 | m_EditorVersion: 2022.2.0b10
2 | m_EditorVersionWithRevision: 2022.2.0b10 (23300ef499b2)
3 |
--------------------------------------------------------------------------------
/ProjectSettings/QualitySettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!47 &1
4 | QualitySettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 5
7 | m_CurrentQuality: 5
8 | m_QualitySettings:
9 | - serializedVersion: 2
10 | name: Very Low
11 | pixelLightCount: 0
12 | shadows: 0
13 | shadowResolution: 0
14 | shadowProjection: 1
15 | shadowCascades: 1
16 | shadowDistance: 15
17 | shadowNearPlaneOffset: 3
18 | shadowCascade2Split: 0.33333334
19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
20 | shadowmaskMode: 0
21 | skinWeights: 1
22 | textureQuality: 1
23 | anisotropicTextures: 0
24 | antiAliasing: 0
25 | softParticles: 0
26 | softVegetation: 0
27 | realtimeReflectionProbes: 0
28 | billboardsFaceCameraPosition: 0
29 | vSyncCount: 0
30 | lodBias: 0.3
31 | maximumLODLevel: 0
32 | streamingMipmapsActive: 0
33 | streamingMipmapsAddAllCameras: 1
34 | streamingMipmapsMemoryBudget: 512
35 | streamingMipmapsRenderersPerFrame: 512
36 | streamingMipmapsMaxLevelReduction: 2
37 | streamingMipmapsMaxFileIORequests: 1024
38 | particleRaycastBudget: 4
39 | asyncUploadTimeSlice: 2
40 | asyncUploadBufferSize: 16
41 | asyncUploadPersistentBuffer: 1
42 | resolutionScalingFixedDPIFactor: 1
43 | customRenderPipeline: {fileID: 0}
44 | excludedTargetPlatforms: []
45 | - serializedVersion: 2
46 | name: Low
47 | pixelLightCount: 0
48 | shadows: 0
49 | shadowResolution: 0
50 | shadowProjection: 1
51 | shadowCascades: 1
52 | shadowDistance: 20
53 | shadowNearPlaneOffset: 3
54 | shadowCascade2Split: 0.33333334
55 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
56 | shadowmaskMode: 0
57 | skinWeights: 2
58 | textureQuality: 0
59 | anisotropicTextures: 0
60 | antiAliasing: 0
61 | softParticles: 0
62 | softVegetation: 0
63 | realtimeReflectionProbes: 0
64 | billboardsFaceCameraPosition: 0
65 | vSyncCount: 0
66 | lodBias: 0.4
67 | maximumLODLevel: 0
68 | streamingMipmapsActive: 0
69 | streamingMipmapsAddAllCameras: 1
70 | streamingMipmapsMemoryBudget: 512
71 | streamingMipmapsRenderersPerFrame: 512
72 | streamingMipmapsMaxLevelReduction: 2
73 | streamingMipmapsMaxFileIORequests: 1024
74 | particleRaycastBudget: 16
75 | asyncUploadTimeSlice: 2
76 | asyncUploadBufferSize: 16
77 | asyncUploadPersistentBuffer: 1
78 | resolutionScalingFixedDPIFactor: 1
79 | customRenderPipeline: {fileID: 0}
80 | excludedTargetPlatforms: []
81 | - serializedVersion: 2
82 | name: Medium
83 | pixelLightCount: 1
84 | shadows: 1
85 | shadowResolution: 0
86 | shadowProjection: 1
87 | shadowCascades: 1
88 | shadowDistance: 20
89 | shadowNearPlaneOffset: 3
90 | shadowCascade2Split: 0.33333334
91 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
92 | shadowmaskMode: 0
93 | skinWeights: 2
94 | textureQuality: 0
95 | anisotropicTextures: 1
96 | antiAliasing: 0
97 | softParticles: 0
98 | softVegetation: 0
99 | realtimeReflectionProbes: 0
100 | billboardsFaceCameraPosition: 0
101 | vSyncCount: 1
102 | lodBias: 0.7
103 | maximumLODLevel: 0
104 | streamingMipmapsActive: 0
105 | streamingMipmapsAddAllCameras: 1
106 | streamingMipmapsMemoryBudget: 512
107 | streamingMipmapsRenderersPerFrame: 512
108 | streamingMipmapsMaxLevelReduction: 2
109 | streamingMipmapsMaxFileIORequests: 1024
110 | particleRaycastBudget: 64
111 | asyncUploadTimeSlice: 2
112 | asyncUploadBufferSize: 16
113 | asyncUploadPersistentBuffer: 1
114 | resolutionScalingFixedDPIFactor: 1
115 | customRenderPipeline: {fileID: 0}
116 | excludedTargetPlatforms: []
117 | - serializedVersion: 2
118 | name: High
119 | pixelLightCount: 2
120 | shadows: 2
121 | shadowResolution: 1
122 | shadowProjection: 1
123 | shadowCascades: 2
124 | shadowDistance: 40
125 | shadowNearPlaneOffset: 3
126 | shadowCascade2Split: 0.33333334
127 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
128 | shadowmaskMode: 1
129 | skinWeights: 2
130 | textureQuality: 0
131 | anisotropicTextures: 1
132 | antiAliasing: 0
133 | softParticles: 0
134 | softVegetation: 1
135 | realtimeReflectionProbes: 1
136 | billboardsFaceCameraPosition: 1
137 | vSyncCount: 1
138 | lodBias: 1
139 | maximumLODLevel: 0
140 | streamingMipmapsActive: 0
141 | streamingMipmapsAddAllCameras: 1
142 | streamingMipmapsMemoryBudget: 512
143 | streamingMipmapsRenderersPerFrame: 512
144 | streamingMipmapsMaxLevelReduction: 2
145 | streamingMipmapsMaxFileIORequests: 1024
146 | particleRaycastBudget: 256
147 | asyncUploadTimeSlice: 2
148 | asyncUploadBufferSize: 16
149 | asyncUploadPersistentBuffer: 1
150 | resolutionScalingFixedDPIFactor: 1
151 | customRenderPipeline: {fileID: 0}
152 | excludedTargetPlatforms: []
153 | - serializedVersion: 2
154 | name: Very High
155 | pixelLightCount: 3
156 | shadows: 2
157 | shadowResolution: 2
158 | shadowProjection: 1
159 | shadowCascades: 2
160 | shadowDistance: 70
161 | shadowNearPlaneOffset: 3
162 | shadowCascade2Split: 0.33333334
163 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
164 | shadowmaskMode: 1
165 | skinWeights: 4
166 | textureQuality: 0
167 | anisotropicTextures: 2
168 | antiAliasing: 2
169 | softParticles: 1
170 | softVegetation: 1
171 | realtimeReflectionProbes: 1
172 | billboardsFaceCameraPosition: 1
173 | vSyncCount: 1
174 | lodBias: 1.5
175 | maximumLODLevel: 0
176 | streamingMipmapsActive: 0
177 | streamingMipmapsAddAllCameras: 1
178 | streamingMipmapsMemoryBudget: 512
179 | streamingMipmapsRenderersPerFrame: 512
180 | streamingMipmapsMaxLevelReduction: 2
181 | streamingMipmapsMaxFileIORequests: 1024
182 | particleRaycastBudget: 1024
183 | asyncUploadTimeSlice: 2
184 | asyncUploadBufferSize: 16
185 | asyncUploadPersistentBuffer: 1
186 | resolutionScalingFixedDPIFactor: 1
187 | customRenderPipeline: {fileID: 0}
188 | excludedTargetPlatforms: []
189 | - serializedVersion: 2
190 | name: Ultra
191 | pixelLightCount: 4
192 | shadows: 2
193 | shadowResolution: 2
194 | shadowProjection: 1
195 | shadowCascades: 4
196 | shadowDistance: 150
197 | shadowNearPlaneOffset: 3
198 | shadowCascade2Split: 0.33333334
199 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
200 | shadowmaskMode: 1
201 | skinWeights: 4
202 | textureQuality: 0
203 | anisotropicTextures: 2
204 | antiAliasing: 0
205 | softParticles: 1
206 | softVegetation: 1
207 | realtimeReflectionProbes: 1
208 | billboardsFaceCameraPosition: 1
209 | vSyncCount: 1
210 | lodBias: 2
211 | maximumLODLevel: 0
212 | streamingMipmapsActive: 0
213 | streamingMipmapsAddAllCameras: 1
214 | streamingMipmapsMemoryBudget: 512
215 | streamingMipmapsRenderersPerFrame: 512
216 | streamingMipmapsMaxLevelReduction: 2
217 | streamingMipmapsMaxFileIORequests: 1024
218 | particleRaycastBudget: 4096
219 | asyncUploadTimeSlice: 2
220 | asyncUploadBufferSize: 16
221 | asyncUploadPersistentBuffer: 1
222 | resolutionScalingFixedDPIFactor: 1
223 | customRenderPipeline: {fileID: 0}
224 | excludedTargetPlatforms: []
225 | m_PerPlatformDefaultQuality:
226 | Android: 2
227 | Lumin: 5
228 | Nintendo 3DS: 5
229 | Nintendo Switch: 5
230 | PS4: 5
231 | PSP2: 2
232 | Stadia: 5
233 | Standalone: 5
234 | WebGL: 3
235 | Windows Store Apps: 5
236 | XboxOne: 5
237 | iPhone: 2
238 | tvOS: 2
239 |
--------------------------------------------------------------------------------
/ProjectSettings/SceneTemplateSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "templatePinStates": [],
3 | "dependencyTypeInfos": [
4 | {
5 | "userAdded": false,
6 | "type": "UnityEngine.AnimationClip",
7 | "ignore": false,
8 | "defaultInstantiationMode": 0,
9 | "supportsModification": true
10 | },
11 | {
12 | "userAdded": false,
13 | "type": "UnityEditor.Animations.AnimatorController",
14 | "ignore": false,
15 | "defaultInstantiationMode": 0,
16 | "supportsModification": true
17 | },
18 | {
19 | "userAdded": false,
20 | "type": "UnityEngine.AnimatorOverrideController",
21 | "ignore": false,
22 | "defaultInstantiationMode": 0,
23 | "supportsModification": true
24 | },
25 | {
26 | "userAdded": false,
27 | "type": "UnityEditor.Audio.AudioMixerController",
28 | "ignore": false,
29 | "defaultInstantiationMode": 0,
30 | "supportsModification": true
31 | },
32 | {
33 | "userAdded": false,
34 | "type": "UnityEngine.ComputeShader",
35 | "ignore": true,
36 | "defaultInstantiationMode": 1,
37 | "supportsModification": true
38 | },
39 | {
40 | "userAdded": false,
41 | "type": "UnityEngine.Cubemap",
42 | "ignore": false,
43 | "defaultInstantiationMode": 0,
44 | "supportsModification": true
45 | },
46 | {
47 | "userAdded": false,
48 | "type": "UnityEngine.GameObject",
49 | "ignore": false,
50 | "defaultInstantiationMode": 0,
51 | "supportsModification": true
52 | },
53 | {
54 | "userAdded": false,
55 | "type": "UnityEditor.LightingDataAsset",
56 | "ignore": false,
57 | "defaultInstantiationMode": 0,
58 | "supportsModification": false
59 | },
60 | {
61 | "userAdded": false,
62 | "type": "UnityEngine.LightingSettings",
63 | "ignore": false,
64 | "defaultInstantiationMode": 0,
65 | "supportsModification": true
66 | },
67 | {
68 | "userAdded": false,
69 | "type": "UnityEngine.Material",
70 | "ignore": false,
71 | "defaultInstantiationMode": 0,
72 | "supportsModification": true
73 | },
74 | {
75 | "userAdded": false,
76 | "type": "UnityEditor.MonoScript",
77 | "ignore": true,
78 | "defaultInstantiationMode": 1,
79 | "supportsModification": true
80 | },
81 | {
82 | "userAdded": false,
83 | "type": "UnityEngine.PhysicMaterial",
84 | "ignore": false,
85 | "defaultInstantiationMode": 0,
86 | "supportsModification": true
87 | },
88 | {
89 | "userAdded": false,
90 | "type": "UnityEngine.PhysicsMaterial2D",
91 | "ignore": false,
92 | "defaultInstantiationMode": 0,
93 | "supportsModification": true
94 | },
95 | {
96 | "userAdded": false,
97 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile",
98 | "ignore": false,
99 | "defaultInstantiationMode": 0,
100 | "supportsModification": true
101 | },
102 | {
103 | "userAdded": false,
104 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources",
105 | "ignore": false,
106 | "defaultInstantiationMode": 0,
107 | "supportsModification": true
108 | },
109 | {
110 | "userAdded": false,
111 | "type": "UnityEngine.Rendering.VolumeProfile",
112 | "ignore": false,
113 | "defaultInstantiationMode": 0,
114 | "supportsModification": true
115 | },
116 | {
117 | "userAdded": false,
118 | "type": "UnityEditor.SceneAsset",
119 | "ignore": false,
120 | "defaultInstantiationMode": 0,
121 | "supportsModification": false
122 | },
123 | {
124 | "userAdded": false,
125 | "type": "UnityEngine.Shader",
126 | "ignore": true,
127 | "defaultInstantiationMode": 1,
128 | "supportsModification": true
129 | },
130 | {
131 | "userAdded": false,
132 | "type": "UnityEngine.ShaderVariantCollection",
133 | "ignore": true,
134 | "defaultInstantiationMode": 1,
135 | "supportsModification": true
136 | },
137 | {
138 | "userAdded": false,
139 | "type": "UnityEngine.Texture",
140 | "ignore": false,
141 | "defaultInstantiationMode": 0,
142 | "supportsModification": true
143 | },
144 | {
145 | "userAdded": false,
146 | "type": "UnityEngine.Texture2D",
147 | "ignore": false,
148 | "defaultInstantiationMode": 0,
149 | "supportsModification": true
150 | },
151 | {
152 | "userAdded": false,
153 | "type": "UnityEngine.Timeline.TimelineAsset",
154 | "ignore": false,
155 | "defaultInstantiationMode": 0,
156 | "supportsModification": true
157 | }
158 | ],
159 | "defaultDependencyTypeInfo": {
160 | "userAdded": false,
161 | "type": "",
162 | "ignore": false,
163 | "defaultInstantiationMode": 1,
164 | "supportsModification": true
165 | },
166 | "newSceneOverride": 0
167 | }
--------------------------------------------------------------------------------
/ProjectSettings/ShaderGraphSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &1
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 61
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 11500000, guid: de02f9e1d18f588468e474319d09a723, type: 3}
13 | m_Name:
14 | m_EditorClassIdentifier:
15 | customInterpolatorErrorThreshold: 32
16 | customInterpolatorWarningThreshold: 16
17 |
--------------------------------------------------------------------------------
/ProjectSettings/TagManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!78 &1
4 | TagManager:
5 | serializedVersion: 2
6 | tags: []
7 | layers:
8 | - Default
9 | - TransparentFX
10 | - Ignore Raycast
11 | -
12 | - Water
13 | - UI
14 | -
15 | -
16 | -
17 | -
18 | -
19 | -
20 | -
21 | -
22 | -
23 | -
24 | -
25 | -
26 | -
27 | -
28 | -
29 | -
30 | -
31 | -
32 | -
33 | -
34 | -
35 | -
36 | -
37 | -
38 | -
39 | -
40 | m_SortingLayers:
41 | - name: Default
42 | uniqueID: 0
43 | locked: 0
44 |
--------------------------------------------------------------------------------
/ProjectSettings/TimeManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!5 &1
4 | TimeManager:
5 | m_ObjectHideFlags: 0
6 | Fixed Timestep: 0.02
7 | Maximum Allowed Timestep: 0.33333334
8 | m_TimeScale: 1
9 | Maximum Particle Timestep: 0.03
10 |
--------------------------------------------------------------------------------
/ProjectSettings/URPProjectSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &1
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 61
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3}
13 | m_Name:
14 | m_EditorClassIdentifier:
15 | m_LastMaterialVersion: 7
16 |
--------------------------------------------------------------------------------
/ProjectSettings/UnityConnectSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!310 &1
4 | UnityConnectSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 1
7 | m_Enabled: 0
8 | m_TestMode: 0
9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events
11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com
12 | m_DashboardUrl: https://dashboard.unity3d.com
13 | m_TestInitMode: 0
14 | CrashReportingSettings:
15 | m_EventUrl: https://perf-events.cloud.unity3d.com
16 | m_Enabled: 0
17 | m_LogBufferSize: 10
18 | m_CaptureEditorExceptions: 1
19 | UnityPurchasingSettings:
20 | m_Enabled: 0
21 | m_TestMode: 0
22 | UnityAnalyticsSettings:
23 | m_Enabled: 0
24 | m_TestMode: 0
25 | m_InitializeOnStartup: 1
26 | UnityAdsSettings:
27 | m_Enabled: 0
28 | m_InitializeOnStartup: 1
29 | m_TestMode: 0
30 | m_IosGameId:
31 | m_AndroidGameId:
32 | m_GameIds: {}
33 | m_GameId:
34 | PerformanceReportingSettings:
35 | m_Enabled: 0
36 |
--------------------------------------------------------------------------------
/ProjectSettings/VFXManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!937362698 &1
4 | VFXManager:
5 | m_ObjectHideFlags: 0
6 | m_IndirectShader: {fileID: 0}
7 | m_CopyBufferShader: {fileID: 0}
8 | m_SortShader: {fileID: 0}
9 | m_StripUpdateShader: {fileID: 0}
10 | m_RenderPipeSettingsPath:
11 | m_FixedTimeStep: 0.016666668
12 | m_MaxDeltaTime: 0.05
13 |
--------------------------------------------------------------------------------
/ProjectSettings/VersionControlSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!890905787 &1
4 | VersionControlSettings:
5 | m_ObjectHideFlags: 0
6 | m_Mode: Visible Meta Files
7 | m_CollabEditorSettings:
8 | inProgressEnabled: 1
9 |
--------------------------------------------------------------------------------
/ProjectSettings/XRSettings.asset:
--------------------------------------------------------------------------------
1 | {
2 | "m_SettingKeys": [
3 | "VR Device Disabled",
4 | "VR Device User Alert"
5 | ],
6 | "m_SettingValues": [
7 | "False",
8 | "False"
9 | ]
10 | }
--------------------------------------------------------------------------------
/ReactiveDots.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 11.00
3 | # Visual Studio 2010
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp.csproj", "{25a9d6c8-8857-053c-c54b-a68aa907a010}"
5 | EndProject
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveDots.Tests", "ReactiveDots.Tests.csproj", "{2339b5c4-fe86-76c4-4cfd-ed02ba97bd8f}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveDotsScriptsAssembly", "ReactiveDotsScriptsAssembly.csproj", "{fa6b15ce-532d-af89-09c4-e5a0277727d1}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveDots.Tests.SecondAssembly", "ReactiveDots.Tests.SecondAssembly.csproj", "{2c5fc647-fe76-ade5-4620-808a3523941c}"
11 | EndProject
12 | Global
13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
14 | Debug|Any CPU = Debug|Any CPU
15 | EndGlobalSection
16 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
17 | {25a9d6c8-8857-053c-c54b-a68aa907a010}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
18 | {25a9d6c8-8857-053c-c54b-a68aa907a010}.Debug|Any CPU.Build.0 = Debug|Any CPU
19 | {2339b5c4-fe86-76c4-4cfd-ed02ba97bd8f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
20 | {2339b5c4-fe86-76c4-4cfd-ed02ba97bd8f}.Debug|Any CPU.Build.0 = Debug|Any CPU
21 | {fa6b15ce-532d-af89-09c4-e5a0277727d1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
22 | {fa6b15ce-532d-af89-09c4-e5a0277727d1}.Debug|Any CPU.Build.0 = Debug|Any CPU
23 | {2c5fc647-fe76-ade5-4620-808a3523941c}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
24 | {2c5fc647-fe76-ade5-4620-808a3523941c}.Debug|Any CPU.Build.0 = Debug|Any CPU
25 | EndGlobalSection
26 | GlobalSection(SolutionProperties) = preSolution
27 | HideSolutionNode = FALSE
28 | EndGlobalSection
29 | EndGlobal
30 |
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/.gitignore:
--------------------------------------------------------------------------------
1 | # Visual Studio cache directory
2 | .vs/
3 |
4 | # Autogenerated VS/MD/Consulo solution and project files
5 | ExportedObj/
6 | .consulo/
7 | *.csproj
8 | *.unityproj
9 | *.sln
10 | *.suo
11 | *.tmp
12 | *.user
13 | *.userprefs
14 | *.pidb
15 | *.booproj
16 | *.svd
17 | *.pdb
18 | *.mdb
19 | *.opendb
20 | *.VC.db
21 |
22 | # Rider
23 | .idea/
24 |
25 | bin/
26 | obj/
27 |
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/EventSystems/EventComponentInfo.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.CodeAnalysis;
2 | using Microsoft.CodeAnalysis.CSharp.Syntax;
3 |
4 | namespace ReactiveDotsPlugin
5 | {
6 | public class EventComponentInfo
7 | {
8 | public EventType EventType { private set; get; }
9 | public StructDeclarationSyntax? StructSyntax { get; }
10 | public TypeDeclarationSyntax DeclaredOn { get; }
11 | public AttributeSyntax Attribute { get; }
12 |
13 | public string ComponentName { private set; get; }
14 | public string ComponentNamespace { private set; get; }
15 | public string ComponentNameFull { private set; get; }
16 |
17 | public string EventSystemClassName { private set; get; }
18 | public string EventSystemClassNamespace { private set; get; }
19 | public string EventSystemClassNameFull { private set; get; }
20 |
21 | public List FieldsToCompareName { get; }
22 | public bool IsTagComponent => FieldsToCompareName.Count == 0;
23 |
24 | public string ReactiveComponentNameFull =>
25 | $"{ComponentNamespace}.{EventSystemClassName}_{ComponentName}_ReactiveEvents.{ComponentName}Reactive";
26 |
27 | public bool IsReactiveEventFor => StructSyntax == null;
28 |
29 | // [ReactiveEventFor]
30 | public EventComponentInfo( TypeDeclarationSyntax typeSyntax, AttributeSyntax attribute )
31 | {
32 | DeclaredOn = typeSyntax;
33 | Attribute = attribute;
34 | EventType = EventType.All; // default
35 |
36 | FieldsToCompareName = new List(
37 | GeneratorUtils.GetAttributeArgumentValue( attribute, "FieldNameToCompare", "Value" ).Split( ',' )
38 | .Where( ( str ) => !string.IsNullOrEmpty( str ) )
39 | );
40 | }
41 |
42 | // [ReactiveEvent]
43 | public EventComponentInfo( StructDeclarationSyntax structNode, AttributeSyntax attribute )
44 | {
45 | StructSyntax = structNode;
46 | DeclaredOn = structNode;
47 | Attribute = attribute;
48 | EventType = EventType.All; // default
49 |
50 | FieldsToCompareName = new List(
51 | GeneratorUtils.GetAttributeArgumentValue( attribute, "FieldNameToCompare", "Value" ).Split( ',' )
52 | .Where( ( str ) => !string.IsNullOrEmpty( str ) )
53 | );
54 |
55 | ComponentName = StructSyntax.Identifier.Text;
56 | ComponentNamespace = GeneratorUtils.GetNamespaceFor( StructSyntax );
57 | ComponentNameFull = GeneratorUtils.GetFullName( StructSyntax );
58 | }
59 |
60 | public void UpdateWithContext( GeneratorExecutionContext context )
61 | {
62 | var componentTypeIndex = 0;
63 | var eventTypeIndex = IsReactiveEventFor ? 1 : 0;
64 | var eventSystemIndex = IsReactiveEventFor ? 2 : 1;
65 | if ( Attribute.ArgumentList != null ) {
66 | if ( IsReactiveEventFor && Attribute.ArgumentList.Arguments.Count >= 1 )
67 | GetComponentInfo( context, Attribute.ArgumentList.Arguments[componentTypeIndex] );
68 |
69 | if ( Attribute.ArgumentList.Arguments.Count >= eventTypeIndex + 1 )
70 | GetEventTypeInfo( Attribute, eventTypeIndex );
71 |
72 | if ( Attribute.ArgumentList.Arguments.Count >= eventSystemIndex + 1 )
73 | GetEventSystemInfo( context, Attribute.ArgumentList.Arguments[eventSystemIndex] );
74 | else {
75 | EventSystemClassNamespace = "ReactiveDots";
76 | EventSystemClassNameFull = "ReactiveDots.DefaultEventSystem";
77 | EventSystemClassName = "DefaultEventSystem";
78 | }
79 | }
80 | }
81 |
82 | private void GetComponentInfo( GeneratorExecutionContext context, AttributeArgumentSyntax arg )
83 | {
84 | var compNames = GeneratorUtils.GetTypeNamesFromAttributeArgument( context, arg );
85 | ComponentName = compNames.Name;
86 | ComponentNamespace = compNames.NamespaceWithContainingTypes;
87 | ComponentNameFull = compNames.FullName;
88 | }
89 |
90 | private void GetEventTypeInfo( AttributeSyntax attribute, int index )
91 | {
92 | var eventTypeStr = GeneratorUtils.GetAttributeArgumentValue( attribute, index, "EventType.All" );
93 | switch ( eventTypeStr ) {
94 | case "EventType.All":
95 | EventType = EventType.All;
96 | break;
97 | case "EventType.Added":
98 | EventType = EventType.Added;
99 | break;
100 | case "EventType.Removed":
101 | EventType = EventType.Removed;
102 | break;
103 | case "EventType.Changed":
104 | EventType = EventType.Changed;
105 | break;
106 | }
107 | }
108 |
109 | private void GetEventSystemInfo( GeneratorExecutionContext context, AttributeArgumentSyntax arg )
110 | {
111 | var compNames = GeneratorUtils.GetTypeNamesFromAttributeArgument( context, arg );
112 | EventSystemClassName = compNames.Name;
113 | EventSystemClassNamespace = compNames.NamespaceWithContainingTypes;
114 | EventSystemClassNameFull = compNames.FullName;
115 | }
116 | }
117 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/EventSystems/EventSystemGenerator.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 | using System.Text;
3 | using Microsoft.CodeAnalysis;
4 | using Microsoft.CodeAnalysis.Text;
5 |
6 | namespace ReactiveDotsPlugin
7 | {
8 | [Generator]
9 | public class EventSystemGenerator : SourceGeneratorBase
10 | {
11 | public override void Initialize( GeneratorInitializationContext context )
12 | {
13 | context.RegisterForSyntaxNotifications( () => new EventSystemSyntaxReceiver() );
14 | }
15 |
16 | public override void Execute( GeneratorExecutionContext context )
17 | {
18 | var receiver = context.SyntaxReceiver as EventSystemSyntaxReceiver;
19 | try {
20 | foreach ( var eventComponent in receiver.EventComponents ) {
21 | eventComponent.UpdateWithContext( context );
22 | GenerateComponentInterfaces( context, eventComponent );
23 | GenerateComponentJobs( context, eventComponent );
24 | }
25 |
26 | foreach ( var eventSystem in receiver.EventSystems )
27 | GenerateEventSystem( context, eventSystem );
28 | }
29 | catch ( Exception e ) {
30 | Debug.WriteLine( "EventSystemGenerator exception:\n" + e );
31 | }
32 | }
33 |
34 | private void GenerateEventSystem( GeneratorExecutionContext context, EventSystemInfo eventSystem )
35 | {
36 | var globalTemplate = EventSystemTemplates.GetEventSystemMainTemplate();
37 | var source = GetReplacerForEventSystem( context, eventSystem ).Replace( globalTemplate );
38 | context.AddSource( $"{eventSystem.SystemName}.ReactiveEvents.g.cs",
39 | SourceText.From( source, Encoding.UTF8 ) );
40 | }
41 |
42 | private void GenerateComponentInterfaces( GeneratorExecutionContext context, EventComponentInfo eventComponent )
43 | {
44 | var globalTemplate = EventSystemTemplates.GetComponentInterfacesTemplate();
45 | var source = GetReplacerForComponentInfo( context, eventComponent ).Replace( globalTemplate );
46 | context.AddSource(
47 | $"{eventComponent.ComponentName}_{eventComponent.EventSystemClassName}_Interfaces.ReactiveEvents.g.cs",
48 | SourceText.From( source, Encoding.UTF8 ) );
49 | }
50 |
51 | private void GenerateComponentJobs( GeneratorExecutionContext context, EventComponentInfo eventComponent )
52 | {
53 | var globalTemplate = EventSystemTemplates.GetComponentJobsTemplate();
54 | var reactiveComponentProcessorsInsert = ReactiveSystemTemplates.GetTemplateForComponent();
55 | var reactiveComponentDeclaration = ReactiveSystemTemplates.GetTemplateForReactiveComponent();
56 | var sourceTemplate = globalTemplate
57 | .Replace( "$$placeForComponents$$", reactiveComponentProcessorsInsert )
58 | .Replace( "$$placeForReactiveComponent$$", reactiveComponentDeclaration );
59 | var source = GetReplacerForComponentInfo( context, eventComponent ).Replace( sourceTemplate );
60 | context.AddSource(
61 | $"{eventComponent.ComponentName}_{eventComponent.EventSystemClassName}_Jobs.ReactiveEvents.g.cs",
62 | SourceText.From( source, Encoding.UTF8 ) );
63 | }
64 |
65 | private Replacer GetReplacerForComponentInfo( GeneratorExecutionContext context,
66 | EventComponentInfo componentInfo )
67 | {
68 | var checkIfChangedBodyInsert = string.Empty;
69 | for ( int i = 0; i < componentInfo.FieldsToCompareName.Count; i++ ) {
70 | var check = ReactiveSystemTemplates.GetTemplateForCheckIfChangedInstruction(
71 | componentInfo.FieldsToCompareName[i] );
72 | checkIfChangedBodyInsert += check;
73 | }
74 |
75 | return new Replacer() {
76 | usings = GeneratorUtils.GetUsingsInsert(
77 | context, componentInfo.DeclaredOn,
78 | GetCommonUsings()
79 | ),
80 | systemNamespace = componentInfo.ComponentNamespace,
81 | checkIfChangedMethodBody = checkIfChangedBodyInsert,
82 | systemNameFull = componentInfo.EventSystemClassNameFull,
83 | systemName = componentInfo.EventSystemClassName,
84 | isTagComponent = componentInfo.IsTagComponent,
85 | componentName = componentInfo.ComponentName,
86 | componentNameFull = componentInfo.ComponentNameFull,
87 | reactiveComponentNameFull = componentInfo.ReactiveComponentNameFull
88 | };
89 | }
90 |
91 | private Replacer GetReplacerForEventSystem( GeneratorExecutionContext context, EventSystemInfo eventSystem )
92 | {
93 | return new Replacer() {
94 | usings = GeneratorUtils.GetUsingsInsert(
95 | context, eventSystem.ClassSyntax,
96 | GetCommonUsings()
97 | ),
98 | systemNamespace = eventSystem.SystemNamespace,
99 | checkIfChangedMethodBody = "",
100 | systemNameFull = eventSystem.SystemNameFull,
101 | systemName = eventSystem.SystemName,
102 | isTagComponent = false,
103 | componentName = "",
104 | componentNameFull = "",
105 | reactiveComponentNameFull = ""
106 | };
107 | }
108 | }
109 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/EventSystems/EventSystemInfo.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.CodeAnalysis.CSharp.Syntax;
2 |
3 | namespace ReactiveDotsPlugin
4 | {
5 | public class EventSystemInfo
6 | {
7 | public ClassDeclarationSyntax ClassSyntax { private set; get; }
8 |
9 | public string SystemName { private set; get; }
10 | public string SystemNamespace { private set; get; }
11 | public string SystemNameFull { private set; get; }
12 |
13 | public EventSystemInfo( ClassDeclarationSyntax classSyntax )
14 | {
15 | ClassSyntax = classSyntax;
16 | SystemName = ClassSyntax.Identifier.Text;
17 | SystemNamespace = GeneratorUtils.GetNamespaceFor( ClassSyntax );
18 | SystemNameFull = GeneratorUtils.GetFullName( ClassSyntax );
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/EventSystems/EventSystemSyntaxReceiver.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.CodeAnalysis;
2 | using Microsoft.CodeAnalysis.CSharp.Syntax;
3 |
4 | namespace ReactiveDotsPlugin
5 | {
6 | public class EventSystemSyntaxReceiver : ISyntaxReceiver
7 | {
8 | public List EventSystems { private set; get; } = new List();
9 | public List EventComponents { private set; get; } = new List();
10 |
11 | public void OnVisitSyntaxNode( SyntaxNode syntaxNode )
12 | {
13 | // Look for classes with [ReactiveEventSystem]
14 | CheckIfReactiveEventSystem( syntaxNode );
15 |
16 | // Look for structs with [ReactiveEvent]
17 | CheckIfReactiveEventComponent( syntaxNode );
18 |
19 | // Look for types with [ReactiveEventFor]
20 | CheckIfReactiveEventForComponent( syntaxNode );
21 | }
22 |
23 | private void CheckIfReactiveEventSystem( SyntaxNode syntaxNode )
24 | {
25 | if ( syntaxNode is ClassDeclarationSyntax classNode ) {
26 | GeneratorUtils.GetAttributes( classNode, "ReactiveEventSystem", out var attributes );
27 | if ( attributes.Count > 0 )
28 | EventSystems.Add( new EventSystemInfo( classNode ) );
29 | }
30 | }
31 |
32 | private void CheckIfReactiveEventComponent( SyntaxNode syntaxNode )
33 | {
34 | if ( syntaxNode is StructDeclarationSyntax structNode ) {
35 | GeneratorUtils.GetAttributes( structNode, "ReactiveEvent", out var attributes );
36 | foreach ( var attribute in attributes ) {
37 | EventComponents.Add( new EventComponentInfo( structNode, attribute ) );
38 | }
39 | }
40 | }
41 |
42 | private void CheckIfReactiveEventForComponent( SyntaxNode syntaxNode )
43 | {
44 | if ( syntaxNode is TypeDeclarationSyntax typeNode ) {
45 | GeneratorUtils.GetAttributes( typeNode, "ReactiveEventFor", out var attributes );
46 | foreach ( var attribute in attributes ) {
47 | EventComponents.Add( new EventComponentInfo( typeNode, attribute ) );
48 | }
49 | }
50 | }
51 | }
52 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/EventSystems/EventType.cs:
--------------------------------------------------------------------------------
1 | namespace ReactiveDotsPlugin
2 | {
3 | public enum EventType
4 | {
5 | All,
6 | Added,
7 | Removed,
8 | Changed,
9 | }
10 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/GeneratorUtils.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics.Contracts;
2 | using System.Text;
3 | using Microsoft.CodeAnalysis;
4 | using Microsoft.CodeAnalysis.CSharp;
5 | using Microsoft.CodeAnalysis.CSharp.Syntax;
6 |
7 | namespace ReactiveDotsPlugin
8 | {
9 | public static class GeneratorUtils
10 | {
11 | // https://stackoverflow.com/a/52694992
12 | public static string GetFullName( TypeDeclarationSyntax source )
13 | {
14 | Contract.Requires( null != source );
15 |
16 | var items = new List();
17 | var parent = source.Parent;
18 | while ( parent.IsKind( SyntaxKind.ClassDeclaration ) ) {
19 | var parentClass = parent as TypeDeclarationSyntax;
20 | Contract.Assert( null != parentClass );
21 | items.Add( parentClass.Identifier.Text );
22 |
23 | parent = parent.Parent;
24 | }
25 |
26 | var nameSpace = parent as NamespaceDeclarationSyntax;
27 | Contract.Assert( null != nameSpace );
28 | var sb = new StringBuilder().Append( nameSpace.Name ).Append( '.' );
29 | items.Reverse();
30 | items.ForEach( i => { sb.Append( i ).Append( '.' ); } );
31 | sb.Append( source.Identifier.Text );
32 |
33 | var result = sb.ToString();
34 | return result;
35 | }
36 |
37 | public static bool TryFindStructSyntaxByName( GeneratorExecutionContext context, string structName,
38 | out StructDeclarationSyntax? structSyntax, TypeDeclarationSyntax optionalPreferredParent = null )
39 | {
40 | var allFound = context.Compilation.SyntaxTrees
41 | .SelectMany( st => st
42 | .GetRoot()
43 | .DescendantNodes()
44 | .OfType() )
45 | .Where( str => str.Identifier.Text.Equals( structName ) )
46 | .ToList();
47 | if ( allFound.Count == 0 )
48 | structSyntax = null;
49 | else if ( allFound.Count == 1 || optionalPreferredParent == null )
50 | structSyntax = allFound[0];
51 | else {
52 | structSyntax = allFound.FirstOrDefault( s =>
53 | {
54 | var parentSyntax = s.Parent as TypeDeclarationSyntax;
55 | if ( parentSyntax == null )
56 | return false;
57 | return parentSyntax.Identifier.Text.Equals( optionalPreferredParent.Identifier.Text );
58 | } );
59 | if ( structSyntax == null )
60 | structSyntax = allFound[0];
61 | }
62 |
63 | return structSyntax != null;
64 | }
65 |
66 | public static bool TryFindClassSyntaxByName( GeneratorExecutionContext context, string className,
67 | out ClassDeclarationSyntax? classSyntax )
68 | {
69 | classSyntax = context.Compilation.SyntaxTrees
70 | .SelectMany( st => st
71 | .GetRoot()
72 | .DescendantNodes()
73 | .OfType() )
74 | .FirstOrDefault( str => str.Identifier.Text.Equals( className ) ) ?? null;
75 | return classSyntax != null;
76 | }
77 |
78 | public static string GetNamespaceFor( SyntaxNode s )
79 | {
80 | return s.Parent switch {
81 | NamespaceDeclarationSyntax namespaceDeclarationSyntax => namespaceDeclarationSyntax.Name.ToString(),
82 | null => string.Empty,
83 | _ => GetNamespaceFor( s.Parent )
84 | };
85 | }
86 |
87 | public static void GetAttributes( BaseTypeDeclarationSyntax typeSyntax, string attributeName,
88 | out List output )
89 | {
90 | output = new List();
91 | output.AddRange(
92 | from attributeList in typeSyntax.AttributeLists
93 | from attribute in attributeList.Attributes
94 | where attribute.Name.ToString() == attributeName
95 | select attribute
96 | );
97 | }
98 |
99 | public static string GetTypeofFromAttributeArgument( AttributeArgumentSyntax attributeArgument )
100 | {
101 | var expression = attributeArgument.Expression.ToFullString();
102 | var compTypeName = expression.Replace( "typeof(", "" ).Replace( ")", "" ).Trim();
103 | return compTypeName;
104 | }
105 |
106 | public static string GetAttributeArgumentValue( AttributeSyntax attribute, string argumentName,
107 | string defaultValue )
108 | {
109 | var argument = attribute.ArgumentList!.Arguments
110 | .FirstOrDefault( arg =>
111 | {
112 | if ( arg == null || arg.NameEquals == null )
113 | return false;
114 | return arg.NameEquals.Name.Identifier.ValueText.Equals( argumentName );
115 | } );
116 | var argumentValue = "Value";
117 | if ( argument != null )
118 | argumentValue = argument.Expression.NormalizeWhitespace().ToFullString()
119 | .Replace( "\"", "" );
120 | return argumentValue;
121 | }
122 |
123 | public static string GetAttributeArgumentValue( AttributeSyntax attribute, int argumentIndex,
124 | string defaultValue )
125 | {
126 | if ( attribute.ArgumentList == null || attribute.ArgumentList.Arguments.Count <= argumentIndex )
127 | return string.Empty;
128 | var argument = attribute.ArgumentList!.Arguments[argumentIndex];
129 | var argumentValue = string.Empty;
130 | if ( argument != null )
131 | argumentValue = argument.Expression.NormalizeWhitespace().ToFullString()
132 | .Replace( "\"", "" );
133 | return argumentValue;
134 | }
135 |
136 | public static void PopulateSetWithUniqueUsings( HashSet set, TypeDeclarationSyntax type,
137 | GeneratorExecutionContext context )
138 | {
139 | var usingsForType = type.SyntaxTree.GetCompilationUnitRoot( context.CancellationToken ).Usings;
140 | foreach ( var usingForType in usingsForType ) {
141 | var str = usingForType.Name.ToString();
142 | if ( set.Contains( str ) )
143 | continue;
144 | set.Add( str );
145 | }
146 | }
147 |
148 | public static string GetUsingsInsert( GeneratorExecutionContext context, TypeDeclarationSyntax type,
149 | HashSet? additional = null )
150 | {
151 | var usings = additional == null ? new HashSet() : new HashSet( additional );
152 | GeneratorUtils.PopulateSetWithUniqueUsings( usings, type, context );
153 | var usingsInsert = string.Empty;
154 | foreach ( var u in usings )
155 | usingsInsert += "using " + u + ";\n";
156 | return usingsInsert;
157 | }
158 |
159 | public static void SplitTypeName( string full, out string visibleNamespace, out string name )
160 | {
161 | var split = full.Split( '.' );
162 | name = split[split.Length - 1];
163 | visibleNamespace = string.Empty;
164 | if ( split.Length >= 2 ) {
165 | for ( int i = 0; i < split.Length - 1; i++ )
166 | visibleNamespace += split[i] + ( i < split.Length - 2 ? "." : "" );
167 | }
168 | }
169 |
170 | public struct TypeNames
171 | {
172 | public string? Name;
173 | public string? NamespaceWithContainingTypes;
174 | public string? FullName;
175 | }
176 |
177 | public static TypeNames GetTypeNamesFromAttributeArgument( GeneratorExecutionContext context,
178 | AttributeArgumentSyntax arg )
179 | {
180 | var typeofExpr = arg.Expression as TypeOfExpressionSyntax;
181 | if ( typeofExpr == null )
182 | return default(TypeNames);
183 | return GetTypeNamesFromTypeofDeclaration( context, typeofExpr );
184 | }
185 |
186 | public static TypeNames GetTypeNamesFromTypeofDeclaration( GeneratorExecutionContext context,
187 | TypeOfExpressionSyntax expr )
188 | {
189 | var typeNames = new TypeNames();
190 | var typeInfo = context.Compilation.GetSemanticModel( expr.Type.SyntaxTree ).GetTypeInfo( expr.Type );
191 | var namedSymbol = typeInfo.Type as INamedTypeSymbol;
192 | var typeNamespace = namedSymbol?.ContainingNamespace.ToString();
193 | var typeParents = string.Empty;
194 | var parent = namedSymbol?.ContainingType;
195 | while ( parent != null ) {
196 | typeParents += parent.Name;
197 | parent = parent.ContainingType;
198 | if ( parent != null )
199 | typeParents += ".";
200 | }
201 |
202 | // type name
203 | typeNames.Name = namedSymbol?.Name;
204 |
205 | // type path (namespace + containing types)
206 | typeNames.NamespaceWithContainingTypes =
207 | ( string.IsNullOrEmpty( typeNamespace ) ? "" : typeNamespace + "." )
208 | + ( string.IsNullOrEmpty( typeParents ) ? "" : typeParents + "." );
209 | if ( typeNames.NamespaceWithContainingTypes.EndsWith( "." ) )
210 | typeNames.NamespaceWithContainingTypes =
211 | typeNames.NamespaceWithContainingTypes.Substring( 0,
212 | typeNames.NamespaceWithContainingTypes.Length - 1 );
213 |
214 | // type path + type name
215 | typeNames.FullName = ( string.IsNullOrEmpty( typeNames.NamespaceWithContainingTypes )
216 | ? typeNames.Name
217 | : typeNames.NamespaceWithContainingTypes + "." + typeNames.Name );
218 |
219 | return typeNames;
220 | }
221 | }
222 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/ReactiveSystems/ReactiveSystemAttributeInfo.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.CodeAnalysis;
2 | using Microsoft.CodeAnalysis.CSharp.Syntax;
3 |
4 | namespace ReactiveDotsPlugin
5 | {
6 | public class ReactiveSystemAttributeInfo
7 | {
8 | public AttributeSyntax AttributeSyntax { get; }
9 | public ClassDeclarationSyntax SystemClassSyntax { get; }
10 |
11 | public string ComponentName { private set; get; }
12 | public string ComponentNamespace { private set; get; }
13 | public string ComponentNameFull { private set; get; }
14 |
15 | public string ReactiveComponentName { private set; get; }
16 | public string ReactiveComponentNamespace { private set; get; }
17 | public string ReactiveComponentNameFull { private set; get; }
18 |
19 | public List FieldsToCompareName { get; }
20 | public bool IsTagComponent => FieldsToCompareName.Count == 0;
21 |
22 | public bool IsValid => !string.IsNullOrEmpty( ComponentName ) && !string.IsNullOrEmpty( ReactiveComponentName );
23 |
24 | public ReactiveSystemAttributeInfo( GeneratorExecutionContext context, AttributeSyntax attribute,
25 | ClassDeclarationSyntax system )
26 | {
27 | AttributeSyntax = attribute;
28 | SystemClassSyntax = system;
29 | if ( attribute.ArgumentList != null ) {
30 | if ( attribute.ArgumentList.Arguments.Count >= 1 )
31 | GetComponentInfo( context, attribute.ArgumentList.Arguments[0] );
32 | if ( attribute.ArgumentList.Arguments.Count >= 2 )
33 | GetReactiveComponentInfo( context, attribute.ArgumentList.Arguments[1] );
34 | }
35 |
36 | FieldsToCompareName = new List(
37 | GeneratorUtils.GetAttributeArgumentValue( attribute, "FieldNameToCompare", "Value" ).Split( ',' )
38 | .Where( ( str ) => !string.IsNullOrEmpty( str ) )
39 | );
40 | }
41 |
42 | private void GetComponentInfo( GeneratorExecutionContext context, AttributeArgumentSyntax arg )
43 | {
44 | var compNames = GeneratorUtils.GetTypeNamesFromAttributeArgument( context, arg );
45 | ComponentName = compNames.Name;
46 | ComponentNamespace = compNames.NamespaceWithContainingTypes;
47 | ComponentNameFull = compNames.FullName;
48 | }
49 |
50 | private void GetReactiveComponentInfo( GeneratorExecutionContext context, AttributeArgumentSyntax arg )
51 | {
52 | var compNames = GeneratorUtils.GetTypeNamesFromAttributeArgument( context, arg );
53 | ReactiveComponentName = compNames.Name;
54 | ReactiveComponentNamespace = compNames.NamespaceWithContainingTypes;
55 | ReactiveComponentNameFull = compNames.FullName;
56 | }
57 | }
58 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/ReactiveSystems/ReactiveSystemGenerator.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 | using System.Text;
3 | using Microsoft.CodeAnalysis;
4 | using Microsoft.CodeAnalysis.Text;
5 |
6 | namespace ReactiveDotsPlugin
7 | {
8 | [Generator]
9 | public class ReactiveSystemGenerator : SourceGeneratorBase
10 | {
11 | public override void Initialize( GeneratorInitializationContext context )
12 | {
13 | context.RegisterForSyntaxNotifications( () => new ReactiveSystemSyntaxReceiver() );
14 | }
15 |
16 | public override void Execute( GeneratorExecutionContext context )
17 | {
18 | var receiver = context.SyntaxReceiver as ReactiveSystemSyntaxReceiver;
19 | try {
20 | foreach ( var reactiveSystem in receiver.ReactiveSystems ) {
21 | reactiveSystem.UpdateAttributes( context );
22 | GenerateReactiveSystem( context, reactiveSystem );
23 | }
24 | }
25 | catch ( Exception e ) {
26 | Debug.WriteLine( "ReactiveSystemGenerator exception:\n" + e );
27 | }
28 | }
29 |
30 | private void GenerateReactiveSystem( GeneratorExecutionContext context, ReactiveSystemInfo reactiveSystem )
31 | {
32 | var replacer = new Replacer() {
33 | usings = GeneratorUtils.GetUsingsInsert(
34 | context, reactiveSystem.ClassSyntax,
35 | GetCommonUsings()
36 | ),
37 | systemNamespace = reactiveSystem.SystemNamespace,
38 | checkIfChangedMethodBody = "",
39 | systemNameFull = reactiveSystem.SystemNameFull,
40 | systemName = reactiveSystem.SystemName,
41 | isTagComponent = false,
42 | componentName = "",
43 | componentNameFull = "",
44 | reactiveComponentNameFull = ""
45 | };
46 |
47 | var globalTemplate = ReactiveSystemTemplates.GetGlobalTemplate();
48 | var reactiveUpdatesChangedInsert = string.Empty;
49 | var reactiveUpdatesRemovedInsert = string.Empty;
50 | var reactiveAddMissingReactiveDataInsert_WithoutEcb = string.Empty;
51 | var reactiveAddMissingReactiveDataInsert_WithTempEcb = string.Empty;
52 | var reactiveAddMissingReactiveDataInsert_WithExternalEcb = string.Empty;
53 | var reactiveComponentsInsert = string.Empty;
54 | for ( int i = 0; i < reactiveSystem.ReactiveAttributes.Count; i++ ) {
55 | if ( !reactiveSystem.ReactiveAttributes[i].IsValid )
56 | continue;
57 | replacer = UpdateReplacerWithComponentInfo( replacer, reactiveSystem.ReactiveAttributes[i] );
58 | reactiveAddMissingReactiveDataInsert_WithoutEcb += "\n" + replacer.Replace(
59 | ReactiveSystemTemplates.GetTemplateForSystemAddMissingReactiveData_WithoutEcb() );
60 | reactiveAddMissingReactiveDataInsert_WithTempEcb += "\n" + replacer.Replace(
61 | ReactiveSystemTemplates.GetTemplateForSystemAddMissingReactiveData_WithTempEcb() );
62 | reactiveAddMissingReactiveDataInsert_WithExternalEcb += "\n" + replacer.Replace(
63 | ReactiveSystemTemplates.GetTemplateForSystemAddMissingReactiveData_WithExternalEcb() );
64 | reactiveUpdatesChangedInsert += "\n" + replacer.Replace(
65 | ReactiveSystemTemplates.GetTemplateForChangedOrAddedCheck() );
66 | reactiveUpdatesRemovedInsert += "\n" + replacer.Replace(
67 | ReactiveSystemTemplates.GetTemplateForRemovedCheck() );
68 | reactiveComponentsInsert +=
69 | "\n" + replacer.Replace( ReactiveSystemTemplates.GetTemplateForComponent() );
70 | }
71 |
72 | var source = replacer.Replace( globalTemplate )
73 | .Replace( "$$placeForAddMissingReactiveData_WithoutEcb$$",
74 | reactiveAddMissingReactiveDataInsert_WithoutEcb )
75 | .Replace( "$$placeForAddMissingReactiveData_WithTempEcb$$",
76 | reactiveAddMissingReactiveDataInsert_WithTempEcb )
77 | .Replace( "$$placeForAddMissingReactiveData_WithExternalEcb$$",
78 | reactiveAddMissingReactiveDataInsert_WithExternalEcb )
79 | .Replace( "$$placeForUpdatesChanged$$", reactiveUpdatesChangedInsert )
80 | .Replace( "$$placeForUpdatesRemoved$$", reactiveUpdatesRemovedInsert )
81 | .Replace( "$$placeForComponents$$", reactiveComponentsInsert );
82 | context.AddSource( $"{reactiveSystem.SystemName}.Reactive.g.cs", SourceText.From( source, Encoding.UTF8 ) );
83 | }
84 |
85 | private Replacer UpdateReplacerWithComponentInfo( Replacer replacer, ReactiveSystemAttributeInfo attribute )
86 | {
87 | var checkIfChangedBodyInsert = string.Empty;
88 |
89 | for ( int i = 0; i < attribute.FieldsToCompareName.Count; i++ ) {
90 | var check = ReactiveSystemTemplates.GetTemplateForCheckIfChangedInstruction(
91 | attribute.FieldsToCompareName[i] );
92 | checkIfChangedBodyInsert += check;
93 | }
94 |
95 | replacer.checkIfChangedMethodBody = checkIfChangedBodyInsert;
96 | replacer.isTagComponent = attribute.IsTagComponent;
97 | replacer.componentNameFull = attribute.ComponentNameFull;
98 | replacer.componentName = attribute.ComponentName;
99 | replacer.reactiveComponentNameFull = attribute.ReactiveComponentNameFull;
100 |
101 | return replacer;
102 | }
103 | }
104 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/ReactiveSystems/ReactiveSystemInfo.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.CodeAnalysis;
2 | using Microsoft.CodeAnalysis.CSharp.Syntax;
3 |
4 | namespace ReactiveDotsPlugin
5 | {
6 | public class ReactiveSystemInfo
7 | {
8 | public ClassDeclarationSyntax ClassSyntax { private set; get; }
9 | public List ReactiveAttributes { private set; get; }
10 |
11 | public string SystemName { private set; get; }
12 | public string SystemNamespace { private set; get; }
13 | public string SystemNameFull { private set; get; }
14 |
15 | private List _tempAttributes;
16 |
17 | public ReactiveSystemInfo( ClassDeclarationSyntax classSyntax, List reactiveAttributes )
18 | {
19 | ClassSyntax = classSyntax;
20 | ReactiveAttributes = new List();
21 | _tempAttributes = reactiveAttributes;
22 | SystemName = ClassSyntax.Identifier.Text;
23 | SystemNamespace = GeneratorUtils.GetNamespaceFor( ClassSyntax );
24 | SystemNameFull = GeneratorUtils.GetFullName( ClassSyntax );
25 | }
26 |
27 | public void UpdateAttributes( GeneratorExecutionContext context )
28 | {
29 | foreach ( var reactiveAttribute in _tempAttributes )
30 | ReactiveAttributes.Add( new ReactiveSystemAttributeInfo( context, reactiveAttribute, ClassSyntax ) );
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/ReactiveSystems/ReactiveSystemSyntaxReceiver.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.CodeAnalysis;
2 | using Microsoft.CodeAnalysis.CSharp.Syntax;
3 |
4 | namespace ReactiveDotsPlugin
5 | {
6 | public class ReactiveSystemSyntaxReceiver : ISyntaxReceiver
7 | {
8 | public List ReactiveSystems { private set; get; } = new List();
9 |
10 | public void OnVisitSyntaxNode( SyntaxNode syntaxNode )
11 | {
12 | if ( syntaxNode is not ClassDeclarationSyntax classNode )
13 | return;
14 | GeneratorUtils.GetAttributes( classNode, "ReactiveSystem", out var attributes );
15 | if ( attributes.Count > 0 )
16 | ReactiveSystems.Add( new ReactiveSystemInfo( classNode, attributes ) );
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/ReactiveDotsPlugin/SourceGeneratorBase.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.CodeAnalysis;
2 |
3 | namespace ReactiveDotsPlugin
4 | {
5 | public abstract class SourceGeneratorBase : ISourceGenerator
6 | {
7 | public struct Replacer
8 | {
9 | public string usings;
10 | public string systemNamespace;
11 | public string checkIfChangedMethodBody;
12 | public string systemNameFull;
13 | public string systemName;
14 | public bool isTagComponent;
15 | public string componentName;
16 | public string componentNameFull;
17 | public string reactiveComponentNameFull;
18 |
19 | public string Replace( string original )
20 | {
21 | return original
22 | .Replace( "$$placeForUsings$$", usings )
23 | .Replace( "$$namespace$$", systemNamespace )
24 | .Replace( "$$placeForCheckIfChangedBody$$", checkIfChangedMethodBody )
25 | .Replace( "$$systemNameFull$$", systemNameFull )
26 | .Replace( "$$systemName$$", systemName )
27 | .Replace( "$$isTagComponent$$", isTagComponent ? "true" : "false" )
28 | .Replace( "$$componentName$$", componentName )
29 | .Replace( "$$componentNameFull$$", componentNameFull )
30 | .Replace( "$$reactiveComponentNameFull$$", reactiveComponentNameFull );
31 | }
32 | }
33 |
34 | public abstract void Initialize( GeneratorInitializationContext context );
35 | public abstract void Execute( GeneratorExecutionContext context );
36 |
37 | protected HashSet GetCommonUsings()
38 | {
39 | var set = new HashSet();
40 | set.Add( "System" );
41 | set.Add( "System.Collections.Generic" );
42 | set.Add( "Unity.Collections" );
43 | set.Add( "Unity.Entities" );
44 | set.Add( "Unity.Burst.Intrinsics" );
45 | set.Add( "ReactiveDots" );
46 | return set;
47 | }
48 | }
49 | }
--------------------------------------------------------------------------------