diff --git a/Context/Legacy.meta b/Context/Legacy.meta deleted file mode 100644 index 97c070b..0000000 --- a/Context/Legacy.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 026077faae4dc884ebe1eb4b427ed1e4 -folderAsset: yes -timeCreated: 1434754873 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/ECS.meta b/ECS.meta new file mode 100644 index 0000000..78d0f09 --- /dev/null +++ b/ECS.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 5015ea56c030d6542bd4daa46f59e549 +folderAsset: yes +DefaultImporter: + userData: diff --git a/ECS/Engine.meta b/ECS/Engine.meta new file mode 100644 index 0000000..a28bd0e --- /dev/null +++ b/ECS/Engine.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: b1f3314cac8b8484f965651234415ca8 +folderAsset: yes +DefaultImporter: + userData: diff --git a/EntitySystem/Engine/IEngine.cs b/ECS/Engine/IEngine.cs similarity index 100% rename from EntitySystem/Engine/IEngine.cs rename to ECS/Engine/IEngine.cs diff --git a/ECS/Engine/IEngine.cs.meta b/ECS/Engine/IEngine.cs.meta new file mode 100644 index 0000000..8ee8df3 --- /dev/null +++ b/ECS/Engine/IEngine.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 26f6a5fa5638d86448dd3f2d11d62f5c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/EntitySystem/EnginesRoot.cs b/ECS/EnginesRoot.cs similarity index 100% rename from EntitySystem/EnginesRoot.cs rename to ECS/EnginesRoot.cs diff --git a/ECS/EnginesRoot.cs.meta b/ECS/EnginesRoot.cs.meta new file mode 100644 index 0000000..aa7b562 --- /dev/null +++ b/ECS/EnginesRoot.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 89361a8514a38544ebb87df0bd766dc5 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/EntitySystem/IEnginesRoot.cs b/ECS/IEnginesRoot.cs similarity index 100% rename from EntitySystem/IEnginesRoot.cs rename to ECS/IEnginesRoot.cs diff --git a/EntitySystem/IEnginesRoot.cs.meta b/ECS/IEnginesRoot.cs.meta similarity index 78% rename from EntitySystem/IEnginesRoot.cs.meta rename to ECS/IEnginesRoot.cs.meta index 7fad7e5..b73c9f1 100644 --- a/EntitySystem/IEnginesRoot.cs.meta +++ b/ECS/IEnginesRoot.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2253f20f6b4d9b14eb0e79fbd135eff1 +guid: b0078c1edf75425478b89366d5fe3bae MonoImporter: serializedVersion: 2 defaultReferences: [] diff --git a/EntitySystem/Node.meta b/ECS/Node.meta similarity index 55% rename from EntitySystem/Node.meta rename to ECS/Node.meta index eec644a..f40a80e 100644 --- a/EntitySystem/Node.meta +++ b/ECS/Node.meta @@ -1,9 +1,5 @@ fileFormatVersion: 2 guid: 8e3c19ee9185a664aa837e567c4db122 folderAsset: yes -timeCreated: 1434900315 -licenseType: Free DefaultImporter: userData: - assetBundleName: - assetBundleVariant: diff --git a/EntitySystem/Node/INode.cs b/ECS/Node/INode.cs similarity index 100% rename from EntitySystem/Node/INode.cs rename to ECS/Node/INode.cs diff --git a/ECS/Node/INode.cs.meta b/ECS/Node/INode.cs.meta new file mode 100644 index 0000000..bd3f81b --- /dev/null +++ b/ECS/Node/INode.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc6bea8c56bd7284693db26502c6b65b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/EntitySystem/Node/INodeHolder.cs b/ECS/Node/INodeHolder.cs similarity index 100% rename from EntitySystem/Node/INodeHolder.cs rename to ECS/Node/INodeHolder.cs diff --git a/ECS/Node/INodeHolder.cs.meta b/ECS/Node/INodeHolder.cs.meta new file mode 100644 index 0000000..dceb188 --- /dev/null +++ b/ECS/Node/INodeHolder.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a4c0061442f32644cb1e434b6544d56c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/EntitySystem/Unity.meta b/ECS/Unity.meta similarity index 55% rename from EntitySystem/Unity.meta rename to ECS/Unity.meta index 4439d15..81bc6f8 100644 --- a/EntitySystem/Unity.meta +++ b/ECS/Unity.meta @@ -1,9 +1,5 @@ fileFormatVersion: 2 guid: e369cc976007e884d92f906e4d1054d7 folderAsset: yes -timeCreated: 1438460466 -licenseType: Free DefaultImporter: userData: - assetBundleName: - assetBundleVariant: diff --git a/EntitySystem/Unity/UnityNodeHolder.cs b/ECS/Unity/UnityNodeHolder.cs similarity index 100% rename from EntitySystem/Unity/UnityNodeHolder.cs rename to ECS/Unity/UnityNodeHolder.cs diff --git a/EntitySystem/Unity/UnityNodeHolder.cs.meta b/ECS/Unity/UnityNodeHolder.cs.meta similarity index 67% rename from EntitySystem/Unity/UnityNodeHolder.cs.meta rename to ECS/Unity/UnityNodeHolder.cs.meta index bdb4dd4..f531773 100644 --- a/EntitySystem/Unity/UnityNodeHolder.cs.meta +++ b/ECS/Unity/UnityNodeHolder.cs.meta @@ -1,12 +1,8 @@ fileFormatVersion: 2 guid: 50ed7d1adb836dd4786fef832cb4e808 -timeCreated: 1438011258 -licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: - assetBundleName: - assetBundleVariant: diff --git a/EntitySystem/UnityEnginesRoot.cs b/ECS/UnityEnginesRoot.cs similarity index 56% rename from EntitySystem/UnityEnginesRoot.cs rename to ECS/UnityEnginesRoot.cs index b18d317..c280c18 100644 --- a/EntitySystem/UnityEnginesRoot.cs +++ b/ECS/UnityEnginesRoot.cs @@ -21,18 +21,43 @@ namespace Svelto.ES public void AddGameObjectEntity(GameObject entity) { +#if UNITY_5_0 INodeHolder[] nodeHolders = entity.GetComponents(); - + for (int i = 0; i < nodeHolders.Length; i++) nodeHolders[i].engineRoot = this; +#else + MonoBehaviour[] nodeHolders = entity.GetComponents(); + + for (int i = 0; i < nodeHolders.Length; i++) + { + var nodeHolder = nodeHolders[i]; + + if (nodeHolder is INodeHolder) + (nodeHolders[i] as INodeHolder).engineRoot = this; + } +#endif + } public void RemoveGameObjectEntity(GameObject entity) { +#if UNITY_5_0 INodeHolder[] nodeHolders = entity.GetComponents(); for (int i = 0; i < nodeHolders.Length; i++) Remove(nodeHolders[i].node); +#else + MonoBehaviour[] nodeHolders = entity.GetComponents(); + + for (int i = 0; i < nodeHolders.Length; i++) + { + var nodeHolder = nodeHolders[i]; + + if (nodeHolder is INodeHolder) + Remove((nodeHolder as INodeHolder).node); + } +#endif } EnginesRoot _engineRoot = new EnginesRoot(); diff --git a/ECS/UnityEnginesRoot.cs.meta b/ECS/UnityEnginesRoot.cs.meta new file mode 100644 index 0000000..61a53bf --- /dev/null +++ b/ECS/UnityEnginesRoot.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6e4e1cde52e768148a0aaf8effbb9ba3 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/EntitySystem.meta b/EntitySystem.meta deleted file mode 100644 index 762a089..0000000 --- a/EntitySystem.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 8c3236edfa0d4cb43afb277ef6aea664 -folderAsset: yes -timeCreated: 1431201025 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/EntitySystem/Engine.meta b/EntitySystem/Engine.meta deleted file mode 100644 index 0a7f017..0000000 --- a/EntitySystem/Engine.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 89495a852d57f3d4893d89a74065ee39 diff --git a/Observer.meta b/Observer.meta new file mode 100644 index 0000000..1e0c65f --- /dev/null +++ b/Observer.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 48e872bc336b396409c9316cdbfc045a +folderAsset: yes +DefaultImporter: + userData: diff --git a/Observer/Observable.cs b/Observer/Observable.cs new file mode 100644 index 0000000..289f984 --- /dev/null +++ b/Observer/Observable.cs @@ -0,0 +1,21 @@ +using System; + +namespace Svelto.Observer +{ + public interface IObservable + { + event Action Notify; + + void Dispatch(DispatchType parameter); + } + + public class Observable:IObservable + { + public event Action Notify; + + public void Dispatch(DispatchType parameter) + { + Notify(parameter); + } + } +} diff --git a/EntitySystem/UnityEnginesRoot.cs.meta b/Observer/Observable.cs.meta similarity index 76% rename from EntitySystem/UnityEnginesRoot.cs.meta rename to Observer/Observable.cs.meta index 6c5d463..6dacf05 100644 --- a/EntitySystem/UnityEnginesRoot.cs.meta +++ b/Observer/Observable.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: 6e4e1cde52e768148a0aaf8effbb9ba3 -timeCreated: 1439726868 +guid: c2a9f8efc13196f40bdc41e36e9f78fb +timeCreated: 1440356670 licenseType: Free MonoImporter: serializedVersion: 2 diff --git a/Observer/Observer.cs b/Observer/Observer.cs new file mode 100644 index 0000000..5979d6f --- /dev/null +++ b/Observer/Observer.cs @@ -0,0 +1,58 @@ +using System; + +namespace Svelto.Observer +{ + public abstract class Observer: IObserver + { + public Observer(Observable observable) + { + observable.Notify += OnObservableDispatched; + + _unsubscribe = () => observable.Notify -= OnObservableDispatched; + } + + public void AddAction(Action action) + { + _actions += action; + } + + public void RemoveAction(Action action) + { + _actions += action; + } + + public void Unsubscribe() + { + _unsubscribe(); + } + + private void OnObservableDispatched(DispatchType dispatchNotification) + { + _actions(TypeMap(dispatchNotification)); + } + + abstract protected ActionType TypeMap(DispatchType dispatchNotification); + + Action _actions; + Action _unsubscribe; + } + + public class Observer: Observer + { + public Observer(Observable observable):base(observable) + {} + + protected override DispatchType TypeMap(DispatchType dispatchNotification) + { + return dispatchNotification; + } + } + + public interface IObserver + { + void AddAction(Action action); + void RemoveAction(Action action); + + void Unsubscribe(); + } +} diff --git a/EntitySystem/Node/INode.cs.meta b/Observer/Observer.cs.meta similarity index 76% rename from EntitySystem/Node/INode.cs.meta rename to Observer/Observer.cs.meta index b2c29d6..e1a901b 100644 --- a/EntitySystem/Node/INode.cs.meta +++ b/Observer/Observer.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: fc6bea8c56bd7284693db26502c6b65b -timeCreated: 1434900316 +guid: 632ffa30ee5cc9d40af433bd31a2f57a +timeCreated: 1440352946 licenseType: Free MonoImporter: serializedVersion: 2 diff --git a/Ticker.meta b/Ticker.meta new file mode 100644 index 0000000..9a9ebf6 --- /dev/null +++ b/Ticker.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 86d00787627f3e643bfb37812067fbc5 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Ticker/ITickable.cs b/Ticker/ITickable.cs new file mode 100644 index 0000000..61485ad --- /dev/null +++ b/Ticker/ITickable.cs @@ -0,0 +1,26 @@ +namespace Svelto.Ticker +{ + public interface ITickableBase + { + } + + public interface ITickable: ITickableBase + { + void Tick(float deltaSec); + } + + public interface ILateTickable : ITickableBase + { + void LateTick(float deltaSec); + } + + public interface IPhysicallyTickable : ITickableBase + { + void PhysicsTick(float deltaSec); + } + + public interface IIntervaledTickable : ITickableBase + { + void IntervaledTick(); + } +} diff --git a/EntitySystem/Engine/IEngine.cs.meta b/Ticker/ITickable.cs.meta similarity index 76% rename from EntitySystem/Engine/IEngine.cs.meta rename to Ticker/ITickable.cs.meta index 63fca9f..e628cd5 100644 --- a/EntitySystem/Engine/IEngine.cs.meta +++ b/Ticker/ITickable.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0b5d886dff6d02148ab73bdb3f0ca4f7 +guid: b9ebca86eb6d1f64ba93813b675c4f88 MonoImporter: serializedVersion: 2 defaultReferences: [] diff --git a/Ticker/ITicker.cs b/Ticker/ITicker.cs new file mode 100644 index 0000000..a1190ba --- /dev/null +++ b/Ticker/ITicker.cs @@ -0,0 +1,12 @@ +using System; + +namespace Svelto.Ticker +{ + public interface ITicker + { + void Add(ITickableBase tickable); + void Remove(ITickableBase tickable); + } +} + + diff --git a/EntitySystem/EnginesRoot.cs.meta b/Ticker/ITicker.cs.meta similarity index 76% rename from EntitySystem/EnginesRoot.cs.meta rename to Ticker/ITicker.cs.meta index cc67e45..079ce10 100644 --- a/EntitySystem/EnginesRoot.cs.meta +++ b/Ticker/ITicker.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 93350fd2ba4f60f4f88599169e8d31cb +guid: 5a726e8ced6bca340b272e7bd64ebcad MonoImporter: serializedVersion: 2 defaultReferences: [] diff --git a/Ticker/IntervaledTickAttribute.cs b/Ticker/IntervaledTickAttribute.cs new file mode 100644 index 0000000..ef3a879 --- /dev/null +++ b/Ticker/IntervaledTickAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace Svelto.Ticker +{ + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + internal class IntervaledTickAttribute : Attribute + { + public float interval; + + public IntervaledTickAttribute(float intervalTime) + { + interval = intervalTime; + } + } +} diff --git a/EntitySystem/Node/INodeHolder.cs.meta b/Ticker/IntervaledTickAttribute.cs.meta similarity index 76% rename from EntitySystem/Node/INodeHolder.cs.meta rename to Ticker/IntervaledTickAttribute.cs.meta index 1a65ca3..e80216c 100644 --- a/EntitySystem/Node/INodeHolder.cs.meta +++ b/Ticker/IntervaledTickAttribute.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: a4c0061442f32644cb1e434b6544d56c -timeCreated: 1434900315 +guid: fe6689309725deb4f975fb62e1e061e4 +timeCreated: 1435431616 licenseType: Free MonoImporter: serializedVersion: 2 diff --git a/Ticker/TickBehaviour.cs b/Ticker/TickBehaviour.cs new file mode 100644 index 0000000..f5ff11d --- /dev/null +++ b/Ticker/TickBehaviour.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; + +namespace Svelto.Ticker +{ + public class TickBehaviour:MonoBehaviour + { + internal void Add(ITickable tickable) + { + _ticked.Add(tickable); + } + + internal void Remove(ITickable tickable) + { + _ticked.Remove(tickable); + } + + internal void AddPhysic(IPhysicallyTickable tickable) + { + _physicallyTicked.Add(tickable); + } + + internal void RemovePhysic(IPhysicallyTickable tickable) + { + _physicallyTicked.Remove(tickable); + } + + internal void AddLate(ILateTickable tickable) + { + _lateTicked.Add(tickable); + } + + internal void RemoveLate(ILateTickable tickable) + { + _lateTicked.Remove(tickable); + } + + internal void AddIntervaled(IIntervaledTickable tickable) + { + var methodInfo = ((Action)tickable.IntervaledTick).Method; + object[] attrs = methodInfo.GetCustomAttributes(typeof(IntervaledTickAttribute), true); + + IEnumerator intervaledTick = IntervaledUpdate(tickable, (attrs[0] as IntervaledTickAttribute).interval); + + _intervalledTicked[tickable] = intervaledTick; + + StartCoroutine(intervaledTick); + } + + internal void RemoveIntervaled(IIntervaledTickable tickable) + { + IEnumerator enumerator; + + if (_intervalledTicked.TryGetValue(tickable, out enumerator)) + { + StopCoroutine(enumerator); + _intervalledTicked.Remove(tickable); + } + } + + void Update() + { + for (int i = _ticked.Count - 1; i >= 0; --i) + _ticked[i].Tick(Time.deltaTime); + } + void LateUpdate() + { + for (int i = _lateTicked.Count - 1; i >= 0; --i) + _lateTicked[i].LateTick(Time.deltaTime); + } + void FixedUpdate() + { + for (int i = _physicallyTicked.Count - 1; i >= 0; --i) + _physicallyTicked[i].PhysicsTick(Time.deltaTime); + } + IEnumerator IntervaledUpdate(IIntervaledTickable tickable, float seconds) + { + while (true) { DateTime next = DateTime.UtcNow.AddSeconds(seconds); while (DateTime.UtcNow < next) yield return null; tickable.IntervaledTick(); } + } + + private List _ticked = new List(); + private List _lateTicked = new List(); + private List _physicallyTicked = new List(); + private Dictionary _intervalledTicked = new Dictionary(); + } +} diff --git a/Ticker/TickBehaviour.cs.meta b/Ticker/TickBehaviour.cs.meta new file mode 100644 index 0000000..9ed94d3 --- /dev/null +++ b/Ticker/TickBehaviour.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b522dd9c9c9c5a941a49ff6a52222824 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Ticker/UnityTicker.cs b/Ticker/UnityTicker.cs new file mode 100644 index 0000000..e1ad40b --- /dev/null +++ b/Ticker/UnityTicker.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace Svelto.Ticker +{ + internal class UnityTicker: ITicker + { + public UnityTicker() + { + _ticker = GameObject.FindObjectOfType(); + + if (_ticker == null) + { + GameObject go = new GameObject("SveltoTicker"); + + _ticker = go.AddComponent(); + } + } + + public void Add(ITickableBase tickable) + { + if (tickable is ITickable) + _ticker.Add(tickable as ITickable); + + if (tickable is IPhysicallyTickable) + _ticker.AddPhysic(tickable as IPhysicallyTickable); + + if (tickable is ILateTickable) + _ticker.AddLate(tickable as ILateTickable); + + if (tickable is IIntervaledTickable) + _ticker.AddIntervaled(tickable as IIntervaledTickable); + } + + public void Remove(ITickableBase tickable) + { + if (tickable is ITickable) + _ticker.Remove(tickable as ITickable); + + if (tickable is IPhysicallyTickable) + _ticker.RemovePhysic(tickable as IPhysicallyTickable); + + if (tickable is ILateTickable) + _ticker.RemoveLate(tickable as ILateTickable); + + if (tickable is IIntervaledTickable) + _ticker.RemoveIntervaled(tickable as IIntervaledTickable); + } + + private TickBehaviour _ticker; + } +} + + + + + diff --git a/Ticker/UnityTicker.cs.meta b/Ticker/UnityTicker.cs.meta new file mode 100644 index 0000000..8f1aea0 --- /dev/null +++ b/Ticker/UnityTicker.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8972f22f09349484b8537133b3905062 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0}