-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBasicPool.cs
98 lines (84 loc) · 2.54 KB
/
BasicPool.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Fusion
{
internal interface IPool
{
string Name { get; }
int Count { get; }
PoolObjectHolder Get();
void Release(PoolObject toRelease);
void OnDestroy();
void Update();
PoolPreset Preset { get; }
PoolObject ForceSpawm();
void ForceRelease();
}
internal class BasicPool : IPool
{
internal static ObjectPool<PoolObjectHolder> HolderPool = new ObjectPool<PoolObjectHolder>(holder=>holder.OnGet(), holder => holder.OnRelease());
private Stack<PoolObject> m_CachedObjects = new Stack<PoolObject>();
private PoolObject m_Original = null;
private PoolPreset m_Preset = null;
internal BasicPool(PoolObject original, PoolPreset preset, string name)
{
Debug.Assert(original != null);
Name = name;
m_Original = original;
m_Preset = preset;
original.Pool = this;
}
public int Count
{
get { return m_CachedObjects.Count; }
}
public PoolPreset Preset
{
get
{
return m_Preset;
}
}
public string Name { get; private set; }
public virtual PoolObjectHolder Get()
{
var holder = HolderPool.Get();
PoolObject target = null;
if (m_CachedObjects.Count > 0)
{
target = m_CachedObjects.Pop();
target.Reset();
target.Pool = this;
}
else
target = ForceSpawm();
target.Holder = holder;
return holder;
}
public void Release(PoolObject toRelease)
{
if (toRelease != null)
m_CachedObjects.Push(toRelease);
}
public void OnDestroy()
{
while (m_CachedObjects.Count > 0)
m_CachedObjects.Pop().gameObject.SafeDestroySelf();
}
public void Update()
{
}
public PoolObject ForceSpawm()
{
var poolObject = GameObject.Instantiate(m_Original.gameObject, PoolManager.Root).GetComponent<PoolObject>();
poolObject.Pool = this;
return poolObject;
}
public void ForceRelease()
{
if (m_CachedObjects.Count > 0)
m_CachedObjects.Pop().gameObject.SafeDestroySelf();
}
}
}