[골드메탈 BE4] 따라하기 3

배근철·2022년 7월 27일
0

GoldMetal BE4

목록 보기
3/11

✍ 적 비행기 생성을 위한 준비

  • 트리거 이벤트를 위해 Collider를 생성해주는데,
    원은 Circle, 사각형은 Box Collider를 생성해주면 되는데 삼각형은 딱히 맞는 Collider가 없으니,
    Polygon Collider를 적용해준다.
  • Polygon Collider는 스프라이트의 Physics Shape를 따라가기 때문에 에디터에서 Custom Physics Shape 모양을 잡고 Apply 시킨 후 Polygon Collider를 적용시킨다.


    위 그림처럼 Physics Shape를 조절 할 수 있다
  • 태그는 Enemy를 만들어서 적용시켜주고, rigidbody컴포넌트도 각각 추가시켜준다.

프리펩 생성

  • 먼저 Enemy.cs를 생성하고 , 변수로 비행기의 구성요소를 구체화 시킨다.
  • 변수가 준비되었으면 함수로 로직을 생성함.
  • 비행기는 시작과 동시에 아래로 돌진하게 Awake에서 velocity로 설정
  • 플레이어 총알에 맞았을 때 스프라이트 변경으로 표현
  • OnTriggerEnter2D를 통해 Enemy가 경계밖으로 나가면 Destroy시키고 플레이어에게 Health이상의 데미지를 입으면 Destroy시킨다.
  • 플레이어 총알이 Enemy에게 닿으면 플레이어 총알도 Destroy
  • 적끼리 부딪히지 않게 isTrigger 체크
  • 이렇게 스크립트 설정을하고 프리펩으로 저장 한 후 위치는 0으로 초기화 해준다.

Enemy.cs 코드

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

public class Enemy : MonoBehaviour
{
    public float speed;
    public int health;
    public Sprite[] sprites;


    SpriteRenderer spriteRenderer;
    Rigidbody2D rigid;


    private void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
        rigid = GetComponent<Rigidbody2D>();
        rigid.velocity = Vector2.down * speed;
    }

    void onDamaged(int dmg)
    {
        health -= dmg;
        spriteRenderer.sprite = sprites[1];
        Invoke("ReturnSprite", 0.1f);

        if (health <= 0)
            Destroy(gameObject);
    }

    void ReturnSprite()
    {
        spriteRenderer.sprite = sprites[0];
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "BorderBullet")
            Destroy(gameObject);

        else if(collision.gameObject.tag == "PlayerBullet")
        {
            Bullet bullet = collision.gameObject.GetComponent<Bullet>(); // collision.gameObject에서 GetComponent한다
            onDamaged(bullet.dmg);
            Destroy(collision.gameObject);
        }
    }
}

✍ 게임상에 적 생성하기

  • 적 생성을 관리 할 GameManager를 생성
  • 변수로 Enemy를 담을 GameObject배열과 적이 스폰될 위치를 담을 Transform배열 선언
  • 적이 생성 될 딜레이 시간을 표현 할 Delay 변수 선언
  • Random.Range() 함수를 통해 어떤 적이 어느 곳에서 생성 될지 구현
  • 생성될 적과 위치가 정해졌으면 Instantiate함수를 이용해 적을 게임상에 생성한다.
  • 여기서 스폰위치는 빈오브젝트를 생성해서 만든다.
  • 빈오브젝트를 Scene창에서 직관적으로 보고싶으면 태그를 달면 된다.


    태그를 달면 위와같이 빈오브젝트들이 보인다

GameManager.cs 코드

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

public class GameManager : MonoBehaviour
{
    public GameObject[] enemyObjs;
    public Transform[] spawnPoints;

    public float maxSpawnDelay;
    public float curSpawnDelay;

    void Update()
    {
        curSpawnDelay += Time.deltaTime;
        
        if(curSpawnDelay > maxSpawnDelay)
        {
            SpawnEnemy();
            maxSpawnDelay = Random.Range(0.5f, 3f);
            curSpawnDelay = 0;
        }

    }

    void SpawnEnemy()
    {
        int randomEnemy = Random.Range(0, 3);
        int spawnPoint = Random.Range(0, 5);

        Instantiate(enemyObjs[randomEnemy], spawnPoints[spawnPoint].position, spawnPoints[spawnPoint].rotation);
    }

}

출처 - https://www.youtube.com/c/GoldMetal

0개의 댓글