[Go-Unity] 5-2. 생성 함수 Instantiate 예제 ⭐⭐

업데이트:

카테고리:

태그: , ,


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 인곳은 스킵하여 반복문을 다시 실행한다.

image





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 변경

image

랜덤 아이템, 구조물에 참고





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초 뒤 삭제

image

몬스터 스폰에 참고





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)삭제

image

플레이어 투사제, 몬스터 추사체에 참고


참고 : 유니티 TOP


📔

댓글남기기