Posts Getcomponent Attributes
Post
Cancel

Getcomponent Attributes

Note


  • 메소드로만 사용하던 GetComponent(), Find() 기능들을 필드/프로퍼티 애트리뷰트로 간편하게 사용할 수 있다.

  • 리플렉션과 커스텀 애트리뷰트를 활용하여 제작하였다.
  • Component를 상속받는 타입의 필드/프로퍼티에 사용할 수 있다.
  • 대상 멤버의 접근지정자에 관계 없이 모두 동작한다.
  • 본 애트리뷰트들을 통한 컴포넌트 할당 기능은 Awake()OnEnable() 이후, Start() 이전에 동작한다.
  • 씬 이동, 재시작 시에도 올바르게 동작한다.
  • Find() 종류의 애트리뷰트들은 게임 오브젝트의 자식 범위가 아닌, 씬 내의 모든 게임오브젝트를 대상으로 동작한다.


How to Use


  • [Window] - [Package Manager] - [좌측 상단 +] - [Add package from git URL] -
    https://github.com/rito15/Unity_GetComponent-Attributes.git - [Add]

  • 사용하려는 스크립트 상단에 using Rito.Attributes;를 추가한다.
  • 대상 필드 또는 프로퍼티의 앞에 [GetComponent] 종류의 애트리뷰트를 추가한다.
  • [2020-04-13 업데이트] 컴포넌트 스크립트 내에서 GetComponentController.Run(this);를 호출하여, 원하는 타이밍에 자신의 컴포넌트 내 멤버들을 대상으로 실행할 수 있다.


Catalog
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* ******************************************************************************** *
 *                                    참고사항                                       *
 * ******************************************************************************** */

/* 공통 파라미터 AllowOverwrite : 지정하지 않으면 기본 값은 false
    false : 해당 필드/프로퍼티가 null인 경우에만 컴포넌트 초기화 동작을 수행한다.
    true  : 해당 필드/프로퍼티가 null이 아닌 경우에도 컴포넌트 초기화를 수행하여, 덮어쓴다. */
[GetComponent(false)] public Transform _whenAllowOverwriteIsFalse;
[GetComponent(true)]  public Transform _whenAllowOverwriteIsTrue;


/* Private, Protected, Public 등 모든 접근지정자에 대해 정상적으로 동작한다.
   하이라키에서 확인하고 싶은 경우, SerializeField를 함께 사용한다. */
[GetComponent]                 private Transform _privateMember1;
[SerializeField, GetComponent] private Transform _privateMember2;


/* 프로퍼티에 대해서도 동일하게 동작하지만,
   반드시 Getter와 Setter가 모두 존재해야 한다. */
[GetComponent] public Collider PropertyMember { get => _col; private set => _col = value; }
public Collider _col;



/* ******************************************************************************** *
 *                                     기능들                                        *
 * ******************************************************************************** */

/* 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다. */
[GetComponent]                public CharacterMovement_Test _movement;

/* 자신 및 자식 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다. */
[GetComponentInChildren]      public CharacterInventory_Test _inventory;

/* 지정한 이름의 자식 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다.
   해당 이름의 자식 게임 오브젝트가 존재하지 않을 경우, 아무런 동작을 하지 않는다. */
[GetComponentInChild("Mesh")] public Transform _meshTransform;

/* 자신 및 부모 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다. */
[GetComponentInParent]        public PlayerManager_Test _playerManager;


/* 게임 오브젝트 내에서 해당 타입의 컴포넌트들을 찾아 배열 형태로 가져온다. */
[GetComponents]               public Component[] _components;

/* 게임 오브젝트 내에서 해당 타입의 컴포넌트들을 찾아 리스트 형태로 가져온다. */
[GetComponents]               public List<Component> _componentList;

/* 자신 및 자식 게임 오브젝트 내에서 해당 타입의 컴포넌트들을 찾아 배열 형태로 가져온다. */
[GetComponentsInChildren]     public CharacterWeapon_Test[] _childWeapons;

/* 자신 및 자식 게임 오브젝트 내에서 해당 타입의 컴포넌트들을 찾아 리스트 형태로 가져온다. */
[GetComponentsInChildren]     public List<CharacterWeapon_Test> _childWeaponList;

/* 자신 및 부모 게임 오브젝트 내에서 해당 타입의 컴포넌트들을 찾아 배열 형태로 가져온다. */
[GetComponentsInParent]       public Component[] _parentComponents;

/* 자신 및 부모 게임 오브젝트 내에서 해당 타입의 컴포넌트들을 찾아 리스트 형태로 가져온다. */
[GetComponentsInParent]       public List<Component> _parentComponentList;


/* 자신을 제외한 자식 게임 오브젝트들에서 해당 타입의 컴포넌트를 찾아 가져온다. */
[GetComponentInChildrenOnly]  public Collider _childOnlyCollider;

/* 자신을 제외한 부모 게임 오브젝트들에서 해당 타입의 컴포넌트를 찾아 가져온다. */
[GetComponentInParentOnly]    public Transform _parentOnlyTransform;

/* 자신을 제외한 자식 게임 오브젝트들에서 해당 타입의 컴포넌트를 모두 찾아 배열 형태로 가져온다. */
[GetComponentsInChildrenOnly] public Collider[] _childOnlyColliders;

/* 자신을 제외한 자식 게임 오브젝트들에서 해당 타입의 컴포넌트를 모두 찾아 리스트 형태로 가져온다. */
[GetComponentsInChildrenOnly] public List<Collider> _childOnlyColliderList;

