


PrefabSpawner.csλ₯Ό μ¬μ λΉ μ€λΈμ νΈμ λ£κ³ Prefab μΉΈμ ν΄λΉ ν리νΉμ ν λΉν©λλ€.Transform.position)κ° n x n x n νλΈμ μ μ€μμ΄ λ©λλ€.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);
}
}
// 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);
}
}
μ΄ μ€ν¬λ¦½νΈλ ν¬κ² 3 κ°μ§ μ£Όμ κΈ°λ₯μΌλ‘ λλ©λλ€.
1. μ€ν° νμ΄λ° κ΄λ¦¬ (Update ν¨μ)
spawnRate μ μ€μ λ μκ° κ°κ²©λ§λ€ μμ± λ‘μ§μ νΈλ¦¬κ±°ν©λλ€.Time.time μ μ¬μ©ν©λλ€.2. κ°μ²΄ μμ± λ° μμΉ μ§μ (SpawnAndAnimate ν¨μ)
transform.position) λ₯Ό μ€μ¬μΌλ‘ Β±n μ λ λ²μ λ΄μ 무μμ 3 μ°¨μ μ’νλ₯Ό κ³μ°ν©λλ€.Instantiate λ₯Ό ν΅ν΄ ν리νΉμ μ€μ μ¬ (Scene) μ λνλ
λλ€.3. μλͺ
μ£ΌκΈ° μ λλ©μ΄μ
(ScaleRoutine μ½λ£¨ν΄)
Lerp μ¬μ©).Destroy λ‘ κ°μ²΄λ₯Ό λ©λͺ¨λ¦¬μμ μ κ±°νμ¬ μ±λ₯ μ νλ₯Ό λ§μ΅λλ€.| λ³μλͺ | νμ | μλ―Έ |
|---|---|---|
prefab | GameObject | μ¬μ μμ±λ μλ³Έ κ°μ²΄μ λλ€. μΈμ€νν°μμ λλκ·Ένμ¬ ν λΉν΄μΌ ν©λλ€. |
spawnRate | float | κ°μ²΄ μμ± κ°κ²© (μ΄) μ λλ€. μ: 0.1 μ΄λ©΄ 0.1 μ΄λ§λ€ μμ± μλ. |
nextSpawnTime | float | λ€μ μμ±μ΄ νμ©λλ μμ μ κ²μ μκ°μ λλ€. |
randomPos | Vector3 | κ°μ²΄κ° μμ±λ 무μμ 3 μ°¨μ μ’νμ λλ€. |
newObj / target | GameObject | μμ±λ κ°μ²΄ λλ μ λλ©μ΄μ μ λμμ΄ λλ κ°μ²΄μ μ°Έμ‘°κ°μ λλ€. |
finalScale | float | κ°μ²΄κ° μ΅λλ‘ μ»€μ§ λμ ν¬κΈ° λ°°μ¨μ λλ€. |
elapsed | float | μ λλ©μ΄μ μ΄ μμλ ν κ²½κ³Όν μκ°μ λλ€. |
1.
IEnumeratorμyield return(μ½λ£¨ν΄)
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
Prefab νλͺ©μ μμ±νκ³ μΆμ 3D κ°μ²΄ (μ: ꡬ, νλΈ λ±) λ₯Ό λλκ·Έν΄μΌ μλν©λλ€.spawnRate λ₯Ό λ무 μκ² (μ: 0.001) μ€μ νλ©΄ μμκ°μ μμ² κ°μ κ°μ²΄κ° μμ±λμ΄ μ»΄ν¨ν°κ° λ©μΆ μ μμΌλ μ£ΌμνμΈμ.if (target == null) : μ½λ£¨ν΄μ΄ μ€νλλ λμ€μ μΈλΆ μμΈ (λ€λ₯Έ μ€ν¬λ¦½νΈ λ±) μΌλ‘ κ°μ²΄κ° μμ λ μ μμ΅λλ€. μ΄λ target μ μ κ·Όνλ©΄ μλ¬κ° λλ―λ‘, λ§€ 루νλ§λ€ κ°μ²΄κ° μ‘΄μ¬νλμ§ νμΈνλ κ²μ΄ μ’μ μ½λ© μ΅κ΄μ
λλ€.