🫧Art_009 Prefab Spawner

BamgasiJMΒ·2026λ…„ 3μ›” 20일

Unity GenArt

λͺ©λ‘ 보기
20/41
post-thumbnail

였브젝트λ₯Ό λ¬΄μž‘μœ„ μœ„μΉ˜μ— 생성

  • 3D κ³΅κ°„μ˜ 일정 λ²”μœ„ λ‚΄μ—μ„œ spawn이 되고 μ»€μ‘Œλ‹€κ°€ μž‘μ•„μ§€κ³  μ‚¬λΌμ§€λŠ” μ—°μΆœ
  • 미리 Prefab을 λ§Œλ“€μ–΄μ„œ GameObject의 μΈμŠ€νŽ™ν„° μ°½μ—μ„œ 선택
  • SpawnRate둜 μƒκΈ°λŠ” μ£ΌκΈ°λ₯Ό 관리

적용 방법

  • PrefabSpawner.csλ₯Ό μ”¬μ˜ 빈 μ˜€λΈŒμ νŠΈμ— λ„£κ³  Prefab 칸에 ν•΄λ‹Ή ν”„λ¦¬νŒΉμ„ ν• λ‹Ήν•©λ‹ˆλ‹€.
  • μŠ€ν¬λ„ˆ 였브젝트의 μœ„μΉ˜(Transform.position)κ°€ n x n x n 큐브의 정쀑앙이 λ©λ‹ˆλ‹€.
  • μ§€μ •λœ μ˜μ—­ λ‚΄μ—μ„œ Prefab μ˜€λΈŒμ νŠΈκ°€ λ‚˜νƒ€λ‚¬λ‹€κ°€ μž μ‹œ ν›„ μž‘μ•„μ§€λ©° μ‚¬λΌμ§‘λ‹ˆλ‹€.

πŸ“„PrefabSpawner.cs

using UnityEngine;
using System.Collections;

public class PrefabSpawner : MonoBehaviour
{
  public GameObject prefab;
  public float spawnRate = 0.1f;
  public float nextSpawnTime;

  void Update()
  {
    if (Time.time > nextSpawnTime)
    {
      SpawnAndAnimate();
      nextSpawnTime = Time.time + spawnRate;
    }
  }

  void SpawnAndAnimate()
  {
    Vector3 randomPos = transform.position + new Vector3(
      Random.Range(-3f, 3f),
      Random.Range(-3f, 3f),
      Random.Range(-3f, 3f));

    GameObject newObj = Instantiate(prefab, randomPos, Quaternion.identity);

    StartCoroutine(ScaleRoutine(newObj));
  }

  IEnumerator ScaleRoutine(GameObject target)
  {
    if (target == null) yield break;

    target.transform.localScale = Vector3.zero;
    float finalScale = Random.Range(0.3f, 0.6f);
    float speed = 0.3f;

    float elapsed = 0f;
    while (elapsed < speed)
    {
      if (target == null) yield break;
      elapsed += Time.deltaTime;
      target.transform.localScale = Vector3.Lerp(
        Vector3.zero, Vector3.one * finalScale, elapsed / speed
      );
      yield return null;
    }

    yield return new WaitForSeconds(1.5f);

    elapsed = 0f;
    while (elapsed < speed)
    {
      if (target == null) yield break;
      elapsed += Time.deltaTime;
      target.transform.localScale = Vector3.Lerp(
        Vector3.one * finalScale, Vector3.zero, elapsed / speed
      );
      yield return null;
    }

    Destroy(target);
  }
}

πŸ“„PrefabSpawner.cs (주석)

// UnityEngine λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. (μœ λ‹ˆν‹°μ˜ 핡심 κΈ°λŠ₯ μ‚¬μš© μœ„ν•΄ ν•„μˆ˜)
using UnityEngine;
// System.Collections λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. (코루틴 μ‚¬μš© μœ„ν•΄ ν•„μˆ˜)
using System.Collections;

// MonoBehaviour λ₯Ό μƒμ†λ°›λŠ” 'PrefabSpawner' λΌλŠ” μ΄λ¦„μ˜ 곡곡 (public) 클래슀λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
public class PrefabSpawner : MonoBehaviour
{
    // [λ³€μˆ˜ 1] μΈμŠ€νŽ™ν„° μ°½μ—μ„œ ν• λ‹Ήν•  수 μžˆλŠ” 생성할 ν”„λ¦¬νŒΉ (객체) μž…λ‹ˆλ‹€.
    public GameObject prefab;
    
