๐ŸŽฎ Unity6 ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ CLASS

VIN'Spellsยท2025๋…„ 6์›” 29์ผ

์œ ๋‹ˆํ‹ฐ6

๋ชฉ๋ก ๋ณด๊ธฐ
2/12
post-thumbnail

๐Ÿ“Œ ๋ณธ ํฌ์ŠคํŒ…์€ Unity 6 ๊ณต์‹ ๋งค๋‰ด์–ผ์˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Unity์˜ GameObject ํด๋ž˜์Šค๋Š” ์”ฌ(Scene) ์•ˆ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
GameObject๋Š” Unity ์”ฌ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„๋กœ, GameObject๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๊ณ  ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋‹ด๋Š” ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ๐Ÿ”ฎScene ์ƒํƒœ์†์„ฑ(status properties)
  • ๐Ÿ”ฎ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€์™€ ์‚ญ์ œ
  • ๐Ÿ”ฎ์ปดํฌ๋„ŒํŠธ ์ ‘๊ทผํ•˜๊ธฐ
  • ๐Ÿ”ฎ๋‹ค๋ฅธ GameObject์˜ ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•˜๊ธฐ
  • ๐Ÿ”ฎSend message์™€ Broadcast message
  • ๐Ÿ”ฎ์ด๋ฆ„์ด๋‚˜ ํƒœ๊ทธ๋กœ GameObject ์ฐพ๊ธฐ
  • ๐Ÿ”ฎGameObject ์ƒ์„ฑ ๋ฐ ์ œ๊ฑฐ
  • ๐Ÿ”ฎ๊ธฐ๋ณธ ํ˜•์ƒ ์˜ค๋ธŒ์ ํŠธ(Primitives)

๐Ÿ”ฎScene ์ƒํƒœ์†์„ฑ(status properties)

๋ชจ๋“  GameObject๋Š” ์”ฌ ๋‚ด์—์„œ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ปจํŠธ๋กค ์š”์†Œ๋“ค์„ ์ธ์ŠคํŽ™ํ„ฐ(Inspector) ์ƒ๋‹จ์— ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์š”์†Œ๋“ค์€ GameObject์˜ ์Šคํฌ๋ฆฝํŠธ API๋ฅผ ํ†ตํ•ด์„œ๋„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ๋ณธ ์ผ๋ฐ˜์ ์ธ GameObject ์˜ˆ์‹œ(์ด ๊ฒฝ์šฐ Directional Light).
๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์ด ์”ฌ ์ƒํƒœ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

Active ์ƒํƒœ


GameObject๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”(active, ์‚ฌ์ง„์— ๋‚˜์™€์žˆ๋Š” ๋Œ€๋กœ ์ฒดํฌ ํ‘œ์‹œ๋ฉด ํ™œ์„ฑํ™”) ์ƒํƒœ์ด์ง€๋งŒ, ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋น„ํ™œ์„ฑํ™”๋˜๋ฉด ํ•ด๋‹น GameObject์— ๋ถ€์ฐฉ๋œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊บผ์ง€๊ฒŒ ๋ฉ๊ณ 
์ด ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ณ , Update๋‚˜ FixedUpdate ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ฝœ๋ฐฑ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” GameObject.SetActive ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ GameObject์˜ ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ์ฝ์œผ๋ ค๋ฉด GameObject.activeSelf๋ฅผ ์‚ฌ์šฉ
์”ฌ ์•ˆ์—์„œ ์‹ค์ œ๋กœ ํ™œ์„ฑ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด GameObject.activeInHierarchy๋ฅผ ์‚ฌ์šฉ

๐Ÿ’ก๋ถ€๋ชจ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด, ์ž์‹ ์˜ active ์„ค์ •์ด true์—ฌ๋„ ์”ฌ์—์„œ๋Š” ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋จ

Static ์ƒํƒœ