/* 자신을 제외한 부모 게임 오브젝트들에서 해당 타입의 컴포넌트를 모두 찾아 배열 형태로 가져온다. */
[GetComponentsInParentOnly]   public Component[] _parentOnlyComponents;

/* 자신을 제외한 부모 게임 오브젝트들에서 해당 타입의 컴포넌트를 모두 찾아 리스트 형태로 가져온다. */
[GetComponentsInParentOnly]   public List<Component> _parentOnlyComponentList;


/* 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다.
   만약 해당 컴포넌트가 존재하지 않을 경우, 컴포넌트를 새롭게 생성한 후 가져온다. */
[GetOrAddComponent]                    public Rigidbody _rigidbody;

/* 지정한 이름의 자식 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다.
   만약 해당 컴포넌트가 존재하지 않을 경우, 자식 게임 오브젝트에 컴포넌트를 새롭게 생성한 후 가져온다.
   만약 해당 이름의 자식 게임오브젝트가 존재하지 않을 경우, 지정한 이름으로 자식 게임오브젝트를 생성한다. */
[GetOrAddComponentInChild("Pet")]     public PetController_Test _pet;

/* 자신 및 자식 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다.
   만약 해당 컴포넌트가 존재하지 않을 경우, 자식 게임 오브젝트에 컴포넌트를 새롭게 생성한 후 가져온다.
   만약 해당 이름의 자식 게임오브젝트가 존재하지 않을 경우, 지정한 이름으로 자식 게임오브젝트를 생성한다. */
[GetOrAddComponentInChildren("Armor")] public CharacterArmor_Test _armor;

/* 자신 및 부모 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다.
   만약 해당 컴포넌트가 존재하지 않을 경우, 해당 부모 게임 오브젝트에 컴포넌트를 새롭게 생성한 후 가져온다.
   만약 해당 이름의 부모 게임오브젝트가 존재하지 않을 경우, 아무런 동작을 하지 않는다. */
[GetOrAddComponentInParent("Player")]  public PlayerData_Test _playerData;


/* 현재 씬 내에서 해당 타입의 컴포넌트를 찾아 가져온다. */
[Find]                    public GameManager_Test _gameManager;

/* 현재 씬 내에서 해당 타입의 컴포넌트를 찾아 가져온다.
   만약 해당 타입의 컴포넌트가 하나도 존재하지 않을 경우, 
   지정한 이름으로 게임 오브젝트를 생성한 뒤 컴포넌트를 추가한다. */
[FindOrAdd("UI Manager")] public UIManager_Test _uiManager;

/* 현재 씬에 존재하는 지정한 이름의 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다.
   만약 해당 이름의 게임 오브젝트가 존재하지 않거나 해당 컴포넌트가 존재하지 않는 경우,
   아무런 동작을 하지 않는다. */
[FindByName("Spawner")]   public Spawner_Test _spawner;

/* 현재 씬에 존재하는 지정한 이름의 게임 오브젝트 내에서 해당 타입의 컴포넌트를 찾아 가져온다.
   만약 해당 이름의 게임 오브젝트가 존재하지 않거나 해당 컴포넌트가 존재하지 않는 경우,
   해당 이름으로 새로운 게임 오브젝트를 생성한 뒤, 컴포넌트를 추가한다. */
[FindByNameOrAdd("Pool")] public ObjectPool_Test _objPool;

/* 현재 씬 내에서 해당 타입의 컴포넌트를 모두 찾아 배열 형태로 가져온다. */
[FindAll] public Transform[] _allTransforms;

/* 현재 씬 내에서 해당 타입의 컴포넌트를 모두 찾아 리스트 형태로 가져온다. */
[FindAll] public List<Collider> _allColliderList;


/* ******************************************************************************** *
 *                                잘못된 사용 예시                                   *
 * ******************************************************************************** */

/* 애트리뷰트를 올바르지 않게 사용한 경우, 콘솔 창에 경고 메시지와 대상 멤버 정보를 표시한다. */


/* Component를 상속 받는 타입이 아닌 멤버에 사용한 경우 */
[GetComponent] public GameObject _gameObject_wrong;

/* 엘리먼트 타입 대상 애트리뷰트를 배열, 리스트 타입 멤버에 사용한 경우 */
[Find] public GameManager_Test[] _manager_wrong;

/* 배열, 리스트 대상 애트리뷰트를 엘리먼트 타입 멤버에 사용한 경우 */
[FindAll] public Spawner_Test _spawner_wrong;

image


Cautions


  • Component 클래스를 상속하는 타입의 멤버들에 대해서만 동작한다.
  • [GetComponent] 종류의 애트리뷰트는 ArrayList, Dictionary 등 배열 또는 제네릭 타입의 멤버에 대해 동작하지 않는다.
  • [GetComponents] 종류의 애트리뷰트는 요소의 타입이 Component를 상속하는 경우의 Array 또는 List 타입 멤버에 대해 동작한다.
  • 비활성화 상태인 컴포넌트 내에서도 애트리뷰트가 동작하며, 마찬가지로 비활성화 상태인 컴포넌트도 찾아 가져올 수 있다.


Preview


GetComAttr


Download(UPM)


  • https://github.com/rito15/Unity_GetComponent-Attributes.git


Source Code


This post is licensed under CC BY 4.0 by the author.