JY-Dev Tech Blog

유니티 (Unity) - 조이스틱 만들기 3 (C# Script) 본문

유니티

유니티 (Unity) - 조이스틱 만들기 3 (C# Script)

JY-Dev 2020. 7. 8. 09:44

[Script]

스크립트 작성 및 사용

게임 오브젝트의 동작은 연결된 Components에 의해 제어됩니다. Unity 기본 컴포넌트는 다양한 목적으로 사용할 수 있지만 사용자 지정 게임 기능을 구현하려면 충분하지 않은 경우가 많습니다. Unity에 의해 Script를 사용하여 사용자 정의 컴포넌트를 생성하고, 게임의 이벤트 시작, 시간이 지남에 따라 컴포넌트 속성 수정, 사용자 입력 작업에 대한 반응이 가능합니다.

 

Unity는 2개의 프로그래밍 언어를 지원합니다:

C# (씨샵 이라고 발음), Java 또는 C++과 유사한 산업 표준 언어

__ UnityScript__, JavaScript를 바탕으로 모델링 된 Unity 독자적인 설계 언어

또한 Compatible DLL 컴파일이 가능하여 다양한 다른 .NET 언어를 사용할 수 있습니다.

 

일단 스크립트를 생성하려면 하단 프로젝트의 Assets에서 생성 할 수 있습니다.

 

여기서 마우스 우측 클릭을 통해 create > C#Script를 눌러주면 NewBehaviourScript라고 생성이 될 것입니다. 이것의 이름을 JoyStickScript라고 바꿔주겠습니다. Sciprt를 클릭 후 F2를 누르면 이름을 변경할 수 있습니다. 이걸 더블 클릭하게 되면 Visual Studio가 켜지면서 이 Script를 수정 할 수 있습니다.

 

[스크립트 파일의 구조]

기본적으로 Unity는 MonoDevelop를 사용하지만 Unity의 Preferences의 External Tools 패널에서 변경할 수 있습니다.

스크립트는 Unity 내부 처리와 연계하기 위해 MonoBehaviour라는 기본 클래스의 파생 클래스를 구현합니다. 클래스는 게임 오브젝트에 연결할 수 있는 새로운 유형의 컴포넌트를 만들기 위한 청사진이라고 할 수 있습니다. 청사진에 기초하여 오브젝트의 새 인스턴스를 만듭니다. 만들 파일 이름과 일치하도록 클래스 이름이 붙여져 있습니다. 클래스 이름과 파일 이름이 일치하지 않으면 게임 오브젝트에 연결된 스크립트 컴포넌트는 무효가 됩니다.

 

클래스에 정의된 두 함수에 주목하십시오. Update 함수는 게임 오브젝트의 프레임 업데이트를 처리하는 코드를 삽입하는 장소입니다. 어떤 동작을 시키거나, 무언가를 실행시키거나 또는 사용자 입력 조작에 반응하고, 시간의 경과와 함께 처리되는 게임 안의 모든 것을 포함합니다. Update 함수에서 필요한 작업을 수행하기 위해서는 변수의 설정, 설정을 읽고 게임 안의 작업이 수행되기 전에 다른 게임 오브젝트와의 결합을 수행합니다. Start 함수는 게임 플레이 직전에 Unity 의해 호출되어, 모두 초기화 할 수 있는 좋은 장소입니다.

 

일단은 각각의 Ui Object의 방향과 크기를 가져오기 위해 변수를 2개 선언해줍니다.

 

rect_Back은 조이스틱 배경에 대한 방향과 크기를 담을 변수고

rect_JoyStick은 조이스틱에 대한 방향과 크기를 담을 변수입니다.

private float radius;



void Start()

{

     radius = rect_Back.rect.width * 0.5F;

}

 

그리고 JoyStick이 배경화면을 넘어가면 안되니 배경화면의 반지름을 가지고 있는 변수를 선언 해줍니다. 그리고 Start 함수에 radius값을 초기화 시켜줍니다.

그리고 조이스틱 움직임을 감지하기위해 3가지 인터페이스를 구현해야합니다.

일단 terDownHandler,IPointerUpHandler,IDragHandler 인터페이스를 선언해줍니다.

 

public class JoyStickScript : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IDragHandler

 

마우스 드래그 리스너인 Ondrag 함수에서 이벤트를 받아 Joystick의 포지션값을 설정해 주겠습니다.

 public void OnDrag(PointerEventData eventData) 
    { 
        //Vector2로 강제 형변환 rect_Back.position은 Vector3 
        Vector2 value = eventData.position - (Vector2)rect_Back.position; 
        //맥스값고정 
        value = Vector2.ClampMagnitude(value, radius); 
        rect_JoyStick.localPosition = value; 
    }

 

일단 value라는 변수를 선언해서 DragEvent의 포지션 값에서 배경에 대한 포지션 값을 빼줌으로써 Joystick의 위치를 계산합니다.

Vector2.ClampMagnitude는 아까 구했던 배경의 radius값을 최대값으로 두어서 JoyStick이 배경 안에서만 움직일 수 있도록 Value의 Max값을 설정해주는 겁니다.

이렇게 함수를 다적어주면 조이스틱 기본 동작에 대한건 끝이 납니다.

ctrl+s로 저장하고 다시 유니티로 가서 스크립트를 버튼 배경에 넣어줘야합니다.

넣는 방법은 엄청 간단합니다. 단순하게 assets에 있는 JoyStickScript를 드래그로 끌어다가 Hierarchy에 Joystickback에다가 드롭해주시면 Joystickback에 스크립트가 들어가게 됩니다. 잘들어갔다면 Joystickback의 Inspector에서 확인 할 수 있습니다.

 

그리고 이제 아까 SerializeFeield로 선언한 변수에 대해서 해당 Object를 넣어주시기만 하면됩니다.

 

이대로 시작을 하게되면 아마 조이스틱이 드래그해서 놨을 때 제자리로 돌아가지 않을겁니다. 이를 해결해주려면 다시 스크립트로 넘어가서 수정을 해줘야합니다.

마우스 드래그가 끝나는 시점을 감지하는 OnPointUp 함수에서 JoyStick의 localPosition을 0으로 초기화 시켜주면 됩니다.

 

여기서 Vector3.zero는 Vector(0,0,0)과 같은 의미입니다.

이렇게 초기화 해주시고 저장해서 다시 실행하면 정상적으로 작동 합니다.

Comments