Unity์˜ ์ผ๋ถ€ ์‹œ์Šคํ…œ๋“ค(์ „์—ญ ์กฐ๋ช…(Global Illumination), ์˜คํด๋ฃจ์ „(Occlusion), ๋ฐฐ์นญ(Batching), ๋‚ด๋น„๊ฒŒ์ด์…˜(Navigation), ๋ฐ˜์‚ฌ ํ”„๋กœ๋ธŒ(Reflection Probes) ๋“ฑ)์€ GameObject์˜ ์ •์ (Static) ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

Unity ์‹œ์Šคํ…œ๋“ค์ด ํ•ด๋‹น GameObject๋ฅผ ์ •์ ์œผ๋กœ ์ธ์‹ํ• ์ง€ ์—ฌ๋ถ€๋Š” GameObjectUtility.SetStaticEditorFlags๋ฅผ ์‚ฌ์šฉํ•ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tags ์™€ Layers


ํƒœ๊ทธ(Tag)๋Š” ์”ฌ ์•ˆ์—์„œ GameObject์˜ ์ข…๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋ ˆ์ด์–ด(Layer)๋„ ๋น„์Šทํ•˜์ง€๋งŒ ๋ Œ๋”๋ง์ด๋‚˜ ๋ฌผ๋ฆฌ ์ถฉ๋Œ ๊ฐ™์€ ํŠน์ • ๋‚ด์žฅ ๋™์ž‘์—์„œ GameObject ๊ทธ๋ฃน์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ์™ธํ•˜๋Š” ์šฉ๋„๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” GameObject.tag ์™€ GameObject.layer ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ํƒœ๊ทธ์™€ ๋ ˆ์ด์–ด ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ณ  CompareTag ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋ฉด์„œ ํšจ์œจ์ ์œผ๋กœ ํƒœ๊ทธ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.
(CompareTag ์‚ฌ์šฉ์‹œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)


๐Ÿ”ฎ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€์™€ ์‚ญ์ œ

๋Ÿฐํƒ€์ž„(Runtime) ์ค‘์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
GameObject๋ฅผ ์ ˆ์ฐจ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜(GameObject๋ฅผ ์ฝ”๋“œ๋กœ ์ƒ์„ฑํ•  ๋•Œ), GameObject์˜ ๋™์ž‘์„ ๋™์ ์œผ๋กœ ์ˆ˜์ •ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋Ÿฐํƒ€์ž„์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ AddComponent ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

< > ์•ˆ์— ์ถ”๊ฐ€ํ•  ์ปดํฌ๋„ŒํŠธ ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด Object.Destroy ๋ฉ”์„œ๋“œ๋ฅผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ผ๋ถ€ ๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ์˜ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
(์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŒŒ๊ดดํ•˜์ง€ ์•Š๊ณ ๋„ ๊ป๋‹ค ์ผค ์ˆ˜ ์žˆ์Œ)

๋Ÿฐํƒ€์ž„์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ AddComponent<Type> ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • < > ์•ˆ์— ์ถ”๊ฐ€ํ•  ์ปดํฌ๋„ŒํŠธ ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
using UnityEngine;
using System.Collections;

public class AddComponentExample : MonoBehaviour
{
    void Start()
    {
        SphereCollider sc = gameObject.AddComponent<SphereCollider>();
    }
}

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด Object.Destroy ๋ฉ”์„œ๋“œ๋ฅผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”ฎ์ปดํฌ๋„ŒํŠธ ์ ‘๊ทผํ•˜๊ธฐ

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋Š” ๊ฐ™์€ GameObject์— ๋ถ™์–ด ์žˆ๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.
(์ฐธ๊ณ ๋กœ, GameObject์— ์ถ”๊ฐ€๋œ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋“ค ๋˜ํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค)

์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ(reference)๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด GetComponent ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

