와이유스토리

[아르마딜로 대시] 3. 유니티 원형 탄막 생성 본문

프로젝트/게임

[아르마딜로 대시] 3. 유니티 원형 탄막 생성

유(YOO) 2021. 1. 6. 16:40

저번에 만들었던 Btn 스크립트와 토글 버튼을 이용하여 마우스 클릭하면 원형 탄막이 생성되는 작업을 진행했다.

 

Btn 스크립트 whyou-story.tistory.com/9

 

중요한 개념은 StartCoroutine과 Instantiate이다.

※ StartCoroutine(함수명)와 IEnumerator 함수명(매개변수)

마우스 클릭 시 1초가 지난 후, 탄막을 생성하고 싶어 코루틴 함수를 사용하였다.

yield return new WaitForSeconds(시간 초)를 IEnumerator 안에 사용하면 해당 시간초를 기다린 후 함수 내용이 실행된다.

※ Instantiate(오브젝트, 위치, 회전)와 Destroy(오브젝트)

마우스 클릭 시 마우스를 따라다니는 스프라이트인 스킬 범위를 화면에 그대로 찍고, 탄막을 새로 생성하기 위하여 사용하였다.

생성할 때 오브젝트의 Hierarchy를 지정하고 싶어 transform.SetParent를 사용하여 상위 오브젝트를 설정하였다.

삭제하고 싶을 때는 Destroy함수를 사용하면 된다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletFire : MonoBehaviour
{
    Btn bulletBtn;                 // 탄막 버튼 스크립트
    int selectNum = 0;                   // 탄막 선택 번호

    GameObject[] totalShot;              // 총 탄막(유닛 단위) 오브젝트
    int shotNum = 100;                   // 총 탄막 개수(마우스 클릭 횟수) 제한

    public GameObject MouseStamp;        // 마우스 스탬프 Hierarchy
    GameObject[] shot;                   // 마우스 스탬프 오브젝트
    Vector3[] mouseLocation;             // 마우스 클릭 위치
    
    public GameObject CircleBullet;      // 원형 탄막 Hierarchy
    GameObject[] circleBullet;           // 원형 작은 탄막 오브젝트
    public int circleBulletNum = 8;      // 원형 작은 탄막 개수
    
    void Start()
    {
        bulletBtn = GameObject.Find("BulletBtn").GetComponent<Btn>();
        totalShot = new GameObject[shotNum];
        shot = new GameObject[shotNum];
        mouseLocation = new Vector3[shotNum];
        circleBullet = new GameObject[circleBulletNum];
    }

    void Update()
    {
        if(Input.GetMouseButtonUp(0))            // 마우스 클릭
        {
            selectNum = bulletBtn.num;           // 탄막 선택 번호

            for(int i=0; i<shotNum; i++)
            {
                if(shot[i]==null)
                {
                    mouseLocation[i] = bulletBtn.followingMouse.transform.position;               // 마우스 위치

                    // 마우스 스탬프 생성
                    shot[i] = (GameObject)Instantiate(bulletBtn.followingMouse.transform.GetChild(selectNum).gameObject, mouseLocation[i], Quaternion.identity);
                    shot[i].transform.SetParent(MouseStamp.transform);
                    shot[i].transform.localScale = new Vector3(1f, 1f, 1f);
                    shot[i].SetActive(true);

                    StartCoroutine(bulletFire(selectNum, i));

                    break;
                }
            }
        }
    }

    IEnumerator bulletFire(int n, int shotNum)   // 탄막 발생
    {
        yield return new WaitForSeconds(1);      // 탄막 로딩 시간

        Destroy(shot[shotNum]);                  // 마우스 스탬프 삭제
        
        if (n == 0)
        {
            // 원형 탄막 유닛 생성
            totalShot[shotNum] = (GameObject)Instantiate(CircleBullet.transform.GetChild(0).gameObject, mouseLocation[shotNum], Quaternion.identity);
            totalShot[shotNum].transform.SetParent(CircleBullet.transform);
            totalShot[shotNum].SetActive(true);

            // 원형 작은 탄막 생성
            for (int i = 0; i < circleBulletNum; i++)
            {
                circleBullet[i] = (GameObject)Instantiate(totalShot[shotNum].transform.GetChild(0).gameObject, mouseLocation[shotNum], Quaternion.identity);
                circleBullet[i].transform.SetParent(totalShot[shotNum].transform);
                circleBullet[i].SetActive(true);
            }
        }
    }
}
Comments