-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUniqueComponent.cs
84 lines (72 loc) · 2.55 KB
/
UniqueComponent.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
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Assertions;
namespace dkstlzu.Utility
{
[DefaultExecutionOrder(-100)]
public class UniqueComponent : MonoBehaviour
{
public enum UniqueComponentMethod
{
UniqueType,
UniqueID,
}
public UniqueComponentMethod Uniqueness;
public Component TargetComponent;
public string HashID;
[Tooltip("Replace old one with new one if duplicate")]
public bool ReplacePreviousOne = false;
static Dictionary<string, Component> _componentsDict = new Dictionary<string, Component>();
void Awake()
{
if (!Add(TargetComponent, Uniqueness, HashID, ReplacePreviousOne))
{
Destroy(this);
}
}
public static bool Add(Component component, UniqueComponentMethod method, string hashID, bool replacePrevious = false)
{
switch (method)
{
default:
case UniqueComponentMethod.UniqueType:
return AddUniqueType(component, replacePrevious);
case UniqueComponentMethod.UniqueID:
return AddUniqueID(component, hashID, replacePrevious);
}
}
public static bool AddUniqueType(Component component, bool replacePrevious = false)
{
return AddUniqueID(component, component.GetType().FullName, replacePrevious);
}
public static bool AddUniqueID(Component component, string hashID, bool replacePrevious = false)
{
Assert.IsNotNull(hashID);
Assert.AreNotEqual(string.Empty, hashID);
if (_componentsDict.TryGetValue(hashID, out Component previous))
{
if (replacePrevious)
{
DestroyTarget(previous);
_componentsDict[hashID] = component;
}
else
{
DestroyTarget(component);
}
return replacePrevious;
}
_componentsDict.Add(hashID, component);
return true;
}
public static void DestroyTarget(Component component)
{
if (component != null)
{
if (component is Transform || component is RectTransform) DestroyImmediate(component.gameObject);
else DestroyImmediate(component);
}
}
}
}