void Start ()
{
  Rigidbody rb = GetComponent<Rigidbody>();
}
//์ปดํฌ๋„ŒํŠธ ์ค‘ Rigidbody๋ฅผ ์˜ˆ์‹œ๋กœ ์‚ฌ์šฉ

์ฐธ์กฐ๋ฅผ ์–ป์œผ๋ฉด, ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ์„ค์ •ํ•˜๋“ฏ์ด ๊ทธ ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ ๊ฐ’์„ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();

    // ์˜ค๋ธŒ์ ํŠธ์˜ Rigidbody ์งˆ๋Ÿ‰์„ ๋ณ€๊ฒฝ
    rb.mass = 10f;
}

๋˜ํ•œ, ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();

    // Rigidbody์— ์œ„์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํž˜์„ ๊ฐ€ํ•จ
    rb.AddForce(Vector3.up * 10f);
}

๐Ÿ’กํ•˜๋‚˜์˜ GameObject์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปค์Šคํ…€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ GetComponent ๋ฅผ ์‚ฌ์šฉํ•ด ์›ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค ์ด๋ฆ„(๋˜๋Š” ํŒŒ์ผ๋ช…) ์„ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก๋งŒ์•ฝ GameObject์— ์—†๋Š” ํƒ€์ž…์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ GetComponent๋กœ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. null์ธ ์ƒํƒœ์—์„œ ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์—์„œ NullReference ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”ฎ๋‹ค๋ฅธ GameObject์˜ ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•˜๊ธฐ

์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋•Œ๋กœ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ GameObject๋‚˜, ๋” ํ”ํ•˜๊ฒŒ๋Š” ๋‹ค๋ฅธ GameObject์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
Unity์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ๋ณ€์ˆ˜๋กœ GameObject ์—ฐ๊ฒฐํ•˜๊ธฐ
  • ์ž์‹ GameObject ์ฐพ๊ธฐ

์ธ์ŠคํŽ™ํ„ฐ์—์„œ ๋ณ€์ˆ˜๋กœ GameObject ์—ฐ๊ฒฐํ•˜๊ธฐ

๊ฐ€์žฅ ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ์— public GameObject ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

public class sorcerer : MonoBehaviour
{
    public GameObject Wizard;

    //๊ทธ ์™ธ์˜ ์ฝ”๋“œ ๋‚ด์šฉ
}

์ด ๋ณ€์ˆ˜๋Š” ์ธ์ŠคํŽ™ํ„ฐ(Inspector) ์ฐฝ์— GameObject ํ•„๋“œ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์”ฌ์ด๋‚˜ ๊ณ„์ธต ํŒจ๋„์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋Œ์–ด๋‹ค ์ด ๋ณ€์ˆ˜ ์นธ์— ๋“œ๋กญํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’กํ”„๋กœ์ ํŠธ ์ฐฝ(Project Window)์˜ ํ”„๋ฆฌํŒน(Prefab)์„ ์ธ์ŠคํŽ™ํ„ฐ์˜ GameObject ํ•„๋“œ๋กœ ๋“œ๋ž˜๊ทธํ•ด ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

GetComponent ํ•จ์ˆ˜์™€ ์ปดํฌ๋„ŒํŠธ ์ ‘๊ทผ ๋ณ€์ˆ˜๋Š” ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ๋œ ์˜ค๋ธŒ์ ํŠธ์—๋„ ๋˜‘๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public class sorcerer : MonoBehaviour {

  public GameObject Wizard;

  void Start() {
      // ์œ„์ž๋“œ์˜ ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ ์†Œ์„œ๋Ÿฌ๋ฅผ 2 ์œ ๋‹› ์•ž์— ๋ฐฐ์น˜
      transform.position = Wizard.transform.position + Vector3.forward * 2f;
  }
}

๋˜ํ•œ, ์Šคํฌ๋ฆฝํŠธ์—์„œ ํŠน์ • ์ปดํฌ๋„ŒํŠธ ํƒ€์ž…์˜ public ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด,
ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ™์–ด ์žˆ๋Š” ์–ด๋–ค GameObject๋“  ๋“œ๋ž˜๊ทธํ•ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ GameObject ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ”๋กœ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

