[Go-Unity] 5-2. 생성 함수 Instantiate 예제 ⭐⭐
카테고리: Go Unity
Prefab, Instantiate , spawner스포너, 총알(bullet)
공부한 고박사의 유니티 기초를 복습하면서 정리.
1. 예제1 반복문을 활용한 X자
SpawnerEx.cs
public class SpawnerEx : MonoBehaviour
{
[SerializeField]
private GameObject boxprefab;
private void Awake() {
Quaternion rotation = Quaternion.Euler(0,0,0);
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
if ( x == y || x+y==9 )
{
continue;
}
Vector3 position = new Vector3(-4.5f +x,4.5f-y,0);
Instantiate(boxprefab,position,rotation);
}
}
}
}
- x,y 10크기로 프리팹을 생성하여 판을 만든다.
- x = y ( 우하향 대각선 ), x + y = 9 ( 우상향 대각선 ) 를 만족하면
- continue를 실행하여 x = y 인곳은 스킵하여 반복문을 다시 실행한다.
2. 예제2 랜덤 생성
randomprefab.cs
public class randomprefab : MonoBehaviour
{
[SerializeField]
private GameObject[] prefabArray;
[SerializeField]
private int number;
private void Awake() {
for (int i = 0; i < number; i++)
{
//Random.Range(min,max) min~max-1의 정수중 임의의 순자를 저장
int index = Random.Range(0, prefabArray.Length); // 모양
float x = Random.Range(-7.5f,7.5f); //랜덤 x 위치
float y = Random.Range(-4.5f,4.5f); //랜덤 y 위치
Vector3 position = new Vector3(x,y,0);
GameObject clone =Instantiate(prefabArray[index], position, Quaternion.identity);
clone.GetComponent<SpriteRenderer>().color = Color.black;
}
}
}
- index : 모양 랜덤으로 확인
- x , y : 랜덤 생성할 범위 (x : -7.5 ~ 7.5) (y : -4.5 ~ 4.5)
- Colne : Instantiate ( 오브젝트, 위치, 회전 );
- GetComponent
().color : 오브젝트의 컴포넌트 color 변경
랜덤 아이템, 구조물에 참고
3. 예제3 스포너 만들기
spawnPointer.cs
public class spawnPointer : MonoBehaviour
{
[SerializeField]
private int maxcount = 10; //개수제한
[SerializeField]
private GameObject[] prefabArray; //모양
[SerializeField]
private Transform[] spawnPointArray;
private float timer; //시간체크
[SerializeField]
private float waittime = 1.0f; //스폰주기
private int currentcount = 0;
private Vector3 moveDirection ;
private void Awake() {
timer = 0.0f;
int prefabIndex = Random.Range(0, prefabArray.Length); //모양
int spawnIndex = Random.Range(0, spawnPointArray.Length); //스폰위치
Vector3 position = spawnPointArray[spawnIndex].position; //위치
}
// Update 로 주기적으로 생성
void Update()
{
if (currentcount +1 > maxcount) //개수제한
{
return;
}
int prefabIndex = Random.Range(0, prefabArray.Length); //모양
int spawnIndex = Random.Range(0, spawnPointArray.Length); //스폰위치
Vector3 position = spawnPointArray[spawnIndex].position;
timer += Time.deltaTime; //시간 체크
if (timer > waittime)
{
GameObject clone =Instantiate(prefabArray[prefabIndex], position, Quaternion.identity);
moveDirection = (spawnIndex == 0 ? Vector3.right : Vector3.left);
clone.GetComponent<prefabMove>().setup(moveDirection);
clone.GetComponent<SpriteRenderer>().color = Color.black;
currentcount ++;
timer = 0; //시간 초기화
Destroy(clone, 20); //X초 뒤 삭제
}
}
}
- 두 스폰 포인트에서 랜덤으로 생성
- GameObject clone =Instantiate(프리팹, 위치, 회전);
- moveDirection = spawnIndex == 0 이면 Vector3.right 아니면 Vector3.left
- .setup(moveDirection); : 방향지정
- 색, 시간주기, x초 뒤 삭제
몬스터 스폰에 참고
4. 예제4 player 총알 생성,발사하기
PlayerShot.cs
public class PlayerShot : MonoBehaviour
{
[SerializeField]
private KeyCode keyCodeFire = KeyCode.Space;
[SerializeField]
private GameObject Bulletprefab; //circle
[SerializeField]
private GameObject test; //이펙트 테스트
private float moveSpeed = 5.0f;
private Vector3 lastMoveDirection = Vector3.right;
private void Update() {
float x = Input.GetAxisRaw("Horizontal"); //좌우 이동
float y = Input.GetAxisRaw("Vertical"); //위아래 이동
// 방향으로 이동
transform.position += new Vector3(x,y,0) * moveSpeed * Time.deltaTime;
// 마지막 방향으로 총알 발사
if (x !=0 || y !=0)
{
lastMoveDirection = new Vector3(x,y,0); //마지막 움직임 방향
}
if (Input.GetKeyDown(keyCodeFire) )
{
GameObject clone = Instantiate(Bulletprefab,transform.position,Quaternion.identity);
clone.name = "bullet";
clone.transform.localScale=Vector3.one*0.5f;
clone.GetComponent<SpriteRenderer>().color = Color.black;
clone.GetComponent<prefabMove>().setup(lastMoveDirection); // bullet 방향 설정
Destroy(clone, 10);
}
}
}
- 이동, 바라보는 방향으로 총알 발사.
- lastMoveDirection : 바라보는 방향 지정
- 총알생성, (name)이름, (localScale)크기, (color)색상,
- setup(lastMoveDirection)방향설정 ,(Destroy)삭제
플레이어 투사제, 몬스터 추사체에 참고
댓글남기기