Arduino와 Unity로 맞춤형 게임 컨트롤러를 만드는 방법

Arduino와 Unity로 맞춤형 게임 컨트롤러를 만드는 방법

자신만의 게임 컨트롤러를 디자인하고 싶었던 적이 있습니까? 생각보다 쉽습니다!





이 짧은 프로젝트에서 Unity 게임 엔진과 함께 사용할 간단한 사용자 지정 게임 컨트롤러를 빌드합니다. 이 컨트롤러는 Arduino Uno에 의해 구동되지만 이 프로젝트에 대해 많은 대안 중 하나를 사용할 수도 있습니다. 또한 컨트롤러를 사용하여 떨어지는 물체를 피하고 시간을 늦추는 기본 게임도 만들 것입니다.





이 프로젝트에 필요한 것

  • Arduino 또는 이와 유사한 마이크로컨트롤러
  • 1 x 10k 옴 저항
  • 1 x 순간 스위치
  • 1 x 전위차계
  • 훅업 와이어
  • 브레드보드
  • 유니티 게임 엔진
  • Unity 에셋 스토어의 Uniduino 플러그인()
  • 작성하고 싶지 않은 경우를 대비하여 프로젝트 코드를 작성하십시오(Unduino 플러그인은 포함하지 않음).

이들 대부분은 Arduino 스타터 키트에서 사용할 수 있습니다. 스타터 키트가 없다면 가장 적합한 키트를 선택하기 위한 가이드를 확인하십시오.





컨트롤러를 원하는 만큼 복잡하게 만들 수 있지만 이 예에서는 간단한 아케이드 게임을 제어하는 ​​데 완벽한 전위차계와 버튼을 설정합니다.

컨트롤러 조립

아래 이미지와 같이 브레드보드와 아두이노를 설정합니다. 이것은 우리가 게임 컨트롤러로 사용할 것입니다. 비록 당신이 게임 컨트롤러와 거의 똑같은 설정을 사용할 수 있지만 DIY 미디 컨트롤러 도!



Arduino 준비

모든 것이 연결되면 USB를 통해 Arduino를 연결합니다. Arduino 소프트웨어 IDE에서 도구 > 보드 그리고 도구 > 포트 사용 중인 마이크로컨트롤러와 포트를 선택합니다. Arduino IDE는 필요한 스케치와 함께 번들로 제공되며 아래에서 찾을 수 있습니다. 파일> 예제> Firmata> StandardFirmata . 업로드를 클릭하면 준비가 완료됩니다.

Arduino를 처음 사용하고 머리가 약간 녹는다면 다음을 확인하십시오. 초보자 가이드 컴퓨터와 원활하게 대화할 수 있도록 도와줍니다.





Unity 프로젝트 설정

Unity에서 열기 창 > 에셋 스토어 Unity 에디터 내에서 Unity의 에셋 스토어에 액세스합니다. 에셋 스토어에서 Uniduino 플러그인을 검색합니다. 이 플러그인을 사용하면 Unity 내부의 Arduino 핀과 데이터를 주고받을 수 있습니다. 작성 당시 플러그인 비용은 입니다. 것이 가능하다 플러그인을 구입하지 않고 이 프로젝트를 수행하려면 더 복잡하고 모든 면에서 플러그인이 더 편리할 수 있습니다.

플러그인 제작자의 이 비디오는 최초 설정과 함께 모든 것이 작동하는지 테스트하는 과정을 안내합니다. Windows에서 Unity 편집기를 재설정해야 할 수도 있습니다.





이 동일한 테스트 패널을 사용하여 컨트롤러를 테스트할 수 있습니다. 핀 D2를 INPUT 및 디지털로 설정합니다. 더 아래로 핀 A5를 ANALOG로 설정합니다. 전위차계와 버튼은 이제 화면의 핀 번호 옆에 값을 표시해야 합니다. 진전!

이제 우리가 통제할 수 있는 것을 만들기 위해

컨트롤러가 있지만 무엇을 제어해야 할까요? 글쎄요, 가능성은 무한하지만 오늘은 새로운 제어 시스템을 테스트하기 위해 매우 간단한 회피 게임을 만들 것입니다. 우리는 게임 설정을 매우 빠르게 진행할 것이므로 Unity 엔진을 완전히 처음 사용하는 경우 Unity 게임 프로그래밍 초보자 가이드 베어링을 얻는 데 유용합니다.

우리는 당신의 목표가 떨어지는 큐브를 피하기 위해 왼쪽과 오른쪽으로 구체를 피하는 것이 목표인 매우 기본적인 게임을 만들 것이며, 이는 새로 만든 사용자 정의 컨트롤러를 사용할 것입니다.

새 장면을 만들고 Uniduino 프리팹을 드래그합니다. 자산 > Uniduino > 조립식 계층으로 이동하고 Uniduino 조립식을 계층으로 끌어옵니다. 게임과 컨트롤러 사이에 대화를 하기 위해 필요합니다.

