728x90

이 글은 "따라하면서 배우는 고박사의 유니티 기초" 강의를 정리한 글이다. 

 

[지금 무료] 따라하면서 배우는 고박사의 유니티 기초 | 고박사 - 인프런

고박사 | 유니티로 게임을 개발하고 싶은 초보자를 대상으로 하며, 유니티 설치부터 2D/3D 게임 개발에 필요한 기초 지식까지 자세하게 설명합니다. (강의에 사용되는 모든 리소스는 영상 상단의

www.inflearn.com

 

 


반복문을 이용한 오브젝트 생성

반복문을 이용해 원하는 갯수만큼 오브젝트를 복제해서 생성하는 예제로 반복으로 사용되는 변수 i를 용해 오브젝트에 x 위치와 회전을 서서히 증가되도록 설정하였다.

 

다음 코드와 같이 중첩 이중 반복문을 사용한다면 격자 형태의 사각 맵을 표현할 수 있다. 외부 반복문은 격자의 y축 계산으로, 내부 반복문은 격자의 x축 계산으로 사용된다. 

(x축과 y축 값 모두 잘 증가되고 있는데 왜 저렇게 겹처서 나오는지 모르겠다...)

 

반복문 조건을 통해 특정 위치에 생성하지 않도록 할 수 있다. continue 키워드는 반복문에서 현재 조건을 건너뛰는 키워드이다. 아래 코드에서 보면 18번째 줄에서 continue가 실행되고 22번째 줄이 실행되지 않고, 다시 내부 반복문 조건으로 돌아가게된다. 

 

이외에 조건을 추가하여 만들 수 있으며 논리 연산자(||, &&) 이용해서 할 수 있다. 내부 반복문 안에 조건문을 만들어서 두가지 조건 중 하나가 만족될 때 실행된다는 의미이다. 

 

이외에 마름모 형태나 여러가지 형태를 조건문을 추가해서 만들 수 있다. 


임의의 Prefab으로 오브젝트 생성

여러 종류의 prefab 중 임의의 prefab이 생성되게 하는 예제를 진행할 것이다. 우선 추가적으로 여러 prefab을 추가한다. 

게임 오브젝트는 배열 형태이기 때문에  PrefabArray 변수에 동일한 타입의 여러개의 Prefab을 등록할 수 있다. 

Random.Range() 함수는 첫번째 매개변수로 나오는 숫자부터 두번째 매개변수까지 중에 하나의 숫자가 임의로 랜덤으로 선발된다. 선택된 숫자는 index 변수에 적용이 되며, index 변수가 instantiate()를 할 때 Prefab의 순번으로 들어가게 된다.

예를 들어 0이라는 숫자가 들어가면 0번에 있는 Prefab이 생성되게 될 것이다.

 

임의의 Prefab를 뽑기 때문에 항상 결과가 다르게 나온다. 

(좌) 2차 시도, (우) 3차 시도


임의의 위치에서 오브젝트 생성

Random.Range() 함수를 이용해서 오브젝트가 생성되는 x, y 위치를 임의로 설정해서 오브젝트를 생성해보도록한다. 이것도 이전 예제와 동일하게 할 때마다 결과가 다르게 나오게 된다. 

 


SpawnPoint에서 오브젝트 생성

맵에 배치한 특정 오브젝트 위치에서 오브젝트가 생성되도록하는 예제를 진행할 것이다. (SpawnPoint)

새로 오브젝트를 생성하고 생성 위치로 사용되기 때문에 화면에 안보여도 되지만 배치 편리성을 위해 보이게 설정하고 배치를 진행한다. 두 개의 오브젝트 크기는 각각 0.2 이며 위치는 (6,4) 와 (-6, -4)로 하여 대각선 위치로 배치하였다. 

 

아래 코드에서 SpawnPoint를 저장할 수 있는 트랜스폼 타입의 배열의 변수를 선언하였고, 배열 변수 중에 임의로 하나의 트랜스폼 변수의 값을 선택하게 된다. 선택된 위치를 position 변수에 저장면 미리 설정해둔 SpawnPoint 중 한 곳으로 오브젝트가 생성될 것이다. 

 

이전에 생성한 ObjectSpawner에 가면 SpawnPoint 배열이 생기는데, 여기에 드래그 드롭으 추가하면된다. 실행하면 겹쳐서 확인이 어렵지만 오브젝트들이 잘 생성된 것을 확인할 수 있다. 

 

 

오브젝트 이동

오브젝트들이 이동할 수 있도록 이동 코드를 작성해보았다. 

위에 SpawnIndex가 0이면 왼쪽 하단에 있기 때문에 이동방향을 오른쪽으로 하라는 명령을 한다. 0이 아니면 오른쪽 상단에 있기 때문에 왼쪽으로 이동한다.

 

이동을 위해서 세 개의 오브젝트를 무브먼트 2D 컴포넌트에 주가한다. 이후 오브젝트 직선 이동을 위한 코드를 작성한다.

 

이동하는 걸 확인할 수 있다. 근데 동시에 생성되어 하나로 움직이는 것처럼 보이기 때문에 오브젝트 생성 시점을 변경해보자.

 

오브젝트 생성 시간을 조절해서 다음과 같이 나오게 된다. 

 


플레이어 위치에 오브젝트 생성

슈팅 게임에서 활용할 수 있도록 플레이어의역할을 하는 게임 오브젝트 하나를 생성하고, 플레이어의 위치에서 특정키를 입력했을 때, 오브젝트를 생성하는 예제를 진행할 예정이다.  

플레이어의 움직임을 Player Controller 스크립트 코드를 작성하였다.

Input.GetKeyDown은 키보드 입력을 뜻하여 keyCodeFire 변수에 있는 KeyCode.Space를 스페이스바를 누르면 안쪽 코드가 실행된다.  이때 Instantiate()에서 bulletPrefab을 오브젝트가 생성되게 된다. 생성 위치는 현재 게임 오브젝트의 위치가 된다. 그리고 이름, 크기, 색을 바꾸는 것을 확인할 수 있다. 

Player 오브젝트에 이동 스크립트 코드를 넣고 bullet prefab에 circle을 넣어서 실행해보자.

 

오브젝트가 플레이어 위치에서 생성되는 것을 확인할 수 있다. 이것을 움직이도록 하는 예제를 진행한다. 

 

방향에 맞추어 오브젝트 이동

 

마지막에 움직였던 방향으로 총알을 발사하기 위해 마지막으로 움직였던 방향을 저장한다. 초반에는 오른쪽으로 발사하도록 유도하고 있다.

방향키를 누르지 않았다면 이전 저장 값을 사용하며, 방향키를 누르면, 움직인 정보를 lastMoveDirection에 저장하게 된다. 이후에 Setup() 함수에 저장된 방향값을 전달한다.

+ Recent posts