프로젝트에서 플레이어의 움직임을 가상 조이스틱으로 제어하기로 했다.
[시행착오]
가상 조이스틱을 구현하는 방법에 대해 생각하던 중, 처음에는 UI요소에 스크립트를 달고 인터페이스(IDragHandler)와 이벤트를 통해서 드래그 가능하게 하여 UI이미지에도 움직임을 주면서 방향값을 받아와서 플레이어가 이동하도록 구현하려고 했다.
하지만 프로젝트를 모바일에서 PC로 확장할 가능성도 있고, 상태머신을 사용한다는 점을 고려하여 Input System을 기반으로 하는 가상 조이스틱을 만들어보게 되었다. (Input System은 특정 액션(ex. 공격, 상호작용 등)에 대해 여러 입력 방식을 쉽게 연결할 수 있으므로 상태머신과 연결하기 쉽다는 장점이 있다.)
단순하게 Input System을 써야겠다는 생각을 하고, 모바일 터치스크린을 통해 입력을 받아야 하므로 TouchScreen을 path로 입력을 받는 방법을 시도해보았다. 그런데 TouchScreen을 path로 delta나 position 입력을 받으면 터치스크린 영역 전체에서 터치 이벤트가 발생할 때마다 입력을 받게 되어 적합한 활용이 아니라는 것을 작업 도중에 깨달았다.
특정 영역 (예를 들어 UI요소) 위에서만 일어나는 터치를 감지해서 입력을 받아오고자 한다면 터치스크린을 통해 받아온다기보다는 해당 UI요소에 입력 장치를 추가해서 상호작용이 일어나도록 하는 것이 더 적합하겠다는 결론이 나왔는데, 아무리 생각해도 UI 요소와 Input System을 연결할 수 있도록 하는 장치가 존재할 것 같아서 계속 탐색해보았다.
그렇게 찾은 녀석들이
On-Screen Button 과 On-Screen Stick
[활용하기]
On-screen Controls | Input System | 1.3.0
On-screen Controls You can use on-screen Controls to simulate Input Devices with UI widgets that the user interacts with on the screen. The most prominent example is the use of stick and button widgets on touchscreens to emulate a joystick or gamepad. Ther
docs.unity3d.com
On-Screen Button 과 On-Screen Stick는 Input System 패키지를 설치하면 자동으로 생성되는 스크립트로, 버튼이나 조이스틱으로 활용하고 싶은 오브젝트에 컴포넌트 형식으로 붙여서 활용할 수 있다. 그런데 영어로 된 자료들을 보았을 때, 이 스크립트가 자동으로 생성된다는 사실을 명시적으로 적어둔 부분을 찾지 못해서 그냥 사람들이 관습적으로 해당 기능을 구현하는 스크립트 이름을 저렇게 쓰는 줄 알았다; 각자 구현한 게 아니라는 것을 깨달았을 때 얼마나 허무했던지...
아무튼 이 둘은 Unity의 Input System과 연계되어 작동한다. 이번에 On-Screen Stick을 사용해보았기 때문에 On-Screen Stick을 기준으로 사용 방법 뜯어보기

- Movement Range: 조이스틱의 움직임 범위를 픽셀 단위로 설정한다. 조이스틱 UI의 중심에서 이 범위만큼 움직일 수 있게 된다.
- Control Path: Action을 UI 요소에 연결하기 위한 경로를 나타낸다. 즉, 어떤 입력 소스(예: 키보드, 마우스, 게임패드 등)와 연결된 Action인지를 나타내는 경로이다. Input Action에서 이 스틱과 연결하고자 하는 Action의 Path를 동일하게 설정해주면 된다.
- Gamepad는 Unity 입력 시스템의 추상화된 개념 중 하나로, 대부분의 게임패드들이 가지고 있는 일반적인 버튼이나 스틱들의 집합을 의미한다.
- Xbox 컨트롤러와 PlayStation 컨트롤러는 각기 다른 디자인과 버튼 레이아웃을 가지고 있을 수 있지만, 둘 다 게임패드로 분류될 수 있다. 러한 디바이스들을 Gamepad라는 일반적인 카테고리로 추상화해서 입력을 처리할 수 있게 해준다. 즉, Gamepad의 leftStick이라는 경로를 사용하면 Xbox 컨트롤러든, PlayStation 컨트롤러든, 다른 게임패드든 상관없이 해당 경로가 해당 기능을 지원하는 모든 게임패드에서 동일하게 작동합니다.
-
- On-Screen Stick 컴포넌트를 사용하여 가상 조이스틱을 만들 때, 해당 스틱을 Gamepad의 leftStick처럼 동작하게 만들기 위해 위와 같은 경로를 사용한다. 이렇게 하면, 가상 조이스틱의 입력이 실제 게임패드의 스틱 입력처럼 동작한다.
위의 스크립트를 조이스틱으로 쓰고자 하는 UI 이미지에 붙였다. 실제로 UI 이미지의 움직임이 조이스틱처럼 움직인다. UI의 움직임과 입력값을 받아오는 작업을 따로 만들지 않아도 된다는 점이 정말 간편한 것 같다.

