안 쓰던 블로그

unity 슈팅게임 총알 5개 한 번에 쏘는 방법(GetComponentsInChildren) 본문

유니티/개발

unity 슈팅게임 총알 5개 한 번에 쏘는 방법(GetComponentsInChildren)

proqk 2020. 2. 4. 19:23
반응형

슈팅 게임에서 총을 한 번에 하나만 쏘진 않음

다른 방향으로 한 번에 다섯개를 쏘게 하고 싶을 땐 어떻게 해야 할까?

이런 모습으로 총알이 나갔으면 좋겠다

 

 

1. 총알 준비

파란 캡슐 모양 총알을 준비했다

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

public class Bullet_Enemy : MonoBehaviour
{
    public float speed = 10;

    void Update()
    {
        Vector3 dir = transform.up;
        transform.position += dir * speed * Time.deltaTime;
    }
}

총알은 생성되는 순간 계속 앞을 향해 나아감

사진에서는 DestroyManager가 있는데 총알이 플레이어에 닿았을 때~ 그런 충돌 매니저 스크립트라서 패스

 

 

2. 총알 5개를 묶은다

빈 오브젝트 하나 생성

아까 만든 총알을 4개 더 복사해서 하나로 묶어준다

총알은 앞으로만 나가니까 방향을 여기서 조절해준다

나는 이런 식으로 했음

그리고 전체를 Prefab로 만들어버림(에셋 있는 곳에 게임 오브젝트를 끌어오면 된다)

 

 

 

3. 코딩

총알을 쏘는 오브젝트에 새스크립트를 붙여준다

 

일단 총알 1개 쏠 때를 생각해보자

나는 총알 쏘는 구조를 이런 식으로 했음

총알을 쏘는 순간(마우스 클릭) 총알 공장에서 총알 하나를 가져와(총알 오브젝트 사본=클론) 쏘는 오브젝트의 총구 위치(빈 오브젝트)에 위치한다

그러면 총알 클론은 생성되자마자 앞을 보고 돌진함(총알 발사)

 

그러면 총알 5개를 쏘려면 어떡게 할까?

단순히 생각하면 총구 위치를 5개 놓는 방법이 있는데, 그러면 옆을 보고 있을 때도 위로만 발사될 것이다

나는 오른쪽 그림처럼 하고 싶어서 총구 위치 5개는 안 됨

 

다른 방법으로는 하나의 총구에서 그냥 총알이 5개 나가게 하는 방법이 있다

그래서 위에 2번에서 하나의 빈 오브젝트에 총알 5개를 묶은 것

1개 쏠 때처럼 5개 묶음을 총구 위치에 놓고 각각 방향으로 총알이 나가기만 하면 됨

 

정리하면 이렇게 된다

총알을 쏘는 순간(마우스 클릭) 총알 공장에서 총알 묶음을 가져와(총알 오브젝트 사본=클론) 쏘는 오브젝트의 총구 위치(빈 오브젝트)에 위치해서 부모-자식 관계를 끊는다(총알 5개 독립적인 존재가 됨)

그러면 총알 클론은 생성되자마자 각자의 앞을 보고 돌진함(총알 5방향 발사)

 

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

public class EnemyIdle_Boss : MonoBehaviour
{
    public float speed = 10f; //이동속도
    public GameObject target; //플레이어 위치

    public Transform firePosition_Enemy; // - 총구위치
    public GameObject bulletPackageFactory; // - 총알공장

    public void shoot()
    {
        GameObject bulletPackage = Instantiate(bulletPackageFactory); //반환값은 게임오브젝트

        bulletPackage.transform.position = firePosition_Enemy.position; //총알 묶음이 나갈 곳은 총구 위치
        bulletPackage.transform.up = (target.transform.position - firePosition_Enemy.position).normalized; //앞 방향을 타겟을 향해 조정(플레이어를 보고 발사하기 위한 코드)

        Transform[] childs = bulletPackage.GetComponentsInChildren<Transform>(); //총알 묶음에서 자식 5개를 가져옴

        for (int i=0; i< childs.Length; i++) //각 총알의 부모-자식 관계를 끊어줌
        {
            childs[i].parent = null;
        }
        Destroy(bulletPackage); //총알을 묶고 있던 빈 오브젝트를 삭제
    }
}

 

완성된 모습

FirePosition은 그냥 빈 오브젝트임

아까 만든 총알 묶음 prefab를 넣어줌

플레이어를 향해 발사하는 코드가 있으니까 플레이어를 타겟으로 잡아줌

 

 

실행시켜 보면 총알이 잘 발사되는 것이 보인다

 

반응형
Comments