๐ฏ Unity์ TryGetComponent ์ ๋๋ก ์๊ธฐ
Unity ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์ค๋ธ์ ํธ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์์ผ ํ ์ผ์ด ์์ฃผ ์์ต๋๋ค. ์ด๋ ํํ ์ฌ์ฉํ๋ ๋ฐฉ์์ด GetComponent<T>()์ ๋๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ์ปดํฌ๋ํธ๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ NullReferenceException์ ๋ฐ์์ํฌ ์ ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
์ด๋ฐ ์ํ์ ํผํ๊ณ ์ Unity์์๋ ๋ณด๋ค ์์ ํ ๋ฐฉ์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ TryGetComponent<T>() ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ TryGetComponent์ ๊ธฐ๋ณธ ๊ฐ๋ , ์ฌ์ฉ๋ฒ, ์ค์ ํ์ฉ ์์, ๊ทธ๋ฆฌ๊ณ GetComponent์์ ์ฐจ์ด์ ๊น์ง ์์ธํ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
๐ TryGetComponent๋?
TryGetComponent<T>(out T component)๋ ํน์ ์ปดํฌ๋ํธ๊ฐ ํ์ฌ GameObject์ ์กด์ฌํ ๊ฒฝ์ฐ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์์ ํ๊ฒ ๊ฐ์ ธ์ค๋ ๋ฉ์๋์ ๋๋ค. ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ false๋ฅผ ๋ฐํํ๊ณ , ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
โ ๋ฌธ๋ฒ
public bool TryGetComponent<T>(out T component) where T : Component;
- T : ๊ฐ์ ธ์ค๋ ค๋ ์ปดํฌ๋ํธ ํ์ (์: Rigidbody, Collider, Animator, ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ ๋ฑ)
- component : ์ปดํฌ๋ํธ๋ฅผ ๋ด์ out ๋งค๊ฐ๋ณ์
- ๋ฆฌํด๊ฐ : ํด๋น ์ปดํฌ๋ํธ๊ฐ ์กด์ฌํ๋ฉด true, ์์ผ๋ฉด false
๐ ์ TryGetComponent๋ฅผ ์จ์ผ ํ๋์?
๊ธฐ์กด์ GetComponent๋ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์์ต๋๋ค:
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(Vector3.up * 10f); // Rigidbody๊ฐ ์์ผ๋ฉด NullReferenceException!
์ด ์ฝ๋์์ Rigidbody๊ฐ ๋ถ์ด์์ง ์๋ค๋ฉด NullReferenceException์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์กฐ๊ฑด๋ฌธ์ ๋ฃ์ด์ผ ํ์ฃ :
Rigidbody rb = GetComponent<Rigidbody>();
if (rb != null)
{
rb.AddForce(Vector3.up * 10f);
}
ํ์ง๋ง TryGetComponent๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ณ ์์ ํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค:
if (TryGetComponent<Rigidbody>(out Rigidbody rb))
{
rb.AddForce(Vector3.up * 10f);
}
- ์ฅ์ : ์์ธ ์ฒ๋ฆฌ ํ์ ์์
- ์ฑ๋ฅ: ๋ด๋ถ์ ์ผ๋ก GetComponent๋ณด๋ค ์ฑ๋ฅ์ด ์ฝ๊ฐ ๋ ๋์ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ (Unity ๊ณต์ ๋ฌธ์ ๊ธฐ์ค)
- ๊ฐ๋ ์ฑ: ์กฐ๊ฑด๋ฌธ ์์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง
๐ก ์ค์ ์์
๐ฏ ์์ 1: ์ด์์ด ์ ์๊ฒ ๋ถ๋ชํ์ ๋ ๋ฐ๋ฏธ์ง ์ฃผ๊ธฐ
private void OnTriggerEnter(Collider other)
{
if (other.TryGetComponent<Enemy>(out Enemy enemy))
{
enemy.TakeDamage(10f);
Destroy(gameObject); // ์ด์ ์ญ์
}
}
์ด์์ด ๋ถ๋ชํ ์ค๋ธ์ ํธ๊ฐ Enemy ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ฐ๋ฏธ์ง๋ฅผ ์ฃผ๊ณ , ์ด์์ ํ๊ดดํฉ๋๋ค. ๋ง์ฝ ์ ์ด ์๋ ์ค๋ธ์ ํธ๋ผ๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
๐ฏ ์์ 2: ์ธํฐ๋์ ๊ฐ๋ฅํ ์ค๋ธ์ ํธ ์ฐพ๊ธฐ
private void Interact(GameObject target)
{
if (target.TryGetComponent<IInteractable>(out IInteractable interactable))
{
interactable.Interact();
}
}
IInteractable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ค๋ธ์ ํธ์๋ง ์ํธ์์ฉํ๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๐ GetComponent vs TryGetComponent
ํญ๋ชฉ | GetComponent<T>() | TryGetComponent<T>(out T) |
๋ฐํ๊ฐ | ์ปดํฌ๋ํธ ๊ฐ์ฒด ๋๋ null | true ๋๋ false |
์์ธ ์ฒ๋ฆฌ | null ์ฒดํฌ ํ์ | ์์ธ ์์ |
์ฑ๋ฅ | ์ฝ๊ฐ ๋๋ฆด ์ ์์ | ์ฝ๊ฐ ๋ ํจ์จ์ |
์ฝ๋ ๊ฐ๋ ์ฑ | ๊ธธ์ด์ง ์ ์์ | ๊ฐ๊ฒฐํ๊ณ ์์ ํจ |
๐ง ๋ง๋ฌด๋ฆฌํ๋ฉฐ
TryGetComponent๋ Unity ๊ฐ๋ฐ์์ ๋ณด๋ค ์์ ํ๊ณ ๊น๋ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ํนํ ์ถฉ๋ ์ฒ๋ฆฌ, ์ํธ์์ฉ, ์กฐ๊ฑด๋ถ ๋ก์ง ๋ฑ์์ ๋ ์์ธ๋ฅผ ๋ฐฉ์งํ๊ณ ์ฝ๋๋ฅผ ๋จ์ํ๊ฒ ๋ง๋ค์ด ์ค๋๋ค.
์์ผ๋ก GetComponent ๋์ TryGetComponent๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ ์ต๊ด์ ๋ค์ฌ๋ณด์ธ์. ์ค์๋ ์ค๊ณ , ์ ์ง๋ณด์๋ ์ฌ์์ง ๊ฒ์ ๋๋ค!
'Unity' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Unity - 3D Survival Game(์ธ๋ฒคํ ๋ฆฌ ๊ธฐ๋ฅ) (6) | 2025.08.08 |
---|---|
Unity - Inventory ์ธ๋ฒคํ ๋ฆฌ ์์คํ ๊ตฌํ ์ ๋ฆฌ (3) | 2025.08.07 |
Unity - Input System - InputAction (6) | 2025.08.06 |
ํ๋ก์ ํธ ์๊ฐ - ใํ๋์ธ๊ณ ์ตํ์ ๊ถ์ใ (3) | 2025.08.05 |
Unity - Unity์ ๋ฉ์ธ ์นด๋ฉ๋ผ(Main Camera) & Projection (3) | 2025.08.04 |