public Transform playerTransform;

์ด ๋ฐฉ๋ฒ•์˜ ์žฅ์ :

  • ์˜๊ตฌ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐœ๋ณ„ ์˜ค๋ธŒ์ ํŠธ๋“ค ๊ฐ„ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค๊ธฐ์— ๋งค์šฐ ํŽธ๋ฆฌ

  • ๊ฐ™์€ ํƒ€์ž…์˜ ์—ฌ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๋ฐฐ์—ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    ๋‹จ, ๋ฐฐ์—ด์— ๋„ฃ์„ ๊ฐœ๋ณ„ ์—ฐ๊ฒฐ์€ ์—ฌ์ „ํžˆ ์—๋””ํ„ฐ์—์„œ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผํ•จ

์ž์‹ GameObject ์ฐพ๊ธฐ

์”ฌ์—๋Š” ์ข…์ข… ๊ฐ™์€ ํƒ€์ž…์˜ ์—ฌ๋Ÿฌ GameObject(์˜ˆ: ์ˆ˜์ง‘ ์•„์ดํ…œ, ์›จ์ดํฌ์ธํŠธ, ์žฅ์• ๋ฌผ ๋“ฑ)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์„ ์ผ์ผ์ด ๋ณ€์ˆ˜์— ๋“œ๋ž˜๊ทธํ•ด ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฒˆ๊ฑฐ๋กœ์›Œ์ง‘๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ์›จ์ดํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ณ  ์‚ญ์ œํ•˜๋ฉด ๋ณ€์ˆ˜ ์ฐธ์กฐ๋„ ์ง€์›Œ์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ์ž์‹ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ช‡์‹ญ๊ฐœ ๋˜๋Š” ๊ฒฝ์šฐ ๋“œ๋ž˜๊ทธ๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ ์˜ฎ๊ฒจ์„œ ์ ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›€(ex: ๋ฐฐ๊ฒฝ์— ๋‚˜๋ฌด๋ฅผ 300๊ทธ๋ฃจ ์‹ฌ์€๊ฒฝ์šฐ ๋“ฑ)

์ด๋•Œ ๋ชจ๋“  ๊ด€๋ จ GameObject๋ฅผ ํ•˜๋‚˜์˜ ๋ถ€๋ชจ GameObject ์•„๋ž˜์— ์ž์‹์œผ๋กœ ๋ฐฐ์น˜ํ•˜๋ฉด ๋ถ€๋ชจ์˜ Transform ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์ž์‹ GameObject๋“ค์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(๋ชจ๋“  GameObject๋Š” Transform์„ ํฌํ•จํ•˜๋ฏ€๋กœ ๊ฐ€๋Šฅ)

using UnityEngine;

public class WaypointManager : MonoBehaviour {
    public Transform[] spellbook;

    void Start()
    {
        spellbook = new Transform[transform.childCount];
        int i = 0;

        foreach (Transform t in transform)
        {
            spellbook[i++] = t;
        }
    }
}

๋˜ํ•œ, ์ž์‹ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ง์ ‘ ์ฐพ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

transform.Find("VIN'Spells");

์ด ๋ฐฉ๋ฒ•์€ ๋ฏธ๋ฆฌ ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์ค‘์— ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ๋Š” ์ž์‹ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
(์˜ˆ: ๊ฒŒ์ž„ ์ค‘์— ์ง‘์—ˆ๋‹ค ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋‚˜ ์žฅ๋น„๋ฅ˜ ๊ฐ™์€ ๊ฒฝ์šฐ.)

๐Ÿ”ฎSend message์™€ Broadcast message