    // [λ³€μˆ˜ 2] 객체가 μƒμ„±λ˜λŠ” μ‹œκ°„ 간격 (초) μž…λ‹ˆλ‹€. 값이 μž‘μ„μˆ˜λ‘ 많이 μƒμ„±λ©λ‹ˆλ‹€.
    public float spawnRate = 0.1f;
    
    // [λ³€μˆ˜ 3] λ‹€μŒμœΌλ‘œ 객체가 생성될 μ˜ˆμ •μΈ μ‹œμ  (κ²Œμž„ μ‹œμž‘ ν›„ κ²½κ³Ό μ‹œκ°„) 을 μ €μž₯ν•©λ‹ˆλ‹€.
    public float nextSpawnTime;

    // Update λŠ” λ§€ ν”„λ ˆμž„ (화면이 갱신될 λ•Œλ§ˆλ‹€) μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
    void Update()
    {
        // ν˜„μž¬ κ²Œμž„ μ‹œκ°„ (Time.time) 이 λ‹€μŒ 생성 μ‹œκ°„ (nextSpawnTime) 보닀 μ§€λ‚¬λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
        if (Time.time > nextSpawnTime)
        {
            // 객체 생성 및 μ• λ‹ˆλ©”μ΄μ…˜ μ‹€ν–‰ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
            SpawnAndAnimate();
            
            // λ‹€μŒ 생성 μ‹œκ°„μ„ 'ν˜„μž¬ μ‹œκ°„ + 생성 간격'으둜 κ°±μ‹ ν•˜μ—¬ 타이밍을 μ‘°μ ˆν•©λ‹ˆλ‹€.
            nextSpawnTime = Time.time + spawnRate;
        }
    }

    // 객체λ₯Ό μƒμ„±ν•˜κ³  μ• λ‹ˆλ©”μ΄μ…˜ 코루틴을 μ‹œμž‘ν•˜λŠ” 일반 ν•¨μˆ˜μž…λ‹ˆλ‹€.
    void SpawnAndAnimate()
    {
        // [μœ„μΉ˜ 계산] ν˜„μž¬ 객체 (이 μŠ€ν¬λ¦½νŠΈκ°€ 뢙은 것) 의 μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ λ¬΄μž‘μœ„ μ˜€ν”„μ…‹μ„ λ”ν•©λ‹ˆλ‹€.
        // Random.Range(-3f, 3f) λŠ” -3 μ—μ„œ 3 μ‚¬μ΄μ˜ λžœλ€ν•œ 값을 μ˜λ―Έν•©λ‹ˆλ‹€. (X, Y, Z μΆ• λͺ¨λ‘)
        Vector3 randomPos = transform.position + new Vector3(
            Random.Range(-3f, 3f),   // X μΆ• λ¬΄μž‘μœ„ μœ„μΉ˜ (-3 ~ 3)
            Random.Range(-3f, 3f),   // Y μΆ• λ¬΄μž‘μœ„ μœ„μΉ˜ (-3 ~ 3)
            Random.Range(-3f, 3f));  // Z μΆ• λ¬΄μž‘μœ„ μœ„μΉ˜ (-3 ~ 3)

        // [객체 생성] μ§€μ •ν•œ ν”„λ¦¬νŒΉμ„ κ³„μ‚°λœ μœ„μΉ˜ (randomPos), νšŒμ „ μ—†μŒ (Quaternion.identity) 으둜 μƒμ„±ν•©λ‹ˆλ‹€.
        // μƒμ„±λœ 객체의 참쑰값을 newObj λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€.
        GameObject newObj = Instantiate(prefab, randomPos, Quaternion.identity);

        // [코루틴 μ‹œμž‘] μƒμ„±λœ 객체 (newObj) λ₯Ό λŒ€μƒμœΌλ‘œ 크기 쑰절 μ• λ‹ˆλ©”μ΄μ…˜ 코루틴을 μ‹œμž‘ν•©λ‹ˆλ‹€.
        StartCoroutine(ScaleRoutine(newObj));
    }

