아이템 3종 프리펩 만들기
Item 스크립트
//Components
Rigidbody2D rigid;
//Vars
public string type;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
rigid.velocity = Vector2.down * 0.5f; //일자로 내려오게 하기
}
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Border Bullet") { //Border Bullet에 닿으면 아이템 삭제
Destroy(gameObject);
}
}
하이라키의 아이템 오브젝트 3종을 프로젝트 프리펩 폴더에 드래그 앤 드랍해서 프리펩 생성
Player 스크립트 코드 추가
public int maxPower; //파워 최대치
public int boom; //폭탄 개수
public int maxBoom; //폭탄 개수 최대치
public bool isBoomTime; //폭탄 사용 여부 판단
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Border")
{
...
}
else if (collision.gameObject.tag == "Enemy" || collision.gameObject.tag == "EnemyBullet")
{
...
}
else if (collision.gameObject.tag == "Item") { //아이템을 먹었을때
Item item = collision.gameObject.GetComponent<Item>(); //아이템 스크립트 가져오기
switch (item.type) { //아이템의 타입으로 swtich문 작동
case "Coin": //코인은 점수추가
score += 1000;
break;
case "Power": //파워 + 1
if (power == maxPower)
{
score += 500; //파워가 최대치일 경우 점수만 추가
}
else {
power += 1;
}
break;
case "Boom": //폭탄 + 1
if (boom == maxBoom) //폭탄이 최대치일 경우 점수만 추가
{
score += 500;
}
else {
boom += 1;
}
gm.updateBoomIcon(boom); //GameManager의 BoomIcon 갱신
break;
}
Destroy(collision.gameObject); //먹은 아이템은 삭제
}
}
GameManager 스크립트에 코드 추가
public Image[] boomImage; //UI boom 이미지 맵핑 변수
public void updateBoomIcon(int boom)
{
//Boom Icon 다 끄기
for (int index = 0; index < 3; index++)
{
boomImage[index].color = new Color(1, 1, 1, 0.2f);
}
//남은 목숨 갯수만큼만 Boom Icon 다시 켜기
for (int index = 0; index < boom; index++)
{
boomImage[index].color = new Color(1, 1, 1, 1);
}
}
인스펙터에서 maxPower, maxBoom, boom 입력하기
Boom 개수 UI 만들어서 연동하기
인스펙터에서 GameManager 스크립트 부분 UI의 Boom Icon 이미지 3개 맵핑해주기
중간 점검
적 제거 시 아이템이 나오게 하기
Enemy 스크립트 코드 추가
public GameObject itemCoin; //Coin 프리펩 맵핑
public GameObject itemBoom; //Boom 프리펩 맵핑
public GameObject itemPower; //Power 프리펩 맵핑
public void onHit(int dmg) {
if (health <= 0) return; //적 이중피격 방지
...
if (health <= 0) {
Player playerScript = player.GetComponent<Player>();
playerScript.score += enemyScore;
//Random Ratio Item Drop
int ran = Random.Range(0, 10); //아이템 생성 난수
switch (ran) {
case 0:
case 1:
case 2:
case 3:
case 4:
//No Item
break;
case 5:
case 6:
//Coin
Instantiate(itemCoin, transform.position, itemCoin.transform.rotation);
break;
case 7:
case 8:
//Power
Instantiate(itemPower, transform.position, itemPower.transform.rotation);
break;
case 9:
//Boom
Instantiate(itemBoom, transform.position, itemBoom.transform.rotation);
break;
}
Destroy(gameObject);
}
}
Enemy 3종 프리펩에 아이템 맵핑
Boom 구현
먼저 오브젝트를 생성합니다.
Boom 이펙트가 적이나, 플레이어보다 밑에 있어야 하므로
Boom의 order in layer를 -1로, BackgroundGrid는 -2로 해줍니다.
Boom 오브젝트에 애니메이션 추가
마우스 우클릭 하면 Boom이 써지도록 코드 추가
Player 스크립트 추가
public GameObject boomEffect; //boom 오브젝트 맵핑
void Boom() {
if (!Input.GetButtonDown("Fire2")) { //마우스 우클릭이 안눌렸다면 return으로 함수 끝
return;
}
if (boom == 0) { //boom이 0개라면 return으로 함수 끝
return;
}
if (isBoomTime) { //이미 boom을 사용중이라면 return으로 함수 끝
return;
}
isBoomTime = true; //boom 사용시 isBoomTime을 true로 하여 boom 중복 사용 방지
boom -= 1; //boom 개수 -1
//Active Boom Effect
boomEffect.SetActive(true); //boom 오브젝트 활성화
//Remove Boom Effect
Invoke("offBoomEffect", 4f); //boom 오브젝트 비활성화 예약
//Remove Enemy
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy"); //tag가 Enemy인 모든 오브젝트 찾아서 배열에 넣기
for (int i = 0; i < enemies.Length; i++) {
Enemy enemyScript = enemies[i].GetComponent<Enemy>();
enemyScript.onHit(1000); //적 전투기에게 데미지 1000 주기
}
//Remove Enemy Bullet
GameObject[] enemyBullet = GameObject.FindGameObjectsWithTag("EnemyBullet"); //tag가 EnemyBullet인 모든 오브젝트 찾아서 배열에 넣기
for (int i = 0; i < enemyBullet.Length; i++)
{
Destroy(enemyBullet[i]); //배열 내 모든 오브젝트 삭제
}
gm.updateBoomIcon(boom); //boom 아이콘 갱신
}
Player 스크립트에 Boom 오브젝트 맵핑
Boom 오브젝트 비활성화 시켜놓기
결과
'종스크롤 슈팅게임(1942)' 카테고리의 다른 글
8. 오브젝트 풀링 (0) | 2022.01.25 |
---|---|
7. 원근감 있는 무한 배경 만들기 (0) | 2022.01.21 |
5. 간단한 UI 만들기 (0) | 2022.01.19 |
4. 적 전투기 총알 & 플레이어 피격 이벤트 구현 (0) | 2022.01.18 |
3. 적 전투기 만들기 (0) | 2022.01.18 |