본문 바로가기

Unity

Unity - 스폰(Spawn) 구현하기

1. 구현방법 생각하기

1) 스폰할 위치 정하기

 -> 무엇을 기준으로 위치를 정할 것인가 (플레이어? 콜라이더중심?)

2) 랜덤으로 위치 뽑기

 -> 어떻게 랜덤으로 뽑을 것인가 (원? 박스?)

3) 생성하기

 -> 효율적인 방법은 무엇일까 (자주 생성되어야 하나? 오브젝트풀러?)

 

 

2. 구현

- 스폰할 위치 정하기

 

임의로 정함

 

본인은 플레이어(카메라) 중심으로 두고 일정한 거리(원)에서 적을 스폰하려 함

 

 

 

- 랜덤으로 위치 뽑기

 

플레이어 중심 기준 반지름(radius) 3인 원에서 뽑으려 함

 

방정식으로 간단하게 구현하면 됨 >>> x² + y² = 9

 

 

먼저 x값을 뽑은 후 방정식으로 y값 뽑으면 됨

 

x값은 -radius<= x <= radius 임 여기서 하나 뽑음 (Random.Range(-radius, radiusf)); 

 

 

하지만 player가 움직이면 원의 중심이 이동함

 

그에 따른 평행이동 해주면 됨 >>> (x-a)² + (y-b)² = 9

 

x값은 -radius + a <= x <= radius + a 임 여기서 하나 뽑음 (Random.Range(-radius + a, radius + a));

 

y값은 방정식 대로 구해주면 됨

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public Vector3 GetRandomPosition()
    {
        float radius = 3f;
        Vector3 playerPosition = transform.position;
 
        float a = playerPosition.x;
        float b = playerPosition.y;
 
        float x = Random.Range(-radius + a, radius + a);
        float y_b = Mathf.Sqrt(Mathf.Pow(radius, 2- Mathf.Pow(x - a, 2));
        y_b *= Random.Range(02== 0 ? -1 : 1;
        float y = y_b + b;
 
        Vector3 randomPosition = new Vector3(x, y, 0);
 
        return randomPosition;
    }
cs

 

 

- 생성하기

 

생성하는 방법은 두가지

 

1. Instantiate하기

2. ObjectPooler 에서 가져오기

 

편의상 Instantiate로 구현함

1
2
3
4
5
6
public GameObject enemy;
private void Start()
{
    for(int i=0; i<1000; i++)
        Instantiate(enemy, GetRandomPosition(), Quaternion.identity);
}
cs

 

 

3. 결과

시작 전 (Start() 호출 전)

 

시작 후 (Start() 호출 후)

 

위치 변경 후 (position == (3, 3) 로 이동)

 

 

 

4. 전체코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Spawn : MonoBehaviour
{
    public GameObject enemy;
    private void Start()
    {
        for(int i=0; i<1000; i++)
            Instantiate(enemy, GetRandomPosition(), Quaternion.identity);
    }
    public Vector3 GetRandomPosition()
    {
        float radius = 3f;
        Vector3 playerPosition = transform.position;
 
        float a = playerPosition.x;
        float b = playerPosition.y;
 
        float x = Random.Range(-radius + a, radius + a);
        float y_b = Mathf.Sqrt(Mathf.Pow(radius, 2- Mathf.Pow(x - a, 2));
        y_b *= Random.Range(02== 0 ? -1 : 1;
        float y = y_b + b;
 
        Vector3 randomPosition = new Vector3(x, y, 0);
 
        return randomPosition;
    }
}
 
cs

 

 

 

 

=== 참고 ===

 

1. 아주 기초적인 구현임 -> 다른 것도 거의 비슷하므로 응용임

 

2. rotation이 필요하면 randomPosition 과 centerPosition 사이의 벡터를 구하여 각도를 구한다음 회전시키면 됨

   3D라도 똑같음 z만 추가됐을 뿐임 (원이 아니라 구)

 

3. 하늘에서 떨어지는 블록같은 경우(amazing bowling) Collider 활용해서 Collider.size로 하면 더욱 편리함

float posX =  collider.position.x + (-Collider.size.x/2 ~ Collider.size.x/2)

float posY =  collider.position.y + (-Collider.size.y/2 ~ Collider.size.y/2)

float posZ =  collider.position.z + (-Collider.size.z/2 ~ Collider.size.z/2)

 

 

 

 

'Unity' 카테고리의 다른 글

Unity - 인디케이터(Indicator)구현  (0) 2020.02.19
Unity - 총알 구현하기(Bullet)  (0) 2020.02.17
Unity - 조이스틱(Joystick)  (0) 2020.02.15
Unity - 무한 배경(Loop Background)  (2) 2020.02.12
Unity Asset Store 세일  (0) 2019.11.11