    // IEnumerator λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λŠ” '코루틴 (Coroutine)'이 λ©λ‹ˆλ‹€. (비동기적 처리 κ°€λŠ₯)
    IEnumerator ScaleRoutine(GameObject target)
    {
        // [μ•ˆμ „μž₯치] λŒ€μƒ 객체가 이미 μ‚­μ œλ˜μ—ˆλ‹€λ©΄ 코루틴을 μ¦‰μ‹œ μ’…λ£Œν•©λ‹ˆλ‹€. (μ—λŸ¬ λ°©μ§€)
        if (target == null) yield break;

        // μ• λ‹ˆλ©”μ΄μ…˜ μ‹œμž‘ μ „, 객체의 크기λ₯Ό 0 (Vector3.zero) 으둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
        target.transform.localScale = Vector3.zero;
        
        // [λ³€μˆ˜] μ΅œμ’…μ μœΌλ‘œ 컀질 크기λ₯Ό 0.3 μ—μ„œ 0.6 사이 랜덀 κ°’μœΌλ‘œ κ²°μ •ν•©λ‹ˆλ‹€.
        float finalScale = Random.Range(0.3f, 0.6f);
        
        // [λ³€μˆ˜] 크기가 λ³€ν•˜λŠ” 데 걸릴 μ‹œκ°„ (속도) 을 0.3 초둜 μ„€μ •ν•©λ‹ˆλ‹€.
        float speed = 0.3f;

        // [타이머] κ²½κ³Ό μ‹œκ°„μ„ μ €μž₯ν•  λ³€μˆ˜λ₯Ό 0 으둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
        float elapsed = 0f;
        
        // κ²½κ³Ό μ‹œκ°„μ΄ μ„€μ •λœ 속도 (speed) 보닀 μž‘μ„ λ™μ•ˆ λ°˜λ³΅ν•©λ‹ˆλ‹€. (μ»€μ§€λŠ” μ• λ‹ˆλ©”μ΄μ…˜ 루프)
        while (elapsed < speed)
        {
            // [μ•ˆμ „μž₯치] 루프 도쀑 객체가 μ‚­μ œλ˜λ©΄ 코루틴을 μ’…λ£Œν•©λ‹ˆλ‹€.
            if (target == null) yield break;
            
            // κ²½κ³Ό μ‹œκ°„μ— ν˜„μž¬ ν”„λ ˆμž„μ˜ μ‹œκ°„ 차이 (Time.deltaTime) λ₯Ό λ”ν•©λ‹ˆλ‹€.
            elapsed += Time.deltaTime;
            
            // [보간] ν˜„μž¬ 크기λ₯Ό 0 μ—μ„œ μ΅œμ’… 크기 (finalScale) κΉŒμ§€ λΆ€λ“œλŸ½κ²Œ λ³€κ²½ν•©λ‹ˆλ‹€.
            // elapsed / speed λŠ” 0.0 μ—μ„œ 1.0 κΉŒμ§€μ˜ λΉ„μœ¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
            target.transform.localScale = Vector3.Lerp(
                Vector3.zero,                  // μ‹œμž‘ 크기 (0)
                Vector3.one * finalScale,      // λͺ©ν‘œ 크기 (랜덀 κ°’)
                elapsed / speed                // μ§„ν–‰ λΉ„μœ¨ (0~1)
            );
            
            // [λŒ€κΈ°] λ‹€μŒ ν”„λ ˆμž„μ΄ 될 λ•ŒκΉŒμ§€ 코루틴 싀행을 μž μ‹œ 멈μΆ₯λ‹ˆλ‹€. (λΆ€λ“œλŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜ μœ„ν•΄ ν•„μˆ˜)
            yield return null;
        }

        // [λŒ€κΈ°] λ‹€ 컀진 μƒνƒœμ—μ„œ 1.5 초 λ™μ•ˆ κΈ°λ‹€λ¦½λ‹ˆλ‹€.
        yield return new WaitForSeconds(1.5f);

        // [타이머 μ΄ˆκΈ°ν™”] μ‚¬λΌμ§€λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ„ μœ„ν•΄ κ²½κ³Ό μ‹œκ°„μ„ λ‹€μ‹œ 0 으둜 λ§Œλ“­λ‹ˆλ‹€.
        elapsed = 0f;
        
        // κ²½κ³Ό μ‹œκ°„μ΄ 속도보닀 μž‘μ„ λ™μ•ˆ λ°˜λ³΅ν•©λ‹ˆλ‹€. (μž‘μ•„μ§€λŠ” μ• λ‹ˆλ©”μ΄μ…˜ 루프)
        while (elapsed < speed)
        {
            // [μ•ˆμ „μž₯치] 루프 도쀑 객체가 μ‚­μ œλ˜λ©΄ 코루틴을 μ’…λ£Œν•©λ‹ˆλ‹€.
            if (target == null) yield break;
            
            // κ²½κ³Ό μ‹œκ°„μ„ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
            elapsed += Time.deltaTime;
            
            // [보간] ν˜„μž¬ 크기λ₯Ό μ΅œμ’… ν¬κΈ°μ—μ„œ 0 으둜 λΆ€λ“œλŸ½κ²Œ λ³€κ²½ν•©λ‹ˆλ‹€. (λ°˜λŒ€ λ°©ν–₯)
            target.transform.localScale = Vector3.Lerp(
                Vector3.one * finalScale,      // μ‹œμž‘ 크기 (랜덀 κ°’)
                Vector3.zero,                  // λͺ©ν‘œ 크기 (0)
                elapsed / speed                // μ§„ν–‰ λΉ„μœ¨ (0~1)
            );
            
            // [λŒ€κΈ°] λ‹€μŒ ν”„λ ˆμž„κΉŒμ§€ λŒ€κΈ°ν•©λ‹ˆλ‹€.
            yield return null;
        }

        // [객체 μ‚­μ œ] μ• λ‹ˆλ©”μ΄μ…˜μ΄ λͺ¨λ‘ λλ‚˜λ©΄ λ©”λͺ¨λ¦¬μ—μ„œ 객체λ₯Ό μ™„μ „νžˆ μ‚­μ œν•©λ‹ˆλ‹€.
        Destroy(target);
    }
}