Unity 계층 구조에서 만들기 > 구 Inspector의 Transform 탭을 사용하여 게임 화면의 맨 아래로 이동합니다.

코딩을 배울 시간입니다

이제 이 파티에 코드를 추가합니다. 계층에서 구체를 선택한 상태에서 구성 요소 추가 > 새 스크립트 인스펙터 창 하단에 있습니다. 이름을 붙이다 sphereMover 그리고 선택 C 샤프 드롭다운 메뉴에서. 딸깍 하는 소리 생성 및 추가 스크립트가 GameObject에 추가됩니다. 두 번 클릭하여 스크립트를 열고 다음 코드를 입력합니다.

using UnityEngine;
using System.Collections;
using Uniduino;
public class sphereMover : MonoBehaviour
{
//Headers aren't scrictly neccesary, but they make life easier back in the Inspector.
[Header('Arduino Variables')]
//we need to declare the Arduino as a variable
public Arduino arduino;
//we need to declare an integer for the pin number of our potentiometer,
//making these variables public means we can change them in the editor later
//if we change the layout of our arduino
public int potPinNumber;
//a float variable to hold the potentiometer value (0 - 1023)
public float potValue;
//we will later remap that potValue to the y position of our capsule and hold it in this variable
public float mappedPot;
//public int for our button pin
public int buttonPinNumber;
[Header('Sphere Variables')]
//variables to hold the values we noted earlier for the sides of our screen
public float leftEdge;
public float rightEdge;
// Use this for initialization
void Start ()
{//and initialize we shall, starting with the Arduino Variable.
//we are only using one arduino, so we can use Arduino.global to grab it.
arduino = Arduino.global;
arduino.Setup(ConfigurePins);
}
void ConfigurePins()
{
//configure the Arduino pin to be analog for our potentiometer
arduino.pinMode(potPinNumber, PinMode.ANALOG);
//Tell the Arduino to report any changes in the value of our potentiometer
arduino.reportAnalog(5, 1);
//configure our Button pin
arduino.pinMode(buttonPinNumber, PinMode.INPUT);
arduino.reportDigital((byte)(buttonPinNumber / 8), 1);
}
}

잠시 시간을 내어 코드 주석을 읽으십시오. 지금까지 Arduino, 핀 및 Sphere에 대한 몇 가지 변수를 선언했습니다. 우리는 또한 사용했습니다

런타임에 Arduino를 초기화하는 Start 및 ConfigurePins 메서드. 스크립트를 저장하고 Unity 편집기로 돌아가서 변경된 사항을 확인합니다.

이제 Inspector 창에서 공개 변수를 볼 수 있습니다. 나중에 도움이 되도록 이 단계에서 입력할 수 있는 항목을 살펴보겠습니다. 우리는 이전 빌드에서 Arduino에서 어떤 핀을 사용하고 있는지 알고 있으며 입력할 수 있습니다. 우리는 또한 이전 실험을 통해 구가 화면에서 떨어지지 않도록 구가 왼쪽과 오른쪽으로 얼마나 멀리 이동할 수 있는지 알고 있습니다. 이제 이 값을 입력합니다.

생명의 첫 징후

Unity 에디터 내에서 Arduino의 값을 실제로 볼 시간입니다. 지금은 sphereMover 스크립트의 업데이트 기능에 한 줄의 코드를 추가하고 스크립트를 다시 저장할 수 있습니다.

void Update ()
{
//We assign the value the arduino is reading from our potentionmeter to our potValue variable
potValue = arduino.analogRead(potPinNumber);
}

이제 매 프레임마다 potValue 변수가 업데이트되었으므로 Unity Inspector에서 실시간으로 값을 확인할 수 있습니다. 테스트를 하기 전에 Uniduino 플러그인이 올바른 포트에서 수신 중인지 확인하는 것이 좋습니다. Heirarchy에서 Uniduino를 클릭하고 Inspector에서 Port Name을 확인합니다. 비어 있으면 Arduino의 올바른 포트 번호를 입력하십시오. 이 경우에는 COM4였지만 사용자에게는 다를 수 있습니다. 확실하지 않은 경우 Arduino IDE를 사용하여 확인하십시오.

계층 구조에서 구를 선택하고 화면 상단의 재생 버튼을 클릭합니다. 시스템은 초기화하는 데 몇 초가 필요하며, 그 후 전위차계를 움직일 때 검사기에서 Pot Value 변수가 변경되는 것을 보기 시작해야 합니다.

지금 우리는 말하고 있습니다! 글쎄, 엄밀히 말하면 Unity와 Arduino가 이야기하고 있지만 누가 계산합니까? 여기까지 왔는데 인스펙터에서 값 변경이 보이지 않으면 설정 단계를 확인하고 Arduino에 대해 올바른 포트가 선택되었는지 확인하십시오.

