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(0, 2) == 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(0, 2) == 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 |