๐Ÿš€ Unity ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ์˜ค๋ธŒ์ ํŠธ ํƒ์ƒ‰

์ •๊ด‘ํ›ˆ(Unity_9๊ธฐ)ยท2026๋…„ 4์›” 10์ผ

TIL (Today I Learned)

๋ชฉ๋ก ๋ณด๊ธฐ
110/110

1. .transform๊ณผ ๊ธฐ๋ณธ ๋ฐ˜ํ™˜๊ฐ’ ํ™œ์šฉ

์œ ๋‹ˆํ‹ฐ์—์„œ transform.Find๋Š” Transform ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ™œ์šฉํ•ด ๋ถˆํ•„์š”ํ•œ GetComponent ํ˜ธ์ถœ์„ ์ค„์ด๊ณ  ์ฐธ์กฐ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

private void Reset()
{
    // transform.Find๋Š” ์ด๋ฏธ Transform์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋ฐ”๋กœ ํ• ๋‹น
    _firePoint = transform.Find(BowSpriteString);

    if (_firePoint != null)
    {
        // ์ฐพ์•„์˜จ Transform์—์„œ ํŒŒ์ƒ ์ •๋ณด(GameObject, Animator)๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ํšจ์œจ์ 
        _bow = _firePoint.gameObject;
        _bowAnim = _firePoint.GetComponent<Animator>();
    }
}

2. ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ณ€์ˆ˜ ์ •๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (Stack vs Heap)

๋‹จ์ˆœ ๊ณ„์‚ฐ์šฉ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ํด๋ž˜์Šค ๋ณ€์ˆ˜(์ „์—ญ)๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š”
๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ์‹ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ์ง€์—ญ ๋ณ€์ˆ˜ (Stack ํ• ๋‹น): ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ ์ฆ‰์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
    ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ณ  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC) ๋ถ€ํ•˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ๋ณ€์ˆ˜ (Heap ํ• ๋‹น): ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํŒŒ๊ดด๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋ฉฐ,
    GC๊ฐ€ ์ด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‚จ์šฉ ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค.
  • ๊ฒฐ๋ก : ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ์—์„œ ๊ณต์œ ํ•  '์ƒํƒœ'๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด,
    ๋ฐ˜๋“œ์‹œ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์„ ์–ธํ•˜์—ฌ Stack ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. Struct(๊ตฌ์กฐ์ฒด)์˜ ๊นŠ์ด ์žˆ๋Š” ํ™œ์šฉ

๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์—๋Š” class ๋Œ€์‹  struct๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ตฌ์กฐ์ฒด๊ฐ€ ์„ฑ๋Šฅ์— ์œ ๋ฆฌํ• ๊นŒ์š”?

  • ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์˜ ํšจ์œจ์„ฑ: ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ ๋ณ€์ˆ˜์— ๋ฐ์ดํ„ฐ์˜ '์ฃผ์†Œ๊ฐ’'์ด ์ €์žฅ๋˜์ง€๋งŒ,
    ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’(Value) ์ž์ฒด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ) ๋ถ€ํ•˜ ๊ฐ์†Œ: ๊ตฌ์กฐ์ฒด๋Š” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ
    ์ž๋™์œผ๋กœ ๋‚ ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์—, ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฒญ์†Œํ•˜๋Š” GC์˜ ์ผ๊ฐ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ : ๋„ˆ๋ฌด ํฐ ๋ฐ์ดํ„ฐ(์•ฝ 16๋ฐ”์ดํŠธ ์ด์ƒ)๋ฅผ ๊ตฌ์กฐ์ฒด์— ๋„ฃ์œผ๋ฉด
    ๋ณต์‚ฌ ๊ณผ์ •์—์„œ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ ์Šคํƒฏ ์ˆ˜์น˜, ์ขŒํ‘œ, ์Šคํฐ ์ •๋ณด์™€ ๊ฐ™์€ ์ž‘๊ณ  ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ๋ญ‰์น˜์— ์ตœ์ ์ž…๋‹ˆ๋‹ค.
[System.Serializable]
public struct EnemySpawnData // ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์€ struct๊ฐ€ ๋ฒ ์ŠคํŠธ!
{
    public string enemyName;
    public int spawnCount;
    public float spawnInterval;
    public GameObject prefab;
}

"๊ธฐ๋Šฅ(๋ณต์žกํ•œ ๋กœ์ง)์ด ์•„๋‹ˆ๋ผ ์˜ค์ง ๋ฐ์ดํ„ฐ(๋ณ€์ˆ˜ ๋ญ‰์น˜)๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ๋ชฉ์ ์ด๋ผ๋ฉด
class ๋Œ€์‹  struct๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์„ฑ๋Šฅ์ƒ ํ›จ์”ฌ ์ด๋“์ด๋‹ค"


4. ์ƒํ™ฉ๋ณ„ ์˜ค๋ธŒ์ ํŠธ ํƒ์ƒ‰ ํ•จ์ˆ˜: Find, Type, Tag

์ƒํ™ฉ์— ๋งž๋Š” ํƒ์ƒ‰ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ฒซ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ํƒ์ƒ‰ ๋ฒ”์œ„ํŠน์ง• ๋ฐ ๊ถŒ์žฅ ์‚ฌ์šฉ์ฒ˜
GameObject.Find์”ฌ ์ „์ฒด์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰. ๊ฐ€์žฅ ๋А๋ฆผ. ์”ฌ์— ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์ง. (์‚ฌ์šฉ ์ง€์–‘)
transform.Find์ž์‹ ์˜ค๋ธŒ์ ํŠธ๊ณ„์ธต ๊ตฌ์กฐ ๋‚ด ์ž์‹ ๊ฒ€์ƒ‰. ๋ฒ”์œ„๊ฐ€ ์ข์•„ ๋น„๊ต์  ๋น ๋ฆ„. Reset()์—์„œ ์ถ”์ฒœ.
FindAnyObjectByType<T>์”ฌ ์ „์ฒดํƒ€์ž…(์Šคํฌ๋ฆฝํŠธ)์œผ๋กœ ๊ฒ€์ƒ‰. ์ด๋ฆ„์ด ๊ฐ€๋ณ€์ ์ผ ๋•Œ ์œ ์šฉํ•˜๋ฉฐ GameObject.Find๋ณด๋‹ค ์•ˆ์ •์ ์ž„.
GameObject.FindWithTagํƒœ๊ทธ ์ƒ‰์ธ๊ฐ€์žฅ ๋น ๋ฅธ ์ „์ฒด ๊ฒ€์ƒ‰. ๋ฏธ๋ฆฌ ์ธ๋ฑ์‹ฑ๋œ ํƒœ๊ทธ๋ฅผ ํ™œ์šฉํ•˜๋ฏ€๋กœ 'Player'๋‚˜ 'Enemy' ๊ทธ๋ฃน์„ ์ฐพ์„ ๋•Œ ์ตœ์ .

๐Ÿ’ก ์ตœ์ข… ๊ฒฐ๋ก : ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๊ฐ€๊ธ‰์  Reset() ๋‹จ๊ณ„์—์„œ transform.Find๋‚˜ ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์ฐธ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ๋งˆ์น˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.


0๊ฐœ์˜ ๋Œ“๊ธ€