μ½”λ“œ μ„€λͺ…

1. κΈ°λŠ₯별 ꡬ획 μ„€λͺ…

이 μŠ€ν¬λ¦½νŠΈλŠ” 크게 3 κ°€μ§€ μ£Όμš” κΈ°λŠ₯으둜 λ‚˜λ‰©λ‹ˆλ‹€.

1. 슀폰 타이밍 관리 (Update ν•¨μˆ˜)

  • κ²Œμž„μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ§€ ν”„λ ˆμž„ μ‹œκ°„μ„ μ²΄ν¬ν•©λ‹ˆλ‹€.
  • spawnRate 에 μ„€μ •λœ μ‹œκ°„ κ°„κ²©λ§ˆλ‹€ 생성 λ‘œμ§μ„ νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€.
  • ν”„λ ˆμž„ 속도에 상관없이 μΌμ •ν•œ μ‹œκ°„ 간격을 μœ μ§€ν•˜κΈ° μœ„ν•΄ Time.time 을 μ‚¬μš©ν•©λ‹ˆλ‹€.

2. 객체 생성 및 μœ„μΉ˜ μ§€μ • (SpawnAndAnimate ν•¨μˆ˜)

  • μŠ€ν¬λ¦½νŠΈκ°€ λΆ™μ–΄μžˆλŠ” 객체 (transform.position) λ₯Ό μ€‘μ‹¬μœΌλ‘œ Β±n μœ λ‹› λ²”μœ„ λ‚΄μ˜ λ¬΄μž‘μœ„ 3 차원 μ’Œν‘œλ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  • Instantiate λ₯Ό 톡해 ν”„λ¦¬νŒΉμ„ μ‹€μ œ 씬 (Scene) 에 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • 생성과 λ™μ‹œμ— μ• λ‹ˆλ©”μ΄μ…˜ 코루틴을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