ํ”„๋กœ์ ํŠธ๋ฅผ ํŽธ์ง‘ํ•  ๋•Œ ์ธ์ŠคํŽ™ํ„ฐ(Inspector)์—์„œ GameObject ๊ฐ„์˜ ์ฐธ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ฒŒ์ž„ ๋‚ด์—์„œ ์บ๋ฆญํ„ฐ ์ฃผ๋ณ€์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์•„์ดํ…œ์„ ์ฐพ๋Š”๋‹ค๊ฑฐ๋‚˜, ์”ฌ์ด ๋กœ๋“œ๋œ ํ›„์— ์ƒ์„ฑ(Instantiate)๋œ GameObject์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ฒ˜๋Ÿผ, ์‚ฌ์ „์— ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿด ๋•Œ๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ์ฐธ์กฐ๋ฅผ ์ฐพ์•„๋‚ด๊ณ  GameObject ๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Send message

  • ๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ 
  • ํ˜ธ์ถœ์ด ํ•ด๋‹น GameObject์—๋งŒ ์ „๋‹ฌ๋˜๋ฉฐ, ์ž์‹ ์˜ค๋ธŒ์ ํŠธ์—๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ

Broadcast message

  • ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜๋Œ€๋กœ ๋ถ€๋ชจ ๋ฐฉํ–ฅ์œผ๋กœ ํ˜ธ์ถœ์„ ์ „๋‹ฌ
  • ์ฆ‰, GameObject์™€ ๋ชจ๋“  ๋ถ€๋ชจ ์˜ค๋ธŒ์ ํŠธ์—์„œ ํ•ด๋‹น ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์•„ ํ˜ธ์ถœ

๐Ÿ”ฎ์ด๋ฆ„์ด๋‚˜ ํƒœ๊ทธ๋กœ GameObject ์ฐพ๊ธฐ

์”ฌ ๊ณ„์ธต ๊ตฌ์กฐ ์–ด๋””์— ์žˆ๋“ , ์‹๋ณ„ํ•  ์ •๋ณด๋งŒ ์žˆ์œผ๋ฉด GameObject๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„์œผ๋กœ ์ฐพ๊ธฐ

๊ฐœ๋ณ„ ์˜ค๋ธŒ์ ํŠธ๋Š” GameObject.Find ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GameObject player;

void Start()
{
  player = GameObject.Find("MainHeroCharacter");
}

ํƒœ๊ทธ๋กœ ์ฐพ๊ธฐ

๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ๋‚˜ ์—ฌ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํƒœ๊ทธ(tag) ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฐพ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • GameObject.FindWithTag : ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ˜ํ™˜
  • GameObject.FindGameObjectsWithTag : ๊ฐ™์€ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜
GameObject spellbook;
GameObject[] spells;

void Start()
{
  	//๊ฒŒ์ž„์—์„œ ๋งˆ๋ฒ•์„œ์€ ์บ๋ฆญํ„ฐ๋Š” ํ•œ ๊ฐœ, ๊ฐ€๋ฐฉ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฃผ๋ฌธ์„œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ
    spellbook = GameObject.FindWithTag("SpellBook");
    spells = GameObject.FindGameObjectsWithTag("Spell");
}

๐Ÿ”ฎGameObject ์ƒ์„ฑ ๋ฐ ์ œ๊ฑฐ

ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๋•Œ GameObject๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Unity์—์„œ๋Š” Instantiate ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ์กด ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒˆ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด GameObject๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
(์ž์„ธํ•œ ์„ค๋ช…๊ณผ ์˜ˆ์ œ๋Š” Instantiating Prefabs at Runtime ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ )

public GameObject fireball;

void OnTriggerEnter(Collider other) {
    if (other.gameObject.tag == "Summonfire") {
        // fireball์„ ํ˜„์žฌ ์œ„์น˜์— ์ƒ์„ฑ
        Instantiate(fireball, transform.position, Quaternion.identity);
    }
}