이 구체를 움직이자

이제 potValue 변수가 업데이트되었으므로 이 값을 사용하여 구를 이동하려고 합니다. 전위차계가 완전히 왼쪽에 있을 때 구가 화면 왼쪽에 있고 그 반대의 경우도 마찬가지입니다. Unity의 개체는 해당 값에 의해 결정되는 Vector 공간의 한 지점에 배치됩니다. 변환 위치 . 아래 이미지에서 구가 원하는 왼쪽의 가장 먼 지점에 있는 경우 위치 벡터가 9.5, -4, 0임을 알 수 있습니다.

구의 X 위치에 영향을 미치고 싶습니다. 불행히도 전위차계의 값을 직접 사용하는 것은 작동하지 않습니다. 전위차계가 완전히 왼쪽에 있을 때 0 값을 제공하기 때문입니다. 그러면 구가 화면 중앙에 오른쪽에 놓이게 됩니다. 다른 극단에서 전위차계의 최고 값인 1023은 큐브를 화면 오른쪽에 배치합니다. 유용하지 않다. 여기서 필요한 것은 수학입니다.

Unity가 도움이 될 때 수학을 하는 이유는 무엇입니까?

무의미한 숫자로 덮인 종이 조각을 쳐다보기가 두려운 분들을 위해 (일부 훌륭한 웹사이트 그것은 당신이 수학을 배우는 데 도움이 될 수 있습니다), 두려워하지 마십시오. 구의 X 위치와 일치하도록 전위차계 값을 만드는 방법이 필요합니다. 다행히도 우리는 사용할 수 있습니다 확장 방법 .

확장 메서드는 특정 작업을 수행하는 스크립트입니다. 이 경우, 우리는 그것에 우리가 가지고 있는 값을 주고, 서로 매핑된 값을 반환하여 우리의 작업에서 사용할 준비가 되었습니다. sphereMover 스크립트. 프로젝트 패널 상단에서 만들기 > C# 스크립트 이름을 ExtensionMethods로 지정합니다. 스크립트에 아래 코드를 입력합니다.

using UnityEngine;
using System.Collections;
public static class ExtensionMethods {

//our handy dandy Remapper function
public static float Remap (this float value, float from1, float to1, float from2, float to2)
{
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
}
}

스크립트를 저장하고 sphereMover 스크립트로 돌아갑니다. 이제 Update 함수의 ExtensionMethods 스크립트에서 이 Remap 함수를 사용하여 전위차계 값을 게임에서 사용 가능한 값으로 변환할 수 있습니다. 방금 potValue 변수를 할당한 위치에 다음을 입력합니다.

프롬프트는 Remap이 두 세트의 From 및 To 값을 가져와 함께 매핑한다는 것을 보여줍니다. 여기에 우리의 가치를 입력할 수 있습니다.

mappedPot = potValue.Remap(0, 1023, leftEdge, rightEdge);

스크립트를 저장하고 Unity 편집기로 돌아가서 재생 버튼을 누르십시오. 이제 전위차계를 움직일 때 Mapped Pot 변수가 변경되어 왼쪽 및 오른쪽 가장자리에 대해 결정한 값에 해당하는 것을 볼 수 있습니다. 잠시 시간을 내어 ExtensionMethods 스크립트에 감사를 표하십시오. 계산기가 보이지 않습니다.

참고: 값이 반대로 되어 있는 경우 전위차계가 완전히 오른쪽에 있을 때 Mapped Pot 변수에 대해 음수 값을 얻게 되면 전위차계가 잘못된 방향으로 설정되었을 수 있습니다. 다행히 다시 배선하지 않고도 이 문제를 해결할 수 있습니다. 다시 매핑할 때 값을 간단히 전환할 수 있습니다.

이제 마침내 사용할 수 있는 값이 생겼습니다. 이제 구의 X 위치에 해당 값을 할당하는 일만 남았습니다.

사기꾼이 내 이메일 주소로 무엇을 할 수 있어
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

스크립트를 저장하고 Unity 편집기로 돌아가 재생을 누릅니다. 이제 전위차계를 사용하여 구를 왼쪽과 오른쪽으로 이동할 수 있습니다!

버튼을 작동시키기

이제 구체가 움직이므로 빡빡한 상황에 처했을 때 속도를 조금 늦출 수 있는 방법이 있으면 좋지 않을까요? 버튼을 사용하여 게임의 시간을 늦추겠습니다. sphereMover 스크립트를 열고 이 코드를 업데이트 기능에 추가하십시오.

//if Unity detects the button is being pressed, the time scale slows down
if (arduino.digitalRead(buttonPinNumber) == 1){
Time.timeScale = 0.4f;
}
else Time.timeScale = 1.0f;

