여러 적 만들기
앞에서 적(Enemy)는 게임오브젝트로 객체를 만들었다.
그런데 만들어야 하는 적이 많다면 게임오브젝트로 일일이 만들기 번거롭다.
이런 경우에 프리팹(Prefab)을 이용하는 것이 올바른 방법이다.
또한 만든 프리팹에 적용할 스크립트도 이미 만들어 놓은 게임오브젝트의 스크립트를 상속(Inheritance)받아서 구현하는 것이 올바른 방법이며 이것이 객체 지향 언어인 C#을 제대로 사용하는 방법이다.
여러 적을 만들면서 클래스의 핵심 기능인 상속, 다형성, 캡슐화가 어떻게 적용되는 지 확인해 본다.
여기서는 적 2개를 다음과 같이 만든다.
- Enemy1프리팹 , Enemy2 프리팹을 만든다.
- 각각 Enemy1, Enemy2 스크립트를 만들어 연결한다.
- 공통인 필드와 메서드는 Enemy스크립트를 상속받아서 사용한다.
- 필요한 새로운 메서드는 Enemy1 스크립트와 Enemy2 스크립트에 각각 새로 코드를 작성한다.
먼저 적을 움직이게 할 것이므로 게임오브젝트 Enemy에 Rigidbody2D컴퍼넌트를 추가한다.
Gravity Scale은 0으로 수정한다.
Enemy 프리팹 만들기
Prefabs폴더에 Enemy 프리팹을 2개 만든다.
Bullet 프리팹을 만든것 처럼 게임오브젝트Enemy를 Prefabs 폴더로 끌어와서 놓는다.
2번째 프리팹을 만들 때 오리지널 프리팹을 만들것인지, 현재 프리팹의 변종을 만들것인지 옵션에서 Original Prefab을 선택한다.
프리팹 이름을 Enemy1 , Enemy2로 수정한다.
스크립트 만들기
Enemy1, Enemy2 프리팹에 적용할 스크립트를 만든다.
Scripts폴더에 새 스크립트 2개를 만들고 이름을 Enemy1, Enemy2로 수정한다.
적을 움직이게 할 것이므로 Enemy스크립트에 float타입의 필드(변수) enemySpeed를 만든다.
움직임을 나타내는 Move 메서드를 Enemy스크립트에 추가한다.
실제 움직이는 객체는 Enemy1, Enemy2 프리팹이지만 위와 같이 enemySpeed필드와 Move( )메서드를 Enemy스크립트에 만드는 이유는 상속과 오버라이드, 오버로드 등를 이용하기 위해서이다.
44번줄 코드에서 Move메서드는 Enemy1, Enemy2에서 오버라이드(override) 해서 사용할 것이므로 virtual 키워드를 붙여준다.
게임오브젝트 Enemy의 Enemy(Script)에 필드 Enemy Speed가 나타난다.
적 속도를 50으로 수정한다.
이제 Enemy1, Enemy2스크립트를 작성한다.
Enemy1스크립트를 더블클릭하여 편집기를 열고 위 코드를 작성한다.
5번줄
클래스 Enemy1 은 클래스 Enemy를 상속받는다.
7~10번줄
class Enemy의 Move( ) 메서드를 override한다.
실행할 내용은 Rigidbody2D컴퍼넌트를 가져와서(GetComponent) 그 클래스에 있는 AddForce메서드를 실행하여 힘을 준다. 오른쪽(x)으로 위치값 1을 주는 인수(Vector2.right)에 emenySpeed(속도)를 곱한 값이 힘이 되어 움직이게 한다.
스크립트를 저장한다.
Enemy2스크립트도 같은 코드를 작성한다.
Enemy2는 왼쪽으로 움직일 것이므로 Vector2.left (x값 -1)인수로 적어준다.
스크립트를 저장한다.
스크립트 프리팹에 연결
작성한 스크립트를 Enemy1, Enemy2 프리팹에 연결하자.
Prefabs폴더의 Enemy1을 더블클릭한다.
Enemy(Script)는 오른쪽 설정(세점 모양)을 눌러서 제거(Remove)하고, Add Component 버튼으로 Enemy1스크립트를 컴퍼넌트로 추가한다.
Enemy2 스크립트도 같은 방법으로 Enemy2프리팹에 추가하고 Enemy(Script)는 제거한다.
적 프리팹 관리
현재까지 게임오브젝트 Enemy를 이용해서 Enemy 프리팹 2개를 만들었다.
프리팹에 적용할 스크립트를 각각 만들어서 프리팹에 컴퍼넌트로 추가했다.
이제 프리팹을 화면에 객체로 나타나도록 해야 한다.
객체는 Hierarchy(하이어라키) 창에서 게임오브젝트로 만들 수도 있지만 앞에서 총알(Bullet)을 움직이게 할 때 처럼 코드로 객체를 만들 수도 있다.
Bullet의 경우 Update( )메서드에서 객체를 만들고 위치를 정했지만 여기서는 게임오브젝트와 스크립트를 만들어서 Enemy1, Enemy2 객체를 만들고 관리할 수 있도록 한다.
먼저 게임오브젝트를 하나 만든다.
게임오브젝트 이름을 PrefabManager(프리팹 메니저)라고 수정한다.
PrefabManager게임오브젝트에 연결할 스크립트도 만든다.
Scripts폴더에 새 스크립트를 만들고 이름을 PrefabManager(프리팹 메니저)라고 수정한다.
게임오브젝트에 스크립트를 컴퍼넌트로 추가한다.
PrefabManager스크립트를 더블클릭해서 코드를 작성한다.
7~8번줄
Enemy1프리팹, Enemy2프리팹을 넣을 게임오브젝트(GameObject) 타입의 변수를 2개 선언한다.
PrefabManager게임오브젝트에 선언한 변수가 만들어진다.
각 변수에 Enemy1프리팹과 Enemy2프리팹을 지정한다.
오른쪽 끝 동그라미를 클릭한 후 Assets탭에서 Enemy1을 클릭한다.
Enemy2프리팹도 같은 방법으로 연결한다.
스크립트에 다음과 같이 코드를 추가한다.
11~16번줄
적 객체를 생성하고 관리할 SpawnEnemy 메서드를 만든다.
*spawn : (알을) 낳다, 생성하다
11번줄
매개변수는 GameObject타입의 prefab과 Vector3타입의 _position이다.
13번줄
이 메서드가 호출되면 Instantiate메서드에서 전달받은 매개변수prefab으로 게임오브젝트를 생성해서 enemy에 넣는다.
14번줄
생성된 enemy객체의 위치는 전달받은 매개변수 _position으로 정한다.
15번줄
enemy객체에서 Enemy클래스의 Move메서드를 호출한다.
Enemy클래스의 Move메서드를 호출하면 Enemy1, Enemy2스크립트가 상속되어 있고, Move메서드는 virtual과 override로 연결되어 있기 때문에 Enemy1Prefab 객체를 생성하면 지정된 Enemy1 스크립트에 있는 Move메서드가 실행된다.
위 13~15번 실행 코드는 간단히 하면 객체를 만들고, 위치를 정하고, 움직이게 하는 코드이다.
이제 Start( )메서드에서 SpawnEnemy메서드를 호출하여 new키워드로 객체를 생성하는 코드를 작성해서 프로젝트를 시작하면 객체 2개가 만들어지도록 한다.
만들어진 두 객체는 오른쪽, 왼쪽 위치에서 움직일 것이다.
스크립트를 저장한다.
테스트하기 전에 먼저 프리팹의 색을 수정한다.
Prefabs폴더의 Enemy1, Enemy2를 더블클릭해서 Sprite Renderer의 Color 속성에서 위와 같이 마음에 드는 색으로 바꿔준다.
추가로 객체가 가로(x축)으로만 움직이게 하려면 Rigidbody2D 속성에서 Freeze Position (위치 고정) 옵션의 y를 체크하면 된다. 참고로 회전을 하지 않게 하려면 Freeze Rotation을 체크한다.
그리고 게임오브젝트Enemy는 보이지 않도록 Inspector 창의 Enemy 체크를 해제한다.
스크립트를 저장한 후 실행한다.
프리팹에서 복제된 객체 2개가 만들어져 오른쪽, 왼쪽으로 이동하는 것을 확인할 수 있다.
끝.
Wraven...
'취미로 하는 게임코딩_gameCodingAsHobby > 유니티unity로 게임 만들기' 카테고리의 다른 글
유니티24_C#14_인터페이스(Interface) (0) | 2021.03.06 |
---|---|
유니티23_C#13_추상 클래스(Abstract class) (0) | 2021.03.06 |
유니티21_게임 제작 과정 05_충돌 설정 (0) | 2021.02.26 |
유니티20_게임 제작 과정 04_적 만들기 (0) | 2021.02.22 |
유니티19_C#_12_다형성 (0) | 2021.02.21 |