✍ 적 비행기 생성을 위한 준비
- 트리거 이벤트를 위해 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