Skip to content

Commit 8a7b376

Browse files
committed
SyncRent
1 parent 5104e17 commit 8a7b376

34 files changed

+248
-115
lines changed

Assets/PoolSample/ComponentPools/Scripts/CubeBoxCollider.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class CubeBoxCollider : ComponentPrefab<BoxCollider>
1313
{
1414
public CubeBoxCollider() : base(){}
1515

16-
protected override UniTask<BoxCollider> Instantiate(BoxCollider source, Transform parent, CancellationToken cancelToken)
16+
protected override UniTask<BoxCollider> InstantiateAsync(BoxCollider source, Transform parent, CancellationToken cancelToken)
1717
{
1818
BoxCollider instance;
1919

Packages/ZBase.Foundation.Pooling/GameObjectLazyPool/GlobalPools/Extensions/LazyGameObjectPool.cs

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ public static class LazyGameObjectPool
99
{
1010
private static GlobalGameObjectPool GlobalGameObjectPool => SharedPool.Of<GlobalGameObjectPool>();
1111

12+
public static GameObject RentSync(GameObject gameObjectReference)
13+
=> GlobalGameObjectPool.RentSync(gameObjectReference);
14+
1215
public static async UniTask<GameObject> Rent(GameObject gameObjectReference)
1316
=> await GlobalGameObjectPool.Rent(gameObjectReference);
1417
public static async UniTask<GameObject> Rent(GameObjectPrefab gameObjectReference)

Packages/ZBase.Foundation.Pooling/GameObjectLazyPool/GlobalPools/GlobalGameObjectPool.cs

+27-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ public async UniTask<GameObject> Rent(GameObject gameObjectReference)
1919
this._poolKeyCache.Add(hash, key = new GameObjectPrefab { Source = gameObjectReference });
2020
return await Rent(key);
2121
}
22+
23+
public GameObject RentSync(GameObject gameObjectReference)
24+
{
25+
var hash = gameObjectReference.GetInstanceID();
26+
if (!_poolKeyCache.TryGetValue(hash, out var key))
27+
this._poolKeyCache.Add(hash, key = new GameObjectPrefab { Source = gameObjectReference });
28+
return RentSync(key);
29+
}
30+
2231

2332
public async UniTask<GameObject> Rent(GameObjectPrefab gameObjectReference)
2433
{
@@ -33,12 +42,29 @@ public async UniTask<GameObject> Rent(GameObjectPrefab gameObjectReference)
3342
pool.OnPoolEmpty += OnPoolEmpty;
3443
this._pools.Add(instanceID, pool);
3544
}
36-
3745
GameObject item = await pool.Rent();
3846
this._dicTrackingInstancePools.Add(item.GetInstanceID(), pool);
3947
return item;
4048
}
4149

50+
private GameObject RentSync(GameObjectPrefab gameObjectReference)
51+
{
52+
var instanceID = gameObjectReference.Source.GetInstanceID();
53+
if (!_pools.TryGetValue(instanceID, out var pool))
54+
{
55+
if (gameObjectReference.Source.scene.IsValid())
56+
throw new Exception($"Non Prefab not supported {gameObjectReference.Source.name}");
57+
pool = new GameObjectItemPool(gameObjectReference);
58+
pool.OnReturnAction += RemoveTrackingItem;
59+
pool.OnItemDestroyAction += RemoveTrackingItem;
60+
pool.OnPoolEmpty += OnPoolEmpty;
61+
this._pools.Add(instanceID, pool);
62+
}
63+
GameObject item = pool.RentSync();
64+
this._dicTrackingInstancePools.Add(item.GetInstanceID(), pool);
65+
return item;
66+
}
67+
4268
public void Return(GameObject gameObject)
4369
{
4470
if (!gameObject)

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling.Addressables/Foundation/Prefabs/AddressComponentPrefab{T}.cs

+15-13
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,25 @@
88
namespace ZBase.Foundation.Pooling.AddressableAssets
99
{
1010
[Serializable]
11-
public class AddressComponentPrefab<T>
12-
: AddressPrefab<T>
13-
where T : Component
11+
public class AddressComponentPrefab<T> : AddressPrefab<T> where T : Component
1412
{
15-
protected override async UniTask<T> Instantiate(
16-
string source
13+
protected override async UniTask<T> InstantiateAsync(
14+
string source
1715
, Transform parent
1816
, CancellationToken cancelToken = default
1917
)
2018
{
21-
AsyncOperationHandle<GameObject> handle;
22-
23-
if (parent)
24-
handle = Addressables.InstantiateAsync(source, parent);
25-
else
26-
handle = Addressables.InstantiateAsync(source);
27-
19+
AsyncOperationHandle<GameObject> handle =
20+
parent ? Addressables.InstantiateAsync(source, parent) : Addressables.InstantiateAsync(source);
2821
var gameObject = await handle.WithCancellation(cancelToken);
22+
return gameObject.GetComponent<T>();
23+
}
2924

25+
protected override T Instantiate(string source, Transform parent, CancellationToken cancelToken = default)
26+
{
27+
AsyncOperationHandle<GameObject> handle =
28+
parent ? Addressables.InstantiateAsync(source, parent) : Addressables.InstantiateAsync(source);
29+
var gameObject = handle.WaitForCompletion();
3030
return gameObject.GetComponent<T>();
3131
}
3232

@@ -35,5 +35,7 @@ public override void Release(T instance)
3535
if (instance)
3636
Addressables.ReleaseInstance(instance.gameObject);
3737
}
38+
39+
3840
}
39-
}
41+
}

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling.Addressables/Foundation/Prefabs/AddressGameObjectPrefab.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,19 @@ namespace ZBase.Foundation.Pooling.AddressableAssets
1010
[Serializable]
1111
public class AddressGameObjectPrefab : AddressPrefab<GameObject>
1212
{
13-
protected override async UniTask<GameObject> Instantiate(
13+
protected override async UniTask<GameObject> InstantiateAsync(
1414
string source, Transform parent, CancellationToken cancelToken = default)
1515
{
1616
var handle = parent ? Addressables.InstantiateAsync(source, parent) : Addressables.InstantiateAsync(source);
1717
return await handle.WithCancellation(cancelToken);
1818
}
1919

20+
protected override GameObject Instantiate(string source, Transform parent, CancellationToken cancelToken = default)
21+
{
22+
var handle = parent ? Addressables.InstantiateAsync(source, parent) : Addressables.InstantiateAsync(source);
23+
return handle.WaitForCompletion();
24+
}
25+
2026
public override void Release(GameObject instance)
2127
{
2228
if (instance)

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling.Addressables/Foundation/Prefabs/AssetRefComponentPrefab{T}.cs

+9-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace ZBase.Foundation.Pooling.AddressableAssets
1111
public class AssetRefComponentPrefab<T> : AssetRefPrefab<T, AssetReferenceGameObject>
1212
where T : Component
1313
{
14-
protected override async UniTask<T> Instantiate(AssetReferenceGameObject source, Transform parent,
14+
protected override async UniTask<T> InstantiateAsync(AssetReferenceGameObject source, Transform parent,
1515
CancellationToken cancelToken = default)
1616
{
1717
AsyncOperationHandle<GameObject> handle =
@@ -20,6 +20,14 @@ protected override async UniTask<T> Instantiate(AssetReferenceGameObject source,
2020
return gameObject.GetComponent<T>();
2121
}
2222

23+
protected override T Instantiate(AssetReferenceGameObject source, Transform parent, CancellationToken cancelToken = default)
24+
{
25+
AsyncOperationHandle<GameObject> handle =
26+
parent ? source.InstantiateAsync(parent, true) : source.InstantiateAsync();
27+
var gameObject = handle.WaitForCompletion();
28+
return gameObject.GetComponent<T>();
29+
}
30+
2331
public override void Release(T instance)
2432
{
2533
if (instance && Source != null)

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling.Addressables/Foundation/Prefabs/AssetRefGameObjectPrefab.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,21 @@ namespace ZBase.Foundation.Pooling.AddressableAssets
1010
[Serializable]
1111
public class AssetRefGameObjectPrefab : AssetRefPrefab<GameObject, AssetReferenceGameObject>
1212
{
13-
protected override async UniTask<GameObject> Instantiate(
13+
protected override async UniTask<GameObject> InstantiateAsync(
1414
AssetReferenceGameObject source, Transform parent, CancellationToken cancelToken = default)
1515
{
1616
AsyncOperationHandle<GameObject> handle =
1717
parent ? source.InstantiateAsync(parent, true) : source.InstantiateAsync();
1818
return await handle.WithCancellation(cancelToken);
1919
}
2020

21+
protected override GameObject Instantiate(AssetReferenceGameObject source, Transform parent, CancellationToken cancelToken = default)
22+
{
23+
AsyncOperationHandle<GameObject> handle =
24+
parent ? source.InstantiateAsync(parent, true) : source.InstantiateAsync();
25+
return handle.WaitForCompletion();
26+
}
27+
2128
public override void Release(GameObject instance)
2229
{
2330
if (instance && Source != null)

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling.Addressables/ScriptablePools/ScriptableAddressComponentSource{T}.cs

+16-12
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,36 @@
77

88
namespace Unity.Pooling.Scriptables.AddressableAssets
99
{
10-
public class ScriptableAddressComponentSource<T> : ScriptableAddressSource
11-
where T : Component
10+
public class ScriptableAddressComponentSource<T> : ScriptableAddressSource where T : Component
1211
{
13-
public override async UniTask<Object> Instantiate(Transform parent, CancellationToken cancelToken = default)
12+
public override async UniTask<Object> InstantiateAsync(Transform parent,
13+
CancellationToken cancelToken = default)
1414
{
1515
var source = Source;
1616

1717
if (string.IsNullOrEmpty(source))
1818
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.assetName);
19-
20-
AsyncOperationHandle<GameObject> handle;
21-
22-
if (parent)
23-
handle = Addressables.InstantiateAsync(source, parent, true);
24-
else
25-
handle = Addressables.InstantiateAsync(source);
26-
19+
AsyncOperationHandle<GameObject> handle = parent
20+
? Addressables.InstantiateAsync(source, parent, true)
21+
: Addressables.InstantiateAsync(source);
2722
var gameObject = await handle.WithCancellation(cancelToken);
2823

2924
return gameObject.GetComponent<T>();
3025
}
3126

27+
public override Object Instantiate(Transform parent)
28+
{
29+
var source = Source;
30+
if (string.IsNullOrEmpty(source))
31+
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.assetName);
32+
var gameObject = Addressables.InstantiateAsync(source, parent, true).WaitForCompletion();
33+
return gameObject.GetComponent<T>();
34+
}
35+
3236
public override void Release(Object instance)
3337
{
3438
if (instance is T component)
3539
Addressables.ReleaseInstance(component.gameObject);
3640
}
3741
}
38-
}
42+
}

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling.Addressables/ScriptablePools/ScriptableAddressGameObjectSource.cs

+16-10
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,33 @@ namespace Unity.Pooling.Scriptables.AddressableAssets
1414
)]
1515
public class ScriptableAddressGameObjectSource : ScriptableAddressSource
1616
{
17-
public override async UniTask<Object> Instantiate(Transform parent, CancellationToken cancelToken = default)
17+
public override async UniTask<Object> InstantiateAsync(Transform parent,
18+
CancellationToken cancelToken = default)
1819
{
1920
var source = Source;
2021

2122
if (string.IsNullOrEmpty(source))
2223
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.assetName);
23-
24-
AsyncOperationHandle<GameObject> handle;
25-
26-
if (parent)
27-
handle = Addressables.InstantiateAsync(source, parent, true);
28-
else
29-
handle = Addressables.InstantiateAsync(source);
30-
24+
AsyncOperationHandle<GameObject> handle = parent
25+
? Addressables.InstantiateAsync(source, parent, true)
26+
: Addressables.InstantiateAsync(source);
3127
return await handle.WithCancellation(cancelToken);
3228
}
3329

30+
public override Object Instantiate(Transform parent)
31+
{
32+
var source = Source;
33+
if (string.IsNullOrEmpty(source))
34+
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.assetName);
35+
return parent
36+
? Addressables.InstantiateAsync(source, parent, true).WaitForCompletion()
37+
: Addressables.InstantiateAsync(source).WaitForCompletion();
38+
}
39+
3440
public override void Release(Object instance)
3541
{
3642
if (instance is GameObject gameObject)
3743
Addressables.ReleaseInstance(gameObject);
3844
}
3945
}
40-
}
46+
}

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling.Addressables/ScriptablePools/ScriptableAssetRefComponentSource{T}.cs

+15-10
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,30 @@ public class ScriptableAssetRefComponentSource<T>
1111
: ScriptableAssetRefSource<AssetReferenceGameObject>
1212
where T : Component
1313
{
14-
public override async UniTask<Object> Instantiate(Transform parent, CancellationToken cancelToken = default)
14+
public override async UniTask<Object> InstantiateAsync(Transform parent, CancellationToken cancelToken = default)
1515
{
1616
var source = Source;
1717

1818
if (source == null)
1919
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
20-
21-
AsyncOperationHandle<GameObject> handle;
22-
23-
if (parent)
24-
handle = source.InstantiateAsync(parent);
25-
else
26-
handle = source.InstantiateAsync();
27-
20+
AsyncOperationHandle<GameObject> handle = default;
21+
if (source != null)
22+
handle = parent ? source.InstantiateAsync(parent) : source.InstantiateAsync();
2823
var gameObject = await handle.WithCancellation(cancelToken);
29-
3024
return gameObject.GetComponent<T>();
3125
}
3226

27+
public override Object Instantiate(Transform parent)
28+
{
29+
var source = Source;
30+
if (source == null)
31+
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
32+
var gameObject = parent
33+
? source?.InstantiateAsync(parent).WaitForCompletion()
34+
: source?.InstantiateAsync().WaitForCompletion();
35+
return gameObject != null ? gameObject.GetComponent<T>() : null;
36+
}
37+
3338
public override void Release(Object instance)
3439
{
3540
if (instance is T component && Source != null)

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling.Addressables/ScriptablePools/ScriptableAssetRefGameObjectSource.cs

+14-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ namespace Unity.Pooling.Scriptables.AddressableAssets
1515
public class ScriptableAssetRefGameObjectSource
1616
: ScriptableAssetRefSource<AssetReferenceGameObject>
1717
{
18-
public override async UniTask<Object> Instantiate(Transform parent, CancellationToken cancelToken = default)
18+
public override async UniTask<Object> InstantiateAsync(Transform parent,
19+
CancellationToken cancelToken = default)
1920
{
2021
var source = Source;
2122

@@ -32,10 +33,21 @@ public override async UniTask<Object> Instantiate(Transform parent, Cancellation
3233
return await handle.WithCancellation(cancelToken);
3334
}
3435

36+
public override Object Instantiate(Transform parent)
37+
{
38+
var source = Source;
39+
40+
if (source == null)
41+
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
42+
return parent
43+
? source?.InstantiateAsync(parent, true).WaitForCompletion()
44+
: source?.InstantiateAsync().WaitForCompletion();
45+
}
46+
3547
public override void Release(Object instance)
3648
{
3749
if (instance is GameObject gameObject && Source != null)
3850
Source.ReleaseInstance(gameObject);
3951
}
4052
}
41-
}
53+
}

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling/Foundation/Common/Interfaces/IAsyncInstantiable{T}.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ namespace ZBase.Foundation.Pooling
55
{
66
public interface IAsyncInstantiable<T> : IInstantiable<UniTask<T>>
77
{
8-
UniTask<T> Instantiate(CancellationToken cancelToken);
8+
UniTask<T> InstantiateAsync(CancellationToken cancelToken);
99
}
1010
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
namespace ZBase.Foundation.Pooling
22
{
3-
public interface IInstantiable<T>
3+
public interface IInstantiable<out T>
44
{
5-
T Instantiate();
5+
T InstantiateAsync();
66
}
77
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+

2+
namespace ZBase.Foundation.Pooling
3+
{
4+
public interface ISyncInstantiable<out T>
5+
{
6+
T Instantiate();
7+
}
8+
}

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling/Foundation/Common/Interfaces/ISyncInstantiable.cs.meta

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Packages/ZBase.Foundation.Pooling/ZBase.Foundation.Pooling/Foundation/Instantiators/ActivatorInstantiator{T}.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public struct ActivatorInstantiator<T> : IInstantiable<T>
1212
private static readonly Type s_type = typeof(T);
1313

1414
[MethodImpl(MethodImplOptions.AggressiveInlining)]
15-
public T Instantiate()
15+
public T InstantiateAsync()
1616
=> (T)Activator.CreateInstance(s_type);
1717
}
1818
}

0 commit comments

Comments
 (0)