3. 생λͺ…μ£ΌκΈ° μ• λ‹ˆλ©”μ΄μ…˜ (ScaleRoutine 코루틴)

  • 탄생: 크기가 0 μ—μ„œ λžœλ€ν•œ ν¬κΈ°κΉŒμ§€ μ„œμ„œνžˆ μ»€μ§‘λ‹ˆλ‹€ (Lerp μ‚¬μš©).
  • μœ μ§€: λ‹€ 컀진 μƒνƒœλ‘œ 1.5 μ΄ˆκ°„ μ •μ§€ν•©λ‹ˆλ‹€.
  • μ†Œλ©Έ: 크기가 λ‹€μ‹œ 0 으둜 μ„œμ„œνžˆ 쀄어듀며 μ‚¬λΌμ§‘λ‹ˆλ‹€.
  • 정리: Destroy 둜 객체λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•˜μ—¬ μ„±λŠ₯ μ €ν•˜λ₯Ό λ§‰μŠ΅λ‹ˆλ‹€.

2. λ³€μˆ˜ 의미 및 문법 μ„€λͺ…

μ£Όμš” λ³€μˆ˜ (Variables)

λ³€μˆ˜λͺ…νƒ€μž…μ˜λ―Έ
prefabGameObject씬에 생성될 원본 κ°μ²΄μž…λ‹ˆλ‹€. μΈμŠ€νŽ™ν„°μ—μ„œ λ“œλž˜κ·Έν•˜μ—¬ ν• λ‹Ήν•΄μ•Ό ν•©λ‹ˆλ‹€.
spawnRatefloat객체 생성 간격 (초) μž…λ‹ˆλ‹€. 예: 0.1 이면 0.1 μ΄ˆλ§ˆλ‹€ 생성 μ‹œλ„.
nextSpawnTimefloatλ‹€μŒ 생성이 ν—ˆμš©λ˜λŠ” μ‹œμ μ˜ κ²Œμž„ μ‹œκ°„μž…λ‹ˆλ‹€.
randomPosVector3객체가 생성될 λ¬΄μž‘μœ„ 3 차원 μ’Œν‘œμž…λ‹ˆλ‹€.
newObj / targetGameObjectμƒμ„±λœ 객체 λ˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ˜ λŒ€μƒμ΄ λ˜λŠ” 객체의 μ°Έμ‘°κ°’μž…λ‹ˆλ‹€.
finalScalefloat객체가 μ΅œλŒ€λ‘œ 컀질 λ•Œμ˜ 크기 λ°°μœ¨μž…λ‹ˆλ‹€.
elapsedfloatμ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹œμž‘λœ ν›„ κ²½κ³Όν•œ μ‹œκ°„μž…λ‹ˆλ‹€.

μ£Όμš” 문법 및 μœ λ‹ˆν‹° API (Syntax & API)

1.IEnumerator 와 yield return (코루틴)

  • 의미: ν•¨μˆ˜μ˜ 싀행을 μž μ‹œ λ©ˆμ·„λ‹€κ°€ λ‚˜μ€‘μ— λ‹€μ‹œ μ΄μ–΄μ„œ μ‹€ν–‰ν•  수 있게 ν•΄μ£ΌλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
  • μš©λ„: WaitForSeconds 처럼 μ‹œκ°„μ„ κΈ°λ‹€λ¦¬κ±°λ‚˜, yield return null 처럼 λ‹€μŒ ν”„λ ˆμž„κΉŒμ§€ 기닀릴 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. 일반 ν•¨μˆ˜μ—μ„œλŠ” Wait ν•˜λ©΄ κ²Œμž„μ΄ λ©ˆμΆ”μ§€λ§Œ, 코루틴은 κ²Œμž„ 흐름을 λŠμ§€ μ•Šκ³  λŒ€κΈ°ν•©λ‹ˆλ‹€.
  • yield break: 코루틴을 쀑간에 κ°•μ œλ‘œ μ’…λ£Œν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. (μ—¬κΈ°μ„œλŠ” 객체가 미리 μ‚­μ œλ˜μ—ˆμ„ λ•Œ μ—λŸ¬λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©)

2. Vector3.Lerp(A, B, t) (μ„ ν˜• 보간)

