비행기 게임을 보면 다양한 형태의 총알(무기)을 탑재하고 있고 적에게 들어가는 데미지도 다르다.
여러개의 bullet 프리팹을 추가하여 무기의 형태 및 성능을 강화해보겠다.
먼저 다양한 bullet sprite 중에 사용하고자 하는 sprite이미지를 선정하고 prefab화 시켜주자.
이전에 만들었던 기본 bullet에 속한 컴포넌트들을 똑같이 지정해 주었다. sprite를 씬 뷰로 옮겨논 후 transform을 reset(좌표값 0,0,0) / box collider 2D, IsTrigger 체크 / Rigid body 2D, Gravity Scale 0 / 총알이 발사될 때 나오는 sound effect는 sound source를 bullet에 드래그앤 드롭
bullet 스크립트에는 "public int dmg;"만 새로 선언해서 각 프리팹에 모두 넣어주었다. 이는 총알 프리팹 마다 적에 미치는 데미지 정도를 다르게 해주기 위해 작성한 것. 스크립트 적용 후 bullet마다 dmg를 2, 5, 7과 같이 다르게 설정해주었다. 마지막으로 "Pbullet"이라는 태그를 생성해서 넣어주었다.(플레이어가 발사하는 bullet임을 태그로 묶은 것으로, 뒤에 스크립트에서 태그 생성 이유를 설명하겠다.)
switch(power)
{
case 1 :
GameObject bullet = Instantiate(bulletObjA, transform.position, transform.rotation);
Rigidbody2D rigid = bullet.GetComponent<Rigidbody2D>();
rigid.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
break;
case 2 :
GameObject bullet2 = Instantiate(bulletObjB, transform.position, transform.rotation);
Rigidbody2D rigid2 = bullet2.GetComponent<Rigidbody2D>();
rigid2.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
break;
case 3 :
GameObject bullet3 = Instantiate(bulletObjA, transform.position + Vector3.right*0.3f, transform.rotation);
GameObject bullet4 = Instantiate(bulletObjA, transform.position + Vector3.left*0.3f, transform.rotation);
Rigidbody2D rigid3 = bullet3.GetComponent<Rigidbody2D>();
rigid3.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
Rigidbody2D rigid4 = bullet4.GetComponent<Rigidbody2D>();
rigid4.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
break;
case 4 :
GameObject bullet5 = Instantiate(bulletObjC, transform.position + Vector3.right * 0.2f, transform.rotation);
GameObject bullet6 = Instantiate(bulletObjC, transform.position + Vector3.left * 0.2f, transform.rotation);
Rigidbody2D rigid5 = bullet5.GetComponent<Rigidbody2D>();
rigid5.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
Rigidbody2D rigid6 = bullet6.GetComponent<Rigidbody2D>();
rigid6.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
break;
case 5:
GameObject bullet7 = Instantiate(bulletObjA, transform.position + Vector3.right * 0.2f, transform.rotation);
GameObject bullet8 = Instantiate(bulletObjA, transform.position + Vector3.left * 0.2f, transform.rotation);
GameObject bullet9 = Instantiate(bulletObjC, transform.position + Vector3.right * 0.5f, transform.rotation);
GameObject bullet10 = Instantiate(bulletObjC, transform.position + Vector3.left * 0.5f, transform.rotation);
GameObject bullet11 = Instantiate(bulletObjB, transform.position + Vector3.right, transform.rotation);
GameObject bullet12 = Instantiate(bulletObjB, transform.position + Vector3.left, transform.rotation);
Rigidbody2D rigid7 = bullet7.GetComponent<Rigidbody2D>();
rigid7.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
Rigidbody2D rigid8 = bullet8.GetComponent<Rigidbody2D>();
rigid8.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
Rigidbody2D rigid9 = bullet9.GetComponent<Rigidbody2D>();
rigid9.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
Rigidbody2D rigid10 = bullet10.GetComponent<Rigidbody2D>();
rigid10.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
Rigidbody2D rigid11 = bullet11.GetComponent<Rigidbody2D>();
rigid11.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
Rigidbody2D rigid12 = bullet12.GetComponent<Rigidbody2D>();
rigid12.AddForce(Vector2.up * 10, ForceMode2D.Impulse);
break;
player스크립트에 "public float power;"을 선언 후 다음과 같은 switch case문 스크립트를 추가해주었다. switch case문은 if else문에서 3개 이상의 변수를 활용하기 위함으로 여기서는 power 즉, 다양한 형태의 무기를 사용하기 위해 작성했다.
1번 무기를 선택 시(case 1) bulletObjA가 발사되는 것을 의미하고, 3번 무기를 선택 시 (case 3) bulletObjA가 가운데에서 오른쪽으로 0.3 + 왼쪽으로 0.3만큼 이동한 쌍 총알이 발사되는 것을 의미한다. case 5번 같은 경우 bulletObjA, bulletObjB, bulletObjC가 두개씩 동시에 발사하도록 작성해주었다. 여기서 주의할 점은 선언해준 Gameobject와 Rigidbody2D를 local로 지정해주어야 한다는 것(bullet5, rigid5 이런식으로 맞춰주어야 한다.)
스크립트 완성 후 플레이어 인스펙터 창에 다음과 같은 콤포넌트가 생성된다. BulletObj A/B/C에 각각 설정했던 bullet prefab을 넣어주면 된다. 그리고 power에 case 순서를 입력해주면 (1,2,3,4,5) 스크립트로 작성했던 입력값처럼 총알이 발사되게 된다. speed는 총알이 발사되는 속도이며, Max Shoot Delay는 총알 발사 후 재장전까지의 시간이니 자유롭게 설정해주면 되겠다.
그 다음으로는 enemy 비행기를 설정해주겠다. player을 설정한 것처럼 적 비행기도 똑같이 sprite edit을 해주고 콤포넌트를 추가해 주면 된다. 다음과 같은 3가지 형태의 적비행기 sprite를 가져왔고 형태에 맞게 Circle(원) collider, Polygon(삼각형) colldier, box collider을 설정해주었다.(box collider로 통일해줘도 상관 없음) Rigidbody2D 추가 후 Gravity scale을 0으로 설정, Tag는 Enemy 태그를 새로 생성해서 맞춰주었다. 해당 enemy sprite는 프리팹화 시켜주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed;
public int energy;
public Sprite[] sprites;
// []배열의 개념, 비행기가 총알에 맞았을 때 색변환을 위함
SpriteRenderer spriteRenderer;
Rigidbody2D rigid;
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
rigid = GetComponent<Rigidbody2D>();
rigid.velocity = Vector2.down * speed;
}
//적 비행기 총알 충돌
void OnHit(int dmg)
{
// -=는 누적해서 빼는 개념
energy -= dmg;
spriteRenderer.sprite = sprites[1]; //데미지가 발생했을 때 배열 1번(2번째)를
Invoke("ReturnSprite", 0.2f); // 잠깐 보여준다.
if (energy <= 0)
{
Destroy(gameObject);
}
}
void ReturnSprite()
{
spriteRenderer.sprite = sprites[0];
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Bulletborder")
Destroy(gameObject);
else if(collision.gameObject.tag == "Pbullet") //플레이어가 쏜 Pbullet에 enemy에 닿았을 때 destroy
{
Bullet bullet = collision.gameObject.GetComponent<Bullet>();
OnHit(bullet.dmg);
Destroy(collision.gameObject); //적비행기에 총알 맞으면 없어진다.
}
}
}
Enemy 스크립트를 작성해보았다. 여기서는 새롭게 배열 개념을 추가했는데 적비행기가 bullet을 맞았을 때 적비행기의 색이 일시적으로 옅게 변해지는 효과를 주고자 했다. OnHit 함수를 사용하여 bullet을 맞았을 때 데미지(dmg)를 누적차감하도록 설정하고 Invoke함수를 통해 배열0(정상), 배열1(맞음)을 입력했다. 그리고 'Pbullet' 태그가 걸린 총알에 적비행기가 맞아 energy가 0 이하가 되었을 때 Destroy되게 만들었고, 적 비행기에 bullet이 닿았을 때 bullet도 사라지도록 destroy함수를 사용해주었다. 스크립트 완성 후 enemy 인스펙터 창에 energy를 각각 설정해주어 hp가 약한 적비행기와 hp가 강한 적비행기로 다양화시키면 된다. (적비행기의 energy와 bullet의 dmg를 자유롭게 조정) 적 비행기의 이동 속도도 public으로 선언해두었으니 각각 설정해주면 된다. 추가적으로 무기마다 서로 다른 effect sound를 넣어주어 박진감을 높여보자(prefab에 sound를 드래그앤 드롭)
적비행기와 다수의 무기가 세팅된 2D 비행기게임 완성!
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
유니티를 활용한 3D 적 피하기 게임 만들기(1) (0) | 2021.07.31 |
---|---|
[Unity Error]유니티 안드로이드 빌드 시 "Package Name has not been set up correctly" 오류 해결 방법 (0) | 2021.07.29 |
유니티를 활용한 2D Plane Shooting 게임 만들기(1) (0) | 2021.07.24 |
무료 3D 캐릭터 애니메이션 다운로드 사이트 - Mixamo 캐릭터 FBX 파일 Unity 임포트, 애니메이션 세팅 방법 (0) | 2021.07.24 |
Unity Navigation AI를 활용하여 미니 게임 만들기 (1) | 2021.07.21 |