'👾 내일배움캠프 > 🎮 TIL & WIL' 카테고리의 다른 글
내일배움캠프 61일차 TIL - 델리게이트 / 이벤트 / 람다 (0) | 2023.11.09 |
---|---|
내일배움캠프 60일차 TIL - 플레이어와 주방기구 상호작용 (1) | 2023.11.08 |
내일배움캠프 54일차 TIL - struct와 class (0) | 2023.10.29 |
내일배움캠프 53일차 TIL - 접근제한자에 대한 이해 (0) | 2023.10.26 |
내일배움캠프 52일차 TIL - ref와 out 한정자 (1) | 2023.10.25 |
프로젝트에서 플레이어의 움직임을 가상 조이스틱으로 제어하기로 했다.
[시행착오]
가상 조이스틱을 구현하는 방법에 대해 생각하던 중, 처음에는 UI요소에 스크립트를 달고 인터페이스(IDragHandler)와 이벤트를 통해서 드래그 가능하게 하여 UI이미지에도 움직임을 주면서 방향값을 받아와서 플레이어가 이동하도록 구현하려고 했다.
하지만 프로젝트를 모바일에서 PC로 확장할 가능성도 있고, 상태머신을 사용한다는 점을 고려하여 Input System을 기반으로 하는 가상 조이스틱을 만들어보게 되었다. (Input System은 특정 액션(ex. 공격, 상호작용 등)에 대해 여러 입력 방식을 쉽게 연결할 수 있으므로 상태머신과 연결하기 쉽다는 장점이 있다.)
단순하게 Input System을 써야겠다는 생각을 하고, 모바일 터치스크린을 통해 입력을 받아야 하므로 TouchScreen을 path로 입력을 받는 방법을 시도해보았다. 그런데 TouchScreen을 path로 delta나 position 입력을 받으면 터치스크린 영역 전체에서 터치 이벤트가 발생할 때마다 입력을 받게 되어 적합한 활용이 아니라는 것을 작업 도중에 깨달았다.
특정 영역 (예를 들어 UI요소) 위에서만 일어나는 터치를 감지해서 입력을 받아오고자 한다면 터치스크린을 통해 받아온다기보다는 해당 UI요소에 입력 장치를 추가해서 상호작용이 일어나도록 하는 것이 더 적합하겠다는 결론이 나왔는데, 아무리 생각해도 UI 요소와 Input System을 연결할 수 있도록 하는 장치가 존재할 것 같아서 계속 탐색해보았다.
그렇게 찾은 녀석들이
On-Screen Button 과 On-Screen Stick
[활용하기]
On-screen Controls | Input System | 1.3.0
On-screen Controls You can use on-screen Controls to simulate Input Devices with UI widgets that the user interacts with on the screen. The most prominent example is the use of stick and button widgets on touchscreens to emulate a joystick or gamepad. Ther
docs.unity3d.com
On-Screen Button 과 On-Screen Stick는 Input System 패키지를 설치하면 자동으로 생성되는 스크립트로, 버튼이나 조이스틱으로 활용하고 싶은 오브젝트에 컴포넌트 형식으로 붙여서 활용할 수 있다. 그런데 영어로 된 자료들을 보았을 때, 이 스크립트가 자동으로 생성된다는 사실을 명시적으로 적어둔 부분을 찾지 못해서 그냥 사람들이 관습적으로 해당 기능을 구현하는 스크립트 이름을 저렇게 쓰는 줄 알았다; 각자 구현한 게 아니라는 것을 깨달았을 때 얼마나 허무했던지...
아무튼 이 둘은 Unity의 Input System과 연계되어 작동한다. 이번에 On-Screen Stick을 사용해보았기 때문에 On-Screen Stick을 기준으로 사용 방법 뜯어보기

- Movement Range: 조이스틱의 움직임 범위를 픽셀 단위로 설정한다. 조이스틱 UI의 중심에서 이 범위만큼 움직일 수 있게 된다.
- Control Path: Action을 UI 요소에 연결하기 위한 경로를 나타낸다. 즉, 어떤 입력 소스(예: 키보드, 마우스, 게임패드 등)와 연결된 Action인지를 나타내는 경로이다. Input Action에서 이 스틱과 연결하고자 하는 Action의 Path를 동일하게 설정해주면 된다.
- Gamepad는 Unity 입력 시스템의 추상화된 개념 중 하나로, 대부분의 게임패드들이 가지고 있는 일반적인 버튼이나 스틱들의 집합을 의미한다.
- Xbox 컨트롤러와 PlayStation 컨트롤러는 각기 다른 디자인과 버튼 레이아웃을 가지고 있을 수 있지만, 둘 다 게임패드로 분류될 수 있다. 러한 디바이스들을 Gamepad라는 일반적인 카테고리로 추상화해서 입력을 처리할 수 있게 해준다. 즉, Gamepad의 leftStick이라는 경로를 사용하면 Xbox 컨트롤러든, PlayStation 컨트롤러든, 다른 게임패드든 상관없이 해당 경로가 해당 기능을 지원하는 모든 게임패드에서 동일하게 작동합니다.
-
- On-Screen Stick 컴포넌트를 사용하여 가상 조이스틱을 만들 때, 해당 스틱을 Gamepad의 leftStick처럼 동작하게 만들기 위해 위와 같은 경로를 사용한다. 이렇게 하면, 가상 조이스틱의 입력이 실제 게임패드의 스틱 입력처럼 동작한다.
위의 스크립트를 조이스틱으로 쓰고자 하는 UI 이미지에 붙였다. 실제로 UI 이미지의 움직임이 조이스틱처럼 움직인다. UI의 움직임과 입력값을 받아오는 작업을 따로 만들지 않아도 된다는 점이 정말 간편한 것 같다.

'👾 내일배움캠프 > 🎮 TIL & WIL' 카테고리의 다른 글
내일배움캠프 61일차 TIL - 델리게이트 / 이벤트 / 람다 (0) | 2023.11.09 |
---|---|
내일배움캠프 60일차 TIL - 플레이어와 주방기구 상호작용 (1) | 2023.11.08 |
내일배움캠프 54일차 TIL - struct와 class (0) | 2023.10.29 |
내일배움캠프 53일차 TIL - 접근제한자에 대한 이해 (0) | 2023.10.26 |
내일배움캠프 52일차 TIL - ref와 out 한정자 (1) | 2023.10.25 |