의미: κ°’ A μ—μ„œ κ°’ B κΉŒμ§€ t λΉ„μœ¨λ§ŒνΌ λΆ€λ“œλŸ½κ²Œ μ΄λ™ν•œ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
문법: t λŠ” 보톡 0.0 ~ 1.0 μ‚¬μ΄μ˜ κ°’μž…λ‹ˆλ‹€. 0 이면 A, 1 이면 B, 0.5 이면 쀑간 값이 λ©λ‹ˆλ‹€.
μš©λ„: ν”„λ ˆμž„λ§ˆλ‹€ t 값을 μ‘°κΈˆμ”© μ¦κ°€μ‹œμΌœμ£Όλ©΄ λΆ€λ“œλŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜ (λΆ€λ“œλŸ¬μš΄ 크기 쑰절) 이 λ©λ‹ˆλ‹€.

3. Instantiate 와 Destroy

  • Instantiate: μ½”λ“œμƒμœΌλ‘œ 객체λ₯Ό λ³΅μ œν•˜μ—¬ 씬에 μƒμ„±ν•©λ‹ˆλ‹€.
  • Destroy: 객체λ₯Ό μ”¬μ—μ„œ μ œκ±°ν•˜κ³  λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€. μ œλ„ˆλ ˆμ΄ν‹°λΈŒ μ•„νŠΈμ²˜λŸΌ 객체가 계속 μƒκ²¨λ‚˜κ³  μ‚¬λΌμ§€λŠ” 경우, Destroy λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‘œ κ²Œμž„μ΄ λŠλ €μ§‘λ‹ˆλ‹€.

4. Random.Range(min, max)

  • 의미: μ΅œμ†Œκ°’ (min) κ³Ό μ΅œλŒ€κ°’ (max) μ‚¬μ΄μ˜ λžœλ€ν•œ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 주의: μ •μˆ˜ (int) 와 μ‹€μˆ˜ (float) 에 따라 λ™μž‘ λ²”μœ„κ°€ μ•½κ°„ λ‹€λ₯Ό 수 μžˆμœΌλ‚˜, μ—¬κΈ°μ„œλŠ” 3f 처럼 μ‹€μˆ˜λ₯Ό μ‚¬μš©ν–ˆμœΌλ―€λ‘œ μ΅œλŒ€κ°’ (3.0) 도 포함될 수 μžˆλŠ” λ²”μœ„λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

5. Quaternion.identity

  • 의미: νšŒμ „μ΄ μ „ν˜€ μ—†λŠ” μƒνƒœ (0, 0, 0) λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • μš©λ„: 객체λ₯Ό 생성할 λ•Œ νšŒμ „κ°’μ„ κΈ°λ³Έκ°’μœΌλ‘œ μœ μ§€ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

3. 팁 (Tip)

  • μΈμŠ€νŽ™ν„° μ„€μ •: 이 슀크립트λ₯Ό μ”¬μ˜ 빈 객체 (Empty GameObject) 에 뢙인 ν›„, μΈμŠ€νŽ™ν„° μ°½μ—μ„œ Prefab ν•­λͺ©μ— μƒμ„±ν•˜κ³  싢은 3D 객체 (예: ꡬ, 큐브 λ“±) λ₯Ό λ“œλž˜κ·Έν•΄μ•Ό μž‘λ™ν•©λ‹ˆλ‹€.
  • μ„±λŠ₯ μ΅œμ ν™”: spawnRate λ₯Ό λ„ˆλ¬΄ μž‘κ²Œ (예: 0.001) μ„€μ •ν•˜λ©΄ μˆœμ‹κ°„μ— 수천 개의 객체가 μƒμ„±λ˜μ–΄ 컴퓨터가 멈좜 수 μžˆμœΌλ‹ˆ μ£Όμ˜ν•˜μ„Έμš”.
  • μ•ˆμ „μž₯치 if (target == null) : 코루틴이 μ‹€ν–‰λ˜λŠ” 도쀑에 μ™ΈλΆ€ μš”μΈ (λ‹€λ₯Έ 슀크립트 λ“±) 으둜 객체가 μ‚­μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ target 에 μ ‘κ·Όν•˜λ©΄ μ—λŸ¬κ°€ λ‚˜λ―€λ‘œ, λ§€ λ£¨ν”„λ§ˆλ‹€ 객체가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 것이 쒋은 μ½”λ”© μŠ΅κ΄€μž…λ‹ˆλ‹€.
profile
Coding Art with Blender / oF / Processing / p5.js / nannou

0개의 λŒ“κΈ€