전글과 동일하게 적 전투기 오브젝트를 프리펩으로 저장합니다.
Enemy 스크립트를 하나 생성하고 적 전투기들 프리펩에 넣어줍니다.
//Components
Rigidbody2D rigid;
SpriteRenderer spriteRenderer;
//Vars
public float speed;
public int health;
//Sprites
public Sprite[] sprites;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
rigid.velocity = Vector2.down * speed; //적 전투기가 아래로 향하게
}
void onHit(int dmg) { //피격 함수
//Health Down
health -= dmg;
//Sprite Change
spriteRenderer.sprite = sprites[1];
//Return to Normal State
Invoke("returnSprite", 0.3f);
//Enemy Die
if (health <= 0) Destroy(gameObject);
}
void returnSprite() { //노멀상태로 돌아가는 함수
spriteRenderer.sprite = sprites[0];
}
void OnTriggerEnter2D(Collider2D collision) //콜라이더 충돌
{
if (collision.gameObject.tag == "BorderBullet") { //적 전투기가 맵 밖으로 나갔을때
Destroy(gameObject);
}
else if (collision.gameObject.tag == "PlayerBullet") { //적 전투기가 플레이어의 총알을 맞았을때
Bullet bullet = collision.gameObject.GetComponent<Bullet>(); //플레이어 스크립트 불러오기
onHit(bullet.dmg);
Destroy(collision.gameObject); //플레이어 총알 삭제
}
}
각각의 적 전투기 프리펩에 Speed와 Health를 입력해주고, 피격 시 스프라이트 교체를 위해, 스프라이트 이미지 배열을 맵핑해줬습니다.
플레이어의 총알 데미지 만큼 체력이 깎이는 로직이기 때문에, Bullet 스크립트 상단에 dmg 변수를 추가해 총알의 데미지를 설정해 줍니다.
public int dmg; // 총알 데미지 변수 추가
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "BorderBullet") {
Destroy(gameObject);
}
}
중간 점검
이제 적 전투기 스폰을 구현해 보겠습니다.
게임 매니저 오브젝트를 하나 만들고 게임매니저 스크립트를 넣어줍니다.
여기에 두 배열이 있는데, EnemyObjs는 적 전투기 3개의 프리펩을 맵핑해줍니다.
SpawnPoint는 적 전투기가 생성될 위치인데, 아래와 같이 빈 오브젝트 안 5개의 빈 오브젝트를 위치만 지정해주고 맵핑해줍니다. MaxSpawnDelay는 아무 숫자나 입력해줍니다.
이제 게임 매니저 로직을 작성합니다.
public GameObject[] enemyObjs;
public Transform[] spawnPoint;
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() {
//Enemy Spawn
int ranEnemy = Random.Range(0, 3); //적 전투기 선택 난수
int ranPoint = Random.Range(0, 5); //적 전투기 생성 위치 선택 난수
GameObject enemy = Instantiate(enemyObjs[ranEnemy], spawnPoint[ranPoint].position, spawnPoint[ranPoint].rotation);
}
난수를 배열 내 인덱스 번호로 사용해, 적 전투기와 생성 위치가 랜덤으로 지정되게 작성했습니다.
적 전투기 스폰 시간도 랜덤으로 해서 스폰 주기가 불규칙하게 작성했습니다.
결과
'종스크롤 슈팅게임(1942)' 카테고리의 다른 글
6. 아이템과 필살기 구현하기 (0) | 2022.01.20 |
---|---|
5. 간단한 UI 만들기 (0) | 2022.01.19 |
4. 적 전투기 총알 & 플레이어 피격 이벤트 구현 (0) | 2022.01.18 |
2. 플레이어 총알 구현 (0) | 2022.01.18 |
1. 플레이어 이동 & 맵 경계선 설정 (0) | 2022.01.17 |