유니티/인생유니티교과서

34-40 총알쏘는 Enemy 만들기

SUGI_ 2022. 7. 14. 02:12

34 총알쏘는 Enemy 만들기

35 EnemyShooter 클래스 생성 및 Start 함수 정리

36 적 총알 발사

37 적 총알과 플레이어 충돌처리 1

38 적 총알과 플레이어 충돌처리 2

39 적 총알과 DestroyZone 충돌처리

40 총알 사운드 적용하기


동적 리소스 만들기  - Resources 폴더 (빌드는 필요파일만 가져오지만 리소스폴더에 넣게 되면 제거를 해주지 않는다 / 코드 상에서 동적으로 리소스 해야하는 것들만 넣기)

Resources.Load 함수 https://learnandcreate.tistory.com/753

 

유니티에서 Resources.Load 함수를 사용하여 에셋 로드하기

유니티에서 Resources.Load 함수를 사용하여 에셋 로드하기 Resource 폴더는 유니티가 특별한 목적으로 예약한 폴더 중 하나로 해당 폴더에 에셋을 위치시키면 load함수를 사용하여 불러오기할수있

learnandcreate.tistory.com

Build 빌드  : 실행할 수 있는 파일로 만든다 (expt , apk) -> 내부 테스트를 하겠다


적 -> 총알을 쏘게 만든다

보스 총알 패턴은 어떻게 만드는가

 

적 총알 

- mission 1-

50% 확률로 타겟쪽으로 총알을 쏘는 적을 만든다.

1. 새로운 적을 만든다 (총알을 쏘는 적)

2. EnemyGOD가 50% 확률로 1번 적을 만든다.

 

1. 적이 총알을 쏘게 하고 싶다 

(구현)

1. Enemy Perfab 가져온다.

2. Prefab Unpack (부모만 끊기) -  Prefab 재활용 할 수 있다.

3. 새로운 비행기 Prefab Model을 넣고 기존 Prefab의 Copy Component를 한다 -> Paste Component Values

4.  Enemy Script 복제 - EnemyShooter 생성 (Class name 변경)

5.  PlayerFire Script 에서 가져온 코드 - GameObject bullet = Instantiate(bulletFactory);

//아래로 계속 이동하고 싶다.
//필요속성 : 이동속도
//타겟을 따라다니기
//필요속성 : 타겟
//죽을 때 폭발효과를 발생시키고 싶다.
//필요속성 : 폭발효과 공장
public class LHS_EnemyShooter : MonoBehaviour
{
    // 필요속성 : 이동속도
    public float speed = 5;
    // 필요속성 : 타겟
    public Transform target;
    // 방향
    Vector3 dir;
    // 필요속성 : 폭발효과 공장
    GameObject explosionFactory;

    void Start()
    {
        // 동적으로 폭발효과를 로딩하고 싶다.
        explosionFactory = (GameObject)Resources.Load("Prefabs/Explosion");

        // 방향 설정하기 - 방향 함수 선언
        SetDirection();

        // 총알 쏘기
        ShootBullet();
    }

    // 1. 방향을 정한다
    void SetDirection()
    {
        GameObject player = GameObject.Find("Player");
        // 만약 타겟이 있다면
        // if(Player != null)
        if (player)
        {
            target = player.transform;
            // 70% 확률로 아래로 방향을 잡고
            // 1. 확률을 구해야 한다.
            int randomic = Random.Range(0, 10);

            // 타겟 방향으로 설정하기
            // 2. 확률이 70%에 속했으니까
            if (randomic < 7)
            {
                dir = Vector3.down;
            }
            // 그렇지 않으면
            else
            {
                //타겟쪽으로
                dir = target.position - transform.position;
                dir.Normalize();
            }
        }
        else
        {
            dir = Vector3.down;
        }
    }

    // 타겟쪽으로 총알을 발사하고 싶다.
    // 필요속성 : 총알공장
    public GameObject bulletFactory;
    void ShootBullet()
    {
        // 만약 타겟이 없으면 총알 안쏜다
        if (target == null)
        {
            return;
        }

        // 타겟쪽으로 총알을 발사하고 싶다.
        GameObject bullet = Instantiate(bulletFactory);
        // 총알의 방향을 구하고
        Vector3 dir = target.position - transform.position;
        // 총알을 타겟 방향으로 회전시켜주기
        bullet.transform.up = dir;
        // 총알이 생성될 위치 지정
        bullet.transform.position = transform.position;
    }