Destroy ๋ฉ”์„œ๋“œ๋Š” ์ง€์ •ํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ”„๋ ˆ์ž„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋๋‚œ ํ›„ ํ˜น์€ ์ง€์ •ํ•œ ์ง€์—ฐ ์‹œ๊ฐ„ ์ดํ›„์— ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

void OnCollisionEnter(Collision otherObj) {
 	//OnCollisionEnter๋Š” ์ถฉ๋Œ์‹œ๋ผ๋Š” ์ •๋„๋งŒ ์ผ๋‹จ ์ƒ๊ฐํ•ด๋„ ์ข‹๋‹ค.
   if (otherObj.gameObject.tag == "Garbage can") {
       Destroy(gameObject, 0.5f);
   }
}

Destroy ํ•จ์ˆ˜๋Š” ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ๋งŒ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ๊ณ , GameObject ์ž์ฒด์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”ํ•œ ์‹ค์ˆ˜ ์˜ˆ:

Destroy(this);

this๋Š” ์Šคํฌ๋ฆฝํŠธ ์ž์‹ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ์ปดํฌ๋„ŒํŠธ๋งŒ ์ œ๊ฑฐ๋˜๊ณ , GameObject๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ์ง€๋งŒ ์ด ์Šคํฌ๋ฆฝํŠธ ์ปดํฌ๋„ŒํŠธ๋งŒ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’กInstantiate๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ• ๋‹นํ•˜๊ณ  Destroy๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๋ฐœ์ƒ์‹œํ‚ด. ์ƒ์„ฑ๊ณผ ์‚ญ์ œ๋ฅผ ์ž์ฃผ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/ํ•ด์ œ๊ฐ€ ์žฆ์•„์ ธ์„œ GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜) ์ŠคํŒŒ์ดํฌ๊ฐ€ ์ผ์–ด๋‚จ.
๊ทธ ์™ธ์—๋„ ๋งŽ์€ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์žˆ์–ด์„œ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

๐Ÿ”ฎ๊ธฐ๋ณธ ํ˜•์ƒ ์˜ค๋ธŒ์ ํŠธ(Primitives)

GameObject ํด๋ž˜์Šค๋Š” Unity ์—๋””ํ„ฐ์˜ GameObject ๋ฉ”๋‰ด์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ(Primitive) ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ์˜ต์…˜์„ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Unity์˜ ๋‚ด์žฅ๋œ ๊ธฐ๋ณธ ํ˜•์ƒ์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋ ค๋ฉด GameObject.CreatePrimitive ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.์ด ๋ฉ”์„œ๋“œ๋Š” ์ง€์ •ํ•œ ํƒ€์ž…์˜ ๊ธฐ๋ณธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • Plane(ํ‰๋ฉด, ์—ฌ๋Ÿฌ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋‚˜๋‰˜์–ด ์žˆ๊ณ  ๋””ํ…Œ์ผํ•œ ๋ณ€ํ˜•, ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ฐ€๋Šฅ.)
  • Cube(์œก๋ฉด์ฒด)
  • Sphere(๊ตฌ)
  • Capsule(์บก์А)
  • Cylinder(์›๊ธฐ๋‘ฅ)
  • Quad(ํ‰๋ฉด์ด์ง€๋งŒ ๋‹จ์ผ ์‚ฌ๊ฐํ˜•, ํด๋ฆฌ๊ณค ์ˆ˜๊ฐ€ ๋งค์šฐ ์ ๊ณ  2D ํšจ๊ณผ ๊ตฌํ˜„์— ์ ํ•ฉ)

๐Ÿ’กPrimitives๋Š” Unity์˜ GameObject ๋ฉ”๋‰ด์—์„œ๋„ ๋ฐ”๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฉ”๋‰ด์—์„œ ์ œ๊ณตํ•˜๋Š” Primitive shapes๋ฅผ ์ฝ”๋“œ๋กœ ์ƒ์„ฑํ•  ๋•Œ ์œ„ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

https://docs.unity3d.com/Manual/class-GameObject.html

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

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