서론

이번에 설명할 부분은 키보드 입력장치를 처리할 수 있는 Input에 대한 내용입니다.

Unity에서는 두 가지의 시스템이 존재하는데요. Input ManagerInput System입니다. Input Manager는 Unity가 출시된 이후로 기본 입력 처리 솔루션으로 사용되어 왔지만, Input System은 Unity 2019.3부터 도입된 새로운 시스템입니다.

이 글에선 우선 Input Manager 를 기준으로 설명을 진행하도록 하겠습니다.

💡
만약 자동화하고자 하는 게임이 모바일 게임이라면 이 글의 내용을 건너뛰어도 됩니다. 모바일 게임은 키보드를 통한 상호작용이 없기에 UI를 통한 조작으로 대부분 처리가 가능하기 때문입니다.

DypThePenguin 샘플 프로젝트 열기

  • gamium-unity-samples 프로젝트를 다운로드 받아 주세요. 이후 다운로드 받은 zip파일을 압축해제 해주세요.
  • Unity Hub를 통해 프로젝트를 열어주세요.
  • Projects 창에서 Scene > Demo.unity 를 더블클릭하여 Scene을 열어주세요.
  • Play 버튼을 눌러 정상 실행되는지 확인해주세요.

키 입력 해보기

  • gamium-testing 하위에 test.py 파일을 아래와 같이 수정해봅니다.
from gamium import *

service = TcpGamiumService("127.0.0.1", 50061)
gamium = GamiumClient(service)
gamium.connect()

gamium.send_key(KeyBy.unity_keycode("W"))
gamium.send_key(KeyBy.unity_keycode("A"))
gamium.send_key(KeyBy.unity_keycode("S"))
gamium.send_key(KeyBy.unity_keycode("D"))
  • Unity Editor창에서 Play버튼을 누릅니다.
  • VSCode 터미널에서 아래 명령어를 통해 실행해봅니다.
python3 test.py
  • 펭귄이 아래와 같이 움직이는 것을 확인할 수 있습니다.
0:00
/0:01
  • gamium.send_key(KeyBy.unity_keycode("원하는키")) 와 같이 사용하면 게임에 특정 키보드 입력을 전달할 수 있습니다.
    전달가능한 키들은 유니티Keycode문서 를 통해 확인할 수 있어요. 문서에 LeftControl 키를 전달하고 싶다면 gamium.send_key(KeyBy.unity_keycode("LeftControl")) 와 같이 사용하면 됩니다.
  • 만약 여러 키보드 입력을 동시에 전달하고 싶다면 여러개의 입력을 전달하는 send_keys를 사용할 수 도 있습니다.
  • 또한 SendKeyOptions을 지정하여 키보드를 누르고 있는 시간(miliseconds)을 지정할 수도 있습니다.
# 300밀리초 동안 W키 누르기
gamium.send_key(KeyBy.unity_keycode("W"), SendKeyOptions(300))
# W,A키를 같이 누르기
gamium.send_keys([KeyBy.unity_keycode("W"), KeyBy.unity_keycode("A")])
# 300밀리초 동안 W,A키를 같이 누르기
gamium.send_keys([KeyBy.unity_keycode("W"), KeyBy.unity_keycode("A")], SendKeyOptions(300))

Player를 특정 위치로 이동시키기

  • 다음으로 게임을 진행시키기 위해선 플레이어를 움직여 스노우볼을 획득해야 하는데요.
  • gamium-testing 하위에 test.py 파일을 아래와 같이 수정해보고 다시 python 스크립트를 실행해봅니다.
from gamium import *

service = TcpGamiumService("127.0.0.1", 50061)
gamium = GamiumClient(service)
gamium.connect()

# Player 지정
player = gamium.player(By.path("/Dyp[1]/Dyp[1]/Root[1]"))
# Player가 움직일시 기준이 되는 메인카메라 지정
cameraLocator = By.path("/Cameras[1]/Main Camera[1]")
# 주워야할 스노우볼 지정
snowBall1Locator = By.path("/World[1]/Item Pickups[1]/SnowBallPickup[1]")

# Player를 스노우볼로 이동시키기
player.move(cameraLocator, snowBall1Locator)
# 스노우볼을 주움
gamium.send_key(KeyBy.unity_keycode("E"))
  • 아래와 같이 플레이어가 스노우볼로 이동 후 획득하는 것을 확인할 수 있습니다.
0:00
/0:01
💡
위 스크립트에서는 플레이어를 특정 GameObject까지 이동해보았는데요. player.move(cameraLocator, targetLocator) 는 어떻게 동작할까요?
결론부터 말하자면 단순히 가까워지도록 움직이는것 뿐이에요.
player.move 가 호출되면 gamium내부에서는 타겟오브젝트와 Player사이의 거리를 계산하여 가까워 지도록 방향키를 입력합니다. 이 때 거리가 멀어지는 방향키를 누르지 않으려면 방향키를 눌렀을때 앞뒤좌우 어느방향으로 움직일지 판단해야하는데요. 이 과정에서 Player를 바라보는 Camera를 사용합니다. Player는 Camera시점을 기준으로 동서남북으로 움직이기 때문이죠. ( TopView인 게임들 기준입니다. )

KeyPress, Navigation

  • player를 움직일 때 위 방법처럼 방향키로만 움직이는 것에는 한계가 있는데요. 장애물을 피하지 못 하고, 또한 TopView가 아니라면 동작하지 않을 거에요.
  • 따라서 gamium에서는 Unity 내부 Navigation 기능을 활용해서 움직일 수 있도록 기능을 제공하고 있습니다. Player에 NavMeshAgent 컴포넌트가 붙어있다면 이를 활용하는 방법입니다. 아래와 같이 사용할 수 있어요.
# 방향키 입력으로 이동하기
player.move(cameraLocator, targetLocator, MovePlayerOptions(MovePlayerBy.KeyPress))

# Navigation을 기준으로 이동하기
player.move(cameraLocator, targetLocator, MovePlayerOptions(MovePlayerBy.Navigation))
💡
현재 DypThePenguin에서는 Navigation을 사용하지 않아 확인이 어려울텐데요. Navigation기능도 사용해보고 싶다면 gamium-unity-samples에 포함된 DoguRpgSample 을 통해서 한 번 진행해보세요

전체 Sample 진행해보기

  • DypThePenguin 게임을 통해서 키보드 입력 및 플레이어를 움직이는 것을 학습해보았는데요. 이외에도 스테이지를 클리어하도록 짜여진 스크립트가 있답니다.
  • 아래 과정으로 전체 Sample도 한 번 진행해보세요.
    • Unity Editor창에서 Play버튼을 누릅니다.
    • 터미널에서 gamium-unity-samples/client/python 로 이동 후 스크립트를 실행합니다.
cd gamium-unity-samples/client/python
python3 dypthepenguin-test.py
👉
만약 이 가이드에서 제공하는 DypThePenguin이 아닌 Unity 프로젝트에 적용한다면, 기존에 UnityEngine의 Input을 사용하던 부분을 Gamium Input을 사용하도록 C#코드를 변경해주어야합니다.

Input 클래스를 사용하는 파일들을 찾아보세요. 그리고 파일 제일 위에 아래 코드를 삽입하여 기존 Input 대신 Gamium.Input을 사용하도록 합니다.

#if USE_GAMIUM
using Input = Gamium.Input;
#endif