    // 2. 이동하고 싶다
    // P = P0 + vt
    void Update()
    {
        transform.position += dir * speed * Time.deltaTime;
    }

    // 다른 물체와 부딪혔을 때 걔도 죽고 나도 죽고

    private void OnCollisionEnter(Collision collision)
    {
    	// 폭발효과 발생시키기
		GameObject explosion = Instantiate(expolosionFactory);
        explosion.transfrom.position = tranfrom.position;
        
        // 만약 부딪힌 녀식이 Bullet이라면
        if (collision.gameObject.name.Contains("Bullet"))
        {
        	// 탄창에 집어 넣고 싶다.
            // PlayerFire에 있는 탄창에 총알을 넣어줘야한다.
            // 1. Player 게임 오브젝트가 필요하다
            // 2. PlayerFire 가 필요하다
            PlayerFire player = target.GetComponent<PlayerFire>();
            // 3. 탄창에 총알을 넣어준다
            player.bulletPool.Add(collision.gameObject);
            collision.gameObject.SetActive(false);
         }
         else
         {
         	PlayerHealth.Instance.HP--;
         }
         Destroy(gameObject);
	}
}

6. 총알 만들기 Cube (EnemyBullet)

7. 총알 Script (EnemyBullet)

// 자기가 향하는 방향으로 이동하고 싶다.
public class LHS_EnemyBullet : MonoBehaviour
{
    public float speed = 5;

    void Start()
    {

    }

    void Update()
    {
        // 지가 향하는 방향으로 이동하고 싶다.
        // P = PO + vt
        transform.position += transform.up * speed * Time.deltaTime;
    }
}

8. EnemyBullet - Prefab으로 만들기

9. Enemy에 EnemyShooter Script 붙이고 EnemyBullet 넣기

10. Enemy와 EnemyBullet 충돌을 하면 안됨  -> EnemyBullet - Layer(Enemy로 변경)

<발생오류> 30% 확률로 target을 향해 감으로 target으로 이동할 시 총알과 같이 이동하는 것처럼 보인다

-> 개인 :  방향 정하는 코드 변경 (아래로만 간다) 

-> 강사님 : EnemyBullet 속도를 올린다

 

2. 적 총알과 플레이어가 닿으면 충돌하고 싶다

1. EnemyBullet에 rigidbody 붙여준다. (Use Gravity는 끄기)

2. EnemyBullet Script - Enemy 폭발효과 가져오기

// Enemy 폭발효과
private void OnCollisionEnter(Collision collision)
    {
    	// 폭발효과 발생시키기
		GameObject explosion = Instantiate(expolosionFactory);
        explosion.transfrom.position = tranfrom.position;
	}

3.  EnemyBullet Script

// 자기가 향하는 방향으로 이동하고 싶다.
public class LHS_EnemyBullet : MonoBehaviour
{
    public float speed = 5;
    
    Public GameObject explosionFactory;

    void Start()
    {

    }

    void Update()
    {
        // 지가 향하는 방향으로 이동하고 싶다.
        // P = PO + vt
        transform.position += transform.up * speed * Time.deltaTime;
    }
    
	 // Enemy 폭발효과
    private void OnCollisionEnter(Collision collision)
    {
        // 폭발효과 발생시키기
        GameObject explosion = Instantiate(expolosionFactory);
        explosion.transform.position = transform.position;

        // 너도 죽고 나도 죽고
        Destroy(collision.gameObject);
        Destroy(gameObject);
    }
}

4. EnemyBullet - Explosion Factory 넣기

 

3. EnemyGOD가 50% 확률로 1번 적을 만든다

1. 내가 만든 총알을 Prefabs로 만든다

2. EnemyGOD에서 EnemyFactory를 Enemy로 할 것 인지 / LHSEnemy로 할 것인지 선택할 수 있게 만들어야 한다

3. EnemyGOD Scripts

728x90