이제 게임의 역학이 생겼습니다. 장애물을 추가해 보겠습니다! 우리는 구의 천적인 큐브를 사용할 것입니다. 계층에서 만들기 > 3d 개체 > 큐브 . 큐브 인스펙터에서 구성요소 추가 > 물리 > 강체 . 리지드바디의 드래그 값을 5로 설정합니다. 또한 인스펙터의 Box Collider 구성 요소에서 Is Trigger를 선택합니다. 이를 통해 Sphere와의 충돌을 감지할 수 있습니다.

큐브에 스크립트를 만들고 호출 충돌하다 , 스크립트를 열고 이번에는 필요하지 않으므로 시작 및 업데이트 기능을 삭제합니다. 다음 코드를 입력하세요.

using UnityEngine;
using System.Collections;
public class collideWithSphere : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
}

OnTriggerEnter는 트리거 충돌기가 다른 충돌기에 닿을 때마다 메시지를 보냅니다. 이 경우, 우리는 그것이 닿는 것은 무엇이든 파괴하라고 말합니다. 스크립트를 저장하고 Unity 편집기로 돌아갑니다. 계층에서 큐브를 프로젝트 패널로 드래그합니다. 계층 구조의 큐브 텍스트가 파란색으로 변한 것을 확인할 수 있습니다. 이는 프리팹을 생성하여 프로젝트에 저장했기 때문입니다. 지금 계층에서 큐브를 삭제하십시오.

이제 큐브를 생성하는 스크립트만 있으면 됩니다. 계층 구조에서 만들기 > 빈 만들기 , Inspector에서 이름을 Game Manager로 바꾸고 gameManager라는 스크립트를 추가합니다. 스크립트를 열고 다음 코드를 추가합니다.

using UnityEngine;
using System.Collections;
public class gameManager : MonoBehaviour {
//a variable to hold the prefab we want to spawn
public GameObject cube;
//we want some variables to decide how any cubes to spawn
//and how high above us we want them to spawn
public int numberToSpwan;
public float lowestSpawnheight;
public float highestSpawnheight;
// Use this for initialization
void Start ()
{
for (int i = 0; i {
Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);
}
}

// Update is called once per frame
void Update ()
{

}
}

스크립트를 저장합니다. 편집기로 돌아가서 계층 구조에서 Game Manager를 선택하고 큐브 프리팹을 프로젝트 패널에서 Inspector의 Cube 변수로 드래그합니다. 여기에도 산란 값을 입력하십시오. 원하는 만큼 쉽게 또는 어렵게 만들 수 있습니다. Uniduino가 초기화될 수 있을 만큼 가장 낮은 큐브가 충분히 높이 생성되도록 하는 것이 좋습니다. 이동하기 전에 게임에서 지는 것은 실망스러울 수 있습니다!

완성된 프로젝트

이제 플레이를 누르면 큐브가 여러분 위에 생성되고 떨어집니다. 전위차계를 사용하여 이를 피하고 버튼을 사용하여 시간을 늦출 수 있습니다.

이 프로젝트에서 우리는 Arduino로 맞춤형 컨트롤러를 만들고, Unity와 Uniduino와 통신하도록 구성하고, 테스트할 간단한 게임을 만들었습니다. 여기의 개념은 거의 모든 프로젝트에 적용할 수 있으며 심지어 커스텀 컨트롤러를 전문으로 하는 게임 잼 .

Arduino와 Unity를 사용하면 거의 모든 것으로부터 맞춤형 컨트롤러를 만들 수 있습니다. 우주선을 제어하는 ​​하이파이를 만들었습니까? 플랫폼 게임을 제어하는 ​​토스터기?

이런 프로젝트를 했다면 보고 싶어요! 아래 의견에 게시하십시오!

공유하다 공유하다 트위터 이메일 6가지 대안: 최고의 무료 또는 저렴한 오디오북 앱

오디오북 비용을 지불하고 싶지 않다면 무료로 합법적으로 들을 수 있는 몇 가지 훌륭한 앱이 있습니다.

다음 읽기
관련 항목
  • DIY
  • 프로그램 작성
  • 아두이노
  • 게임 컨트롤러
  • 게임 개발
저자 소개 이안 버클리(216건의 기사 게재)

Ian Buckley는 독일 베를린에 거주하는 프리랜스 저널리스트, 음악가, 공연자 및 비디오 프로듀서입니다. 글을 쓰지 않거나 무대에 오르지 않을 때는 미친 과학자가 되기 위해 DIY 전자 제품이나 코드를 만지작거리고 있습니다.

이안 버클리가 참여한 작품 더보기

뉴스레터 구독

뉴스레터에 가입하여 기술 팁, 리뷰, 무료 전자책 및 독점 거래를 확인하십시오!

구독하려면 여기를 클릭하세요.