random ์์น์์ randomํ ๋๋ฌผ๋ค์ด ์์ฑ๋์ด ๋๋ถ์๊ฒ ๋ฐ์ด๋ ๋ค. ๋๋ถ๋ ์ข์ฐ๋ก ์ด๋ํ๋ฉฐ ๋๋ฌผ๋ค์๊ฒ ๋จน์ด๋ฅผ ์ค์ผ ํ๋ค.
1. Player x ๊ฐ ์ ํํ๊ธฐ
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private const float SPEED = 10f;
private const float X_RANGE = 13f;
private float horizontalInput;
void Update(){
//keep the player in the bounds
if (transform.position.x > X_RANGE) transform.position = new Vector3(X_RANGE, transform.position.y, transform.position.z);
else if (transform.position.x < -X_RANGE) transform.position = new Vector3(-X_RANGE, transform.position.y, transform.position.z);
horizontalInput = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * Time.deltaTime * SPEED * horizontalInput);
}
}
Update() ๋ฌธ์์ Player์ x๊ฐ์ ํ์ธํด์ Player๊ฐ ํ๋ฉด ๋ฐ์ผ๋ก ๋ฒ์ด๋์ง ๋ชปํ๋๋ก x๊ฐ์ ์ ํํ ์ ์๋ค.
์ฐธ๊ณ ) ์์๊ฐ์ ๊ทธ๋๋ก ๋ฃ์ง ๋ง๊ณ ๊ผญ ๋ณ์๋ก ๋นผ์ ์ง๊ด์ ์ผ๋ก ๊ด๋ฆฌํ์. ์ค๋ฅ๊ฐ ์๋๋ก!
์ฃผ์์ ์ต๊ดํํ์.
2. ์์ Prefab ๋ง๋ค์ด์ Player ์์น์์ ๋ฐ์ฌํ๊ธฐ.
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private const float SPEED = 10f;
private const float X_RANGE = 13f;
private float horizontalInput;
[SerializeField] GameObject projectilePrefab;
void Update(){
//keep the player in the bounds
if (transform.position.x > X_RANGE) transform.position = new Vector3(X_RANGE, transform.position.y, transform.position.z);
else if (transform.position.x < -X_RANGE) transform.position = new Vector3(-X_RANGE, transform.position.y, transform.position.z);
horizontalInput = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * Time.deltaTime * SPEED * horizontalInput);
//Lauch a projectile from the player
if (Input.GetKeyDown(KeyCode.Space)) Feed();
}
void Feed() {
Instantiate(projectilePrefab, transform.position, Quaternion.identity);
}
}
projectilePrefab์ ์ ์ธํ๊ณ inspector์์ prefab์ ์ฐ๊ฒฐํด์ค ํ, Instrantiate ํจ์๋ก Prefab์ ์์ฑํ ์ ์๋ค.
Instantiate ํจ์์ ํํ๋ ์์ ๊ฐ์๋ฐ, ์ธ์๋ Object, position, rotation ๊ฐ์ ๋ฃ์ด์ค์ผ ํ๋ค. parent์ ์์์ผ๋ก๋ ์ง์ ํ ์ ์์.
3. Prefab ๋ณ๊ฒฝ์ฌํญ ๋ชจ๋ Prefab์ ์ ์ฉํ๊ธฐ
Prefab Inspector ์๋จ์ Overrides ํด๋ฆญ > Applay All ํด๋ฆญ.
3. ๋๋ฌผ์์ฑ ์์น์ ๋๋ค๊ฐ ์ ์ฉํ๊ธฐ
using UnityEngine;
public class SpawnManager : MonoBehaviour
{
[SerializeField] private GameObject[] animalPrefabs;
private void Update() {
if (Input.GetKeyDown(KeyCode.S)) {
int animalIndex = Random.Range(0, animalPrefabs.Length);
int randomX = Random.Range(-13, 13);
Instantiate(animalPrefabs[animalIndex], new Vector3(randomX, 0, 20), animalPrefabs[animalIndex].transform.rotation);
}
}
}
//์ ์
public static float Range(float minInclusive, float maxInclusive);
SpawnManager ํด๋์ค ๋ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ณต์ ์์ฑํ ๋๋ฌผ ๋ฐฐ์ด์ ๊ฐ๊ณ ์๊ณ Random.Range() ํจ์๋ก randomํ ๋๋ฌผ์ random ์์น์ ์์ฑํ๋๋ก ํ ์ ์๋ค. minInclusive๋ ์ต์๊ฐ, maxInclusive๋ ์ต๋๊ฐ์ ์๋ฏธํ๋ค.
float์ ๊ฒฝ์ฐ ์ต์, ์ต๋๊ฐ์ด random ์์ ํฌํจ๋์ง๋ง, int ๊ฐ์ ๊ฒฝ์ฐ ์ต์๊ฐ์ ํฌํจ๋๊ณ ์ต๋๊ฐ์ ํฌํจ๋์ง ์๋๋ค.
//์คํ์ด์ค๋ฐ ๋๋ฅธ ์๊ฐ
Input.GetKeyDown(KeyCode.Space)
//์คํ์ด์ค๋ฐ ๋๋ฅด๋ ์ค
Input.GetKey(KeyCode.Space)
//์คํ์ด์ค๋ฐ์์ ์๋ผ๋ ์๊ฐ
Input.GetKeyUp(KeyCode.Space)
Input์ GetKeyDown, GetKey, GetKeyUp ํจ์ ์๋ฏธ๋ ์์ ๊ฐ๋ค.
4. Isometric View vs Top View
Isometric ๋ทฐ๋ ์์ง ์์์ ๋ฐ๋ผ๋ณด๋ ํ๋ฉด์ผ๋ก 2D ํํ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์ผ์ชฝ Top VIew, ์ค๋ฅธ์ชฝ Isometric ๋ทฐ
Scene ๋ทฐ ์ค์ ์์ Isometric์คฌ๋๊ฑธ Game๋ทฐ์์๋ ์ ์ฉํ๊ณ ์ถ์ผ๋ฉด Camera ์์ projection ๊ฐ์ Orthographic ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
5. ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๋๋ฌผ ์์ฑํ๊ธฐ
using UnityEngine;
public class SpawnManager : MonoBehaviour
{
[SerializeField] private GameObject[] animalPrefabs;
private const float START_DELAY = 2f;
private const float SPAWN_INTERVAL = 1.5f;
private void Start() {
InvokeRepeating("SpawnAnimal", START_DELAY, SPAWN_INTERVAL);
}
private void SpawnAnimal() {
int animalIndex = Random.Range(0, animalPrefabs.Length);
int randomX = Random.Range(-13, 13);
Instantiate(animalPrefabs[animalIndex], new Vector3(randomX, 0, 20), animalPrefabs[animalIndex].transform.rotation);
}
}
public void InvokeRepeating(string methodName, float time, float repeatRate);
Update()๋ฌธ์์ s ํค๋ฅผ ๋๋ฌ์ ์์ฑํ๋ ๋๋ฌผ์ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์์ฑ๋๋๋ก ๋ณ๊ฒฝํ๋ค.
InvokeRepeating(ํธ์ถํ ๋ฉ์๋ ์ด๋ฆ, ์์ ์ง์ฐ์๊ฐ, ๋ฐ๋ณต ๊ฐ๊ฒฉ) ํจ์๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค.
6. ๋๋ฌผ๊ณผ ๋จน์ด์ ์ถฉ๋ํจ๊ณผ ์ฃผ๊ธฐ
๋๋ฌผ์๋ Box Collider ๋ง ์ถ๊ฐํ๋ค.
Collider ํฌ๊ธฐ๋ Size๋ก ์กฐ์ ํ ์๋ ์๊ณ Edit Collider ๋ฒํผ์ ํตํด GUI๋ก ์ฝ๊ฒ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์์.
๋จน์ด์๋ ์ถฉ๋ ๊ฐ์ง๋ฅผ ์ํ Box Collider ์ ์ค๋ ฅ ํด์ ๋ฅผ ์ํ Rigidbody๋ฅผ ์ถ๊ฐํ๋ค.
์ด๋ ๋จน์ด๊ฐ ์๋๋ก ๋จ์ด์ง์ง ์๊ณ ์์ผ๋ก ์ญ ๋์๊ฐ๊ธธ ์ํ๋ฏ๋ก Rigidbody์ Use Gravity ์์ฑ์ ํด์ ํ๋ค.
using UnityEngine;
public class DetectCollisions : MonoBehaviour {
private void OnTriggerEnter(Collider other) {
Destroy(gameObject);
Destroy(other.gameObject);
}
}
๋๋ฌผ๊ณผ ๋จน์ด ๊ฐ์ฒด์ DetectCollisions ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๋ค.
OntriggerEnter(Collider other) ํจ์๋ก ์ถฉ๋์ ์ธ์งํ๋ค. ์ถฉ๋ ์, DetectCollisions ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด(gameObject)์ ์ถฉ๋ํ ๊ฐ์ฒด(other) ๋ชจ๋ ์ ๊ฑฐ๋๋ค.