이전 글에서 게임오브젝트 Ship을 만들었다.
sprite renderer 컴퍼넌트를 추가해서 우주선 이미지(knob)를 만들고,
우주선을 조종하기 위해 ship control 스크립트를 만들어 컴퍼넌트에 추가했다.
이제 스크립트를 편집해서 우주선의 동작을 만들어 본다.
스크립트 편집기 교체
스크립트를 편집하기 전에 편집기에 대해 수정할 상황이 생겼다.
유니티를 설치하면 C# 코드 편집기로 비주얼 스튜디오(Visual Studio)가 설치된다.
비주얼 스튜디오는 마이크로소프트가 개발한 IDE(통합 개발 환경)이다.
지금까지 C# 코드 연습에 이것을 사용했는데 30일 무료 평가판이어서 계속 사용하려면 로그인 하라는 메시지가 나타났다.
계속 사용하려면 계정을 만들어 로그인하면 사용할 수 있다.
하지만 지금부터는 통합개발환경(IDE)은 아니지만 C# 에디터(편집기)로 널리 사용하고 있고, C#스크립트 편집에 필요한 기능은 모두 가지고 있는 비주얼 스튜디오 코드 (VS Code)를 사용하기로 한다.
무엇보다 프로그램 덩치도 작고 유니티에서 스크립트 편집하는 용도로는 충분하기 때문이다.
비주얼 스튜디오 코드를 설치하려면 아래를 참고한다.
비주얼스튜디오코드를 설치하려면 검색창에 위와 같이 입력한 후 해당 사이트 Download를 클릭하여 컴퓨터에 맞는 버전을 받아서 설치하면 된다.
이제 유니티에서 비주얼스튜디오코드를 스크립트 기본 편집기로 설정해야 한다.
메뉴 Edit - Preferences를 클릭한다.
External Tools(외부 도구들) 에서 Visual Studio Code를 선택한다.
이제 스크립트를 편집하면 비주얼스튜디오코드가 자동으로 실행될 것이다.
ShipContrl 스크립트 편집
Scripts폴더에 만들어 둔 ShipControl 스크립트 파일을 편집하기 위해 더블클릭한다.
또는 Ship오브젝트의 Inspector창에서 Ship Control 스크립트 옵션 Edit Script를 클릭해도 된다.
ShipControl.cs 파일을 열면 다음과 같이 VSCode 편집창이 나타난다.
이 스크립트는 Ship 이라는 게임오브젝트에 연결한 컴퍼넌트이다.
스크립트 내에서 게임오브젝트에 접근하려면 gameObject 키워드를 사용한다.
게임 오브젝트 활성화
게임오브젝트를 활성화(true) 또는 비활성화(false)하고 싶으면 SetActive( ) 메서드를 사용하여 불리언 값을 인수로 전달하면 된다.
gameObject.SetActive(true)
gameObject.SetActive(false)
위 그림은 현재 Ship으로 만든 이미지가 활성화된 상태다.
게임오브젝트를 비활성화(안보이게) 해보자.
위와 같이 코드를 작성한 후 저장(Ctrl+S)한다.
유니티 창으로 돌아와서 실행 버튼을 클릭하면 Ship 이미지가 사라진다.
즉, 위에서 작성한 게임오브젝트에 연결된 스크립트는 게임이 시작되었을 때 맨 처음 Start( ) 메서드를 실행하여 게임오브젝트를 비활성화한다.
Inspector창을 보면 게임오브젝트 Ship 옆에 있던 체크 표시가 없어진 것을 확인할 수 있다.
즉, 비활성화 되었다는 뜻이다. 실행버튼을 다시 클릭하면 원래 상태로 돌아온다.
게임오브젝트 이동
게임오브젝트를 움직이는 방법은 2가지가 있다.
Position (위치) 좌표 변경
Rigidbody 물리 엔진 적용
여기서는 게임오브젝트의 위치(Position)를 변경해본다.
위 그림의 inspector창에서 볼 수 있듯이 위치는 Transform 컴퍼넌트의 Position X,Y,Z 값을 바꾸면 된다.
그리고 위치에 접근하려면 transform.position을 사용하면 된다.
*transform : 변형시키다.
*position : 위치
이것을 코드를 작성하여 수정할 수 있다.
10번줄: transform.position(위치)에 Vector2의 up 값을 저장하라는 뜻이다.
Vector2 는 x, y 위치가 있는 2차원 평면 좌표(2D)를 표현하는 타입이다.
*vector 벡터 : 크기와 방향이 있는 양
위 코드를 저장 후 실행해보자.
y값이 1로 바뀌고 Ship은 위로 1만큼 이동해 있을 것이다.
이렇게 유니티에는 Vector의 기본값이 설정되어 있는 함수가 있는데 다음과 같은 것들이 있다.
Vector2.up
Vector2.down
Vector2.right
Vector2.left
Vector2.zero
Vector2.one
up(위)는 y값이 1로
down(아래)는 y값이 -1
right(오른쪽)은 x값이 1로
left(왼쪽)은 x값이 -1로
zero는 x , y값이 0 으로
one 은 x , y값이 1로 각각 설정되어 있다.
위와 같은 준비된 함수에 없는 값 만큼 움직이게 하려면 다른 방법으로 코드를 작성해야 한다.
이번에는 게임을 시작했을 때 게임오브젝트 Ship이 오른쪽으로 3만큼 움직이도록 하는 스크립트는 다음과 같다.
10번줄: 위에서 Vector2 는 x, y 위치가 있는 2차원 평면 좌표(2D)를 표현하는 타입이라고 했다.
그러므로 Vector2 newPosition은 벡터2 (2D) 타입의 변수 newPosition(새 위치)을 정의한 것이다.
그리고 이 변수에 게임오브젝트의 위치를 가리키는 transform.position을 저장하면 inspector에 있는 현재 x , y 위치 값이 저장된다.
11번줄: 현재 위치값이 저장된 newPosition의 x 값에 3을 더한 값을 저장한다.
위 코드는 다음과 같이 '더해서 저장하라'는 연산자를 사용해서 표현할 수도 있다. (유니티09 토큰 - 대입연산자 참고)
newPosition.x += 3;
12번줄: transform.position에 수정한 newPosition값을 저장한다.
스크립트를 저장한 후 실행하면 위와 같이 Ship이 오른쪽으로 이동할 것이다.
Position의 x 값도 3으로 변하는 것을 볼 수 있다.
만약 3차원 평면 (3D)의 게임오브젝트라면 x , y , z 위치를 사용하므로 이때 사용하는 타입은 Vector3을 사용한다.
Vector3도 Vector2와 마찬가지로 기본값이 설정된 함수들이 있다.
Vector3.up
Vector3.down
Vector3.right
Vector3.left
Vector3.zero
Vector3.one
게임 오브젝트 키보드로 이동
실제 게임에서는 입력장치(키보드,마우스,버튼,터치 등)로 플레이어를 조작한다.
키보드 입력 받기
사용자가 누른 키보드 키를 입력 받으려면 Input 클래스의 GetKey( ) 메서드(함수)를 사용한다.
Input.GetKey( )
GetKey의 인수는 'KeyCode.문자'를 사용한다.
만약 'W키'일 경우 'KeyCode.W'가 된다.
Input.GetKey(KeyCode.W)
GetKey( )는 해당 키가 누른 상태이면 true, 그렇지 않으면 false를 반환한다.
해당 키가 눌려졌을 때(true) 게임오브젝트의 위치 이동은 위에서 살펴본 transform.position 으로 값을 변경해도 되지만 더 간편하게 하려면 게임오브젝트를 이동해주는 Translate( ) 메서드를 이용한 transform.Translate( )를 사용한다.
*translate : 번역하다, 바꾸다
키보드에서 이동키로 많이 사용하는 W, A, S, D 키를 이용해서 게임오브젝트(Ship)를 위,아래,왼쪽,오른쪽으로 이동하는 코드는 다음과 같다.
Update()메서드에 조건문으로 입력해서 해당 키가 눌려져 있으면 설정한 값 만큼 x,y,z 축으로 이동하게 된다.
this는 현재 게임오브젝트(Ship)를 나타낸다. this에 대해서는 나중에 C# 학습에서 자세히 다룰것이다.
스크립트를 저장 후 실행해서 WSAD키를 각각 눌러서 이동을 확인한다.
실행해 보면 속도가 너무 빠를것이다.
이것은 Update 함수(메서드)가 매 프레임마다 호출되기 때문에 게임하듯이 키를 누르고 있으면 순식간에 이동하게 된다.
위치값 1 대신에 0.1f로 수정한 후 다시 움직임을 확인하면 조절 가능한 정도로 움직일 것이다.
만약 고정된 속도가 아니라 게임 중에 속도를 변경해야 하는 경우는 변수를 만들어 적용할 수 있다.
speed(속도)라는 float타입의 전역 변수를 만들어 0.1f 값으로 초기화를 한 후 Translate()함수에 적용한 코드는 다음과 같다.
이제 우주선 이동 속도를 변경하려면 변수 speed 값을 바꿔주면 된다.
스크립트를 저장하면 아래 그림과 같이 Inspector창의 Ship Control 컴퍼넌트에 speed 항목이 만들어지고 여기서 직접 값을 수정할 수도 있다.
이것은 변수를 public 으로 선언했기 때문이다.
public 은 '접근 제한이 없다'는 것을 나타낸다.
끝.
Wraven...
'취미로 하는 게임코딩_gameCodingAsHobby > 유니티unity로 게임 만들기' 카테고리의 다른 글
유니티14_C#_07_클래스와 메서드 (0) | 2021.02.16 |
---|---|
유니티13_게임 제작 과정_03_미사일 발사 (0) | 2021.02.15 |
유니티11_게임 제작 과정01_플레이어 만들기 (0) | 2021.02.06 |
유니티10_C#_06_토큰_Token (0) | 2021.01.31 |
유니티09_C#_05_배열_Array (0) | 2021.01.31 |