10강) 적 기체 제거 |
오늘은 적 기체 제거에 대해서 알아보겠습니다.
원래는 플레이어의 HP를 GUI에 나타내고 그 변화를 관찰하는 것 까지 하려고 했으나 너무 내용이 많아져서 이번 시간에는 적 기체 제거만 하려고 합니다.
지난 시간에 여기까지 했을 겁니다.
여기서 이어서 진행하도록 하겠습니다.
적의 정보를 표현하기 위한 클래스 작성 |
(이름은 항상 자기 마음대로 라는 것, 하지만 거기에 따른 코드 수정은 알아서 하셔야합니다.)
(저는 Enemy_Data라는 이름으로 작성하였습니다.)
먼저 새로운 C# 스크립트를 하나 작성하여 봅시다.
지금 작성하는 클래스는 적의 정보를 표현하기 위한 하나의 틀이라고 생각하시면 됩니다.
새롭게 C# 스크립트를 작성하면 기본적으로 몇가지 작성되어 생성이 됩니다.
(void Start, void Update 등...)
전부 지우시고 다음과 같이 작성합시다.
("public class 클래스 이름"은 지우지 마세요)
public class Enemy_Data { private int HP; // 적 기체의 체력 public Enemy_Data(int _HP) // 생성자 { HP = _HP; } // Enemy_Data enemy = new Enemy_Data(50); -> 체력이 50인 적의 데이터 public void decreaseHP(int damage) // damage만큼 체력을 깎는다. { HP -= damage; } // Enemy_Data enemy = new Enemy_Data(50); -> 체력이 50인 적의 데이터 // enemy.decreaseHP(20); -> 체력을 20만큼 깎는다. public int getHP() { return HP; } // Enemy_Data enemy = new Enemy_Data(50); -> 체력이 50인 적의 데이터 // enemy.getHP(); -> 현재 체력을 반환 }
보시면 아시겠지만 HP가 나온것으로 보아 체력을 뜻하는 것 같군요.
(아직은 체력밖에 없지만 추후에 공격력 등이 여기에 추가되게 됩니다.)
이렇게 적의 데이터 틀을 만들었습니다.
적을 나타내는 클래스 작성 |
위에서 만든 클래스는 바로 사용이 불가합니다.
다른 곳에서 객체화 시켜서 사용해야하기 때문이죠.
그래서 C# 스크립트를 하나 더 만들어봅시다.
(저는 Enemy라는 이름으로 작성하였습니다.)
여기에 다음과 같이 입력하여봅시다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { public int HP; private Enemy_Data enemyData; // Use this for initialization void Start () { enemyData = new Enemy_Data(HP); Debug.Log(gameObject.name + "의 체력 : " + enemyData.getHP()); } // Update is called once per frame void Update () { } }
여기서 12번줄의 "gameObject.name"은 이 스크립트가 적용된 "현재의 오브젝트 이름"입니다.
이렇게 작성된 스크립트를 지난시간에 만든 적 오브젝트에 심어봅시다.
이렇게 심으니까 "HP" 라는 이름으로 어떤 값을 입력하는 공간이 생겼습니다.
그럼 이 Enemy라는 스크립트에 일부분을 수정하여봅시다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { public int HP_Test; // 수정(HP -> HP_Test) private Enemy_Data enemyData; // Use this for initialization void Start () { enemyData = new Enemy_Data(HP_Test); // 수정(HP -> HP_Test) Debug.Log(gameObject.name + "의 체력 : " + enemyData.getHP()); } // Update is called once per frame void Update () { } }
6번줄과 11번줄을 "HP" 에서 "HP_Test"로 바꾸어봤습니다.
그러자
이렇게 HP_Test로 변하였습니다.
그럼 하나 더 바꾸어봅시다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { private int HP; // 수정(public -> private) private Enemy_Data enemyData; // Use this for initialization void Start () { enemyData = new Enemy_Data(HP); Debug.Log(gameObject.name + "의 체력 : " + enemyData.getHP()); } // Update is called once per frame void Update () { } }
다시 변수를 HP로 돌려놓고 "public"을 "private"로 바꾸어줍시다.
그러자
이렇게 사라집니다.
결론은
"public"으로 선언된 변수나 객체는 에디터에서 수정이 가능하다. |
입니다.
다시 원래대로 돌아와서
체력을 50을 주고 게임시작을 해봅시다.
이렇게 우리가 선언한대로 아주 잘 실행되는것을 눈으로 확인할 수 있습니다.
미사일과의 충돌 |
그럼 이제 미사일에 충돌되었을 때 발생하는 HP감소 이벤트를 만들어봅시다.
먼저
"Player Missile"이라는 태그를 만들어서
미사일에 태그를 입력하고 시작을 합시다.
(태그는 지난번에 설명했으니 따로 설명하지 않습니다.)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { public int HP; private Enemy_Data enemyData; // Use this for initialization void Start () { enemyData = new Enemy_Data(HP); Debug.Log(gameObject.name + "의 체력 : " + enemyData.getHP()); } private void OnTriggerEnter2D(Collider2D collision) { // 부딛히는 collision을 가진 객체의 태그가 "Player Missile"일 경우 if (collision.CompareTag("Player Missile")) { Debug.Log("미사일과 충돌"); enemyData.decreaseHP(10); // 체력을 10 감소 Debug.Log(gameObject.name + "의 현재 체력 : " + enemyData.getHP()); } } }
위에서 만든 "Enemy" 스크립트에 충돌을 감지하는 함수인 "OnTriggerEnter2D"를 작성하여줍니다.
(이것 또한 지난시간에 이 함수의 기능을 설명했으니 넘어가겠습니다.)
"Player Missile" 태그를 가진 오브젝트와 충돌을 하면 체력을 10 감소하도록 하였습니다.
그럼 저장을 하고 실행하여봅시다.
그런데 문제점이 있죠?
바로 체력이 0이 되어도 사라지지 않는다는 점, 그리고 체력이 -값이 되어버린다는 점이죠.
이제 저것들을 처리하도록 하여봅시다.
(여기서 체력이 -값으로 되지 않도록 하는 방법은 굳이 처리하지 않고 적의 에너지가 0이하가 되면 바로 사라지게 함으로써 처리하였습니다.)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { public int HP; private Enemy_Data enemyData; // Use this for initialization void Start () { enemyData = new Enemy_Data(HP); Debug.Log(gameObject.name + "의 체력 : " + enemyData.getHP()); } void Update() { if(enemyData.getHP() <= 0) { Debug.Log("파괴!!!!!"); Destroy(gameObject); // 현재 적의 오브젝트를 메모리풀링으로 만들지 않았기 때문에 // Destroy로 처리합니다. } } private void OnTriggerEnter2D(Collider2D collision) { // 부딛히는 collision을 가진 객체의 태그가 "Player Missile"일 경우 if (collision.CompareTag("Player Missile")) { Debug.Log("미사일과 충돌"); enemyData.decreaseHP(10); // 체력을 10 감소 Debug.Log(gameObject.name + "의 현재 체력 : " + enemyData.getHP()); } } }
방금 전의 "Enemy" 스크립트에서 "void FixedUpdate"만 추가하였습니다.
FixedUpdate |
Update는 매 프레임마다 검사하는 반면에 FixedUpdate는 정해진 값에따라 호출되는데 물리효과연산(rigidbody)을 처리할 때 자주 쓰입니다. |
에너지를 FixedUpdate를 이용하여 검사하여 처리하도록 하였습니다.
확인하기 |
실행하여 확인해봅시다.
어때요. 아주아주 쉽죠?
위의 링크에서 지금까지의 강의 진행상태 파일을 다운받을 수 있습니다.
다음 시간에는 |
플레이어의 에너지시스템에 대해서 알아보도록 하겠습니다.
'Study > Unity 5(유니티5)' 카테고리의 다른 글
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 09 [충돌 처리] (0) | 2017.06.03 |
---|---|
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 08 [미사일 발사2] (9) | 2017.04.01 |
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 07 [미사일 발사1] (7) | 2017.03.12 |
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 06 [비행기 생성 및 움직이기] (1) | 2017.02.24 |
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 05 [게임의 요소 결정 및 구상] (0) | 2017.02.10 |