Short Cake
Editing a Mii - Nintendo Wii U

사생활 보호 설정

https://gamjia.tistory.com

Mini Rooms

  • 내 미니룸
  • 미니미설정
  • 미니룸설정
  • 답글수 [0]

What Friends Say

한마디로 표현해봐~

1촌평 관리

[Unity] 움직이는 재미! 플레이어 조작의 모든 것 🕹️

GamJia 2025. 5. 11. 00:00

안녕하세요 게임 개발자 GamJia 입니다

오늘은 Unity에서 키보드, 마우스, 터치 입력으로

Unity Chan을 직접 움직이고 제어하는 방법을 배워보겠습니다.

 

Unity편에서만 특별히 기존 Legacy 입력과

Input System 입력을 구분지어서 설명 드릴게요!


✍️
 이 글에서 다룰 내용
✅ 프로젝트 준비: Unity Chan과 Rigidbody 설정
  기존 Input Manager 키보드 입력
  기존 Input Manager 클릭/터치 조작 추가
  Input System 패키지 이해 및 키보드 입력
  Input System으로 클릭/터치 조작 추가


이번 튜토리얼을 위해 Unity Chan 모델을 Scene에 추가하고

Component 설정을 이미지와 동일하게 설정 해주세요!

만약 없다면 이 게시글을 참고해주세요!

 

[Unity] Unity 처음이라면? 꼭 봐야 할 입문 가이드 📘

안녕하세요 게임 개발자 GamJia 입니다 오늘은 Unity로 게임 개발을 시작하시는 분들을 위해설치부터 프로젝트 생성, 인터페이스 핵심 기능까지 쉽게 설명해드리려고 합니다!✍️ 이 글에서 다룰

gamjia.tistory.com

 

가장 먼저 UnityChanController라는 Script를 생성하고,

기존 Input Manager를 사용하여 키보드 입력을 처리하는 코드를 작성해볼게요.

using UnityEngine;
// using UnityEngine.InputSystem; // Input System은 아직 사용하지 않으므로 주석 처리

public class UnityChanController : MonoBehaviour
{
    [Header("Movement Settings")]
    public float moveSpeed = 5f; // 캐릭터 이동 속도
    public float jumpForce = 5f; // 점프 힘

    private Rigidbody rigidbody; // 물리 계산을 위한 Rigidbody 컴포넌트
    private Vector3 targetPosition; // 마우스 클릭 이동을 위한 목표 지점

    void Awake()
    {
        // 게임이 시작될 때 Rigidbody 컴포넌트 참조를 가져옵니다.
        rigidbody = GetComponent<Rigidbody>();
        // 초기 목표 위치는 현재 캐릭터 위치로 설정합니다.
        targetPosition = transform.position;
    }

    void FixedUpdate()
    {
        // 물리 업데이트 주기마다 키보드 입력에 따라 각 이동 함수를 호출하거나,
        // 마우스 클릭 이동을 처리합니다.
        HandleInputAndMovement();
    }

    void Update()
    {
        // 점프 감지는 Update에서 처리합니다. 
        HandleJumpInput();
    }

    void HandleInputAndMovement()
    {
        float horizontalInput = Input.GetAxisRaw("Horizontal"); // 좌우 입력 (A/D 또는 방향키 좌우)
        float verticalInput = Input.GetAxisRaw("Vertical");     // 앞뒤 입력 (W/S 또는 방향키 상하)

        // 키보드 입력이 있을 경우, 해당 방향으로 이동
        if (verticalInput > 0)
        {
            MoveForward();
        }
        else if (verticalInput < 0)
        {
            MoveBackward();
        }

        if (horizontalInput > 0)
        {
            MoveRight();
        }
        else if (horizontalInput < 0)
        {
            MoveLeft();
        }
        
    }


    void HandleJumpInput()
    {
        // 스페이스바를 눌렀을 때 점프
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }

    }

    // 캐릭터를 앞으로 이동시키는 함수
    public void MoveForward()
    {
        rigidbody.velocity = Vector3.forward * moveSpeed + new Vector3(0, rigidbody.velocity.y, 0);
        // 이동 시작 시 마우스 클릭 목표를 현재 위치로 초기화하여 키보드/UI 이동 우선시
        targetPosition = transform.position;
    }

    // 캐릭터를 뒤로 이동시키는 함수
    public void MoveBackward()
    {
        rigidbody.velocity = Vector3.back * moveSpeed + new Vector3(0, rigidbody.velocity.y, 0);
        targetPosition = transform.position;
    }

    // 캐릭터를 왼쪽으로 이동시키는 함수
    public void MoveLeft()
    {
        rigidbody.velocity = Vector3.left * moveSpeed + new Vector3(0, rigidbody.velocity.y, 0);
        targetPosition = transform.position;
    }

    // 캐릭터를 오른쪽으로 이동시키는 함수
    public void MoveRight()
    {
        rigidbody.velocity = Vector3.right * moveSpeed + new Vector3(0, rigidbody.velocity.y, 0);
        targetPosition = transform.position;
    }

    // 캐릭터를 점프시키는 함수
    public void Jump()
    {
        rigidbody.velocity = new Vector3(rigidbody.velocity.x, jumpForce, rigidbody.velocity.z);
    }
}

 

코드 설명
void FixedUpdate() 물리 연산이 수행되는 고정된 시간 간격마다 호출되는 함수입니다.
캐릭터 이동과 같이 Rigidbody의 속도를 직접 제어하는 물리 관련 코드는 FixedUpdate에 작성하는 것이 좋습니다. 여기서 HandleInputAndMovement()를 호출하여 모든 이동 로직을 처리합니다.
HandleInputAndMovement() 키보드 입력이 있을 경우 해당 방향으로 이동하며,
키보드 입력이 없고 targetPosition으로 이동 중일 경우 해당 목표를 향해 이동합니다.
float horizontalInput = Input.GetAxisRaw("Horizontal"); "Horizontal" 축(좌우 방향)의 입력 값을 가져옵니다. 일반적으로 A/D 키 또는 좌우 방향키에 매핑되어 있습니다. Raw는 -1(왼쪽), 0(정지), 1(오른쪽)의 정수 값을 즉시 반환합니다.
float verticalInput = Input.GetAxisRaw("Vertical"); "Vertical" 축(앞뒤 방향)의 입력 값을 가져옵니다. 일반적으로 W/S 키 또는 상하 방향키에 매핑되어 있습니다. Raw는 -1(뒤), 0(정지), 1(앞)의 정수 값을 즉시 반환합니다.
if (verticalInput > 0) { MoveForward(); } 앞 방향 입력(W 키 또는 ⬆️ 키)이 감지되면 MoveForward() 함수를 호출하여 캐릭터를 앞으로 이동시킵니다. 다른 방향 입력도 유사하게 해당 이동 함수를 호출합니다.

회전은 안해서 이상하지만 그 내용은 이후에 추가할게요^^;

Script 저장 후 게임을 실행하고 방향키를 눌러 보세요

W, A, S, D 또는 방향키를 사용해서 Unity Chan을 앞, 뒤, 좌, 우로 움직일 수 있고,

스페이스바를 누르면 점프하는 것을 확인할 수 있을 거예요!

혹시 Input Manager의 키 설정을 변경하고 싶다면

Project Settings > Input Manager에서

설정을 변경할 수 있답니다!


이제 UnityChanController 스크립트에 Legacy Input 방식을 사용하여

마우스 클릭으로 이동하는 기능과, 터치로 점프하는 기능을 추가해볼게요.

그 전에 UI Setting을 먼저 해주겠습니다

 

여러분은 Package만 Import 해주시면 됩니다!

UI Setting은 제가 미리해두었습니다ㅎㅎ

Controller Canvas.unitypackage
0.03MB

 

Scene에 적용하면 이런 모습입니다

방금 불러온 Prefab 우클릭 해서

Prefab > Unpack 해줄게요!

(Unity Chan에 연결된 Script를 같이 쓰기 위해 풀어주었습니다!)

 

UnityChanController Component가 있는

Unity Chan을 On Click Event에 연결해주고

각각의 버튼에 맞는 이벤트를 연결해주세요!

아까 키보드 조종처럼 버튼으로도

Unity Chan을 자유롭게 움직이는 모습입니다!

버튼 눌린게 잘 안 보이지만 열심히 누르고 있습니다^^..


이제 이전에 작성한 UnityChanController Script의 내용을

Unity Input System 버전으로 바꿔볼게요.

Input System은 더 유연하고 확장 가능한 입력 처리를 제공한답니다.

Unity Input System

Input System을 사용하기 위해서는 해당 Package가 필요합니다

Package Manager > Input System을 찾아서

Install 해주겠습니다!

Input System Package Install이 완료 돼면

Player Input이라는 Component 추가가 가능해집니다

추가해주고 Create Actions 버튼을 클릭해

Input Action Profile을 생성해주겠습니다!

Action을 추가하면 이런 창이 뜨게 됩니다

여러가지 Property 값들을 설정할 수 있는데요

각각의 Property에 대한 설명은 다음과 같습니다

이름 속성
Value 값 입력용. float, Vector2 등 연속된 입력값 (이동 방향 등)
Button 누름 여부만 확인. 참/거짓 반환 (점프, 공격 등)
Pass
Through
상위 처리 없이 원본 값 그대로 전달. 여러 입력 소스 혼합 시 유용

이름 속성
Any 어떤 입력이든 상관없이 받음. 키보드, 마우스, 터치 등 모든 입력 허용
Integer 정수값 입력. 키패드 숫자, UI 목록 인덱스 등 단순 숫자 입력에 사용
Quaternion 3D 회전 정보 (x, y, z, w). VR 컨트롤러, 3D 오브젝트 방향 회전 등에서 사용
Stick 아날로그 스틱 (Gamepad). 보통 Vector2 값을 반환
Touch 터치 스크린 입력. 터치 위치, 강도, ID 등 다양한 속성 포함
Vector 2 2D 방향 입력. WASD, 방향키, 아날로그 스틱 등에서 주로 사용
Vector 3 3D 방향 입력. 3D 이동, 카메라 이동, 중력 방향 등에 사용

이름 속성
Hold 키를 누를 때 작동. 기본적으로 눌렀을 때(performed) 한 번 발동됨
Press 일정 시간 이상 눌러야 작동. 기본은 0.4초 이상 누르면 performed 발생
Slow Tap 짧게 눌렀다 떼면 작동. 일정 시간 내에 눌렀다 뗄 때만 인식 (짧은 클릭)
Tap 누른 후 천천히 뗄 때 작동. Tap과 반대. 길게 눌렀다가 천천히 떼야 인식

이름 속성
Invert Vector 2 x, y 축을 각각 반전시킴. 예: x 반전 시 왼쪽 입력이 오른쪽처럼 처리됨
Normalize
Vector 2
입력 벡터를 길이 1의 단위 벡터로 정규화. 방향만 유지하고 크기 제거
Scale
Vector 2
x/y 값에 지정한 배수 곱함. 입력 감도 조절에 사용 (예: x 2배, y 1배)
Stick
Deadzone
아날로그 스틱 입력의 미세한 움직임 무시. 흔들림 방지, 중심 근처 값 제거
using UnityEngine;
using UnityEngine.InputSystem; // Unity Input System 네임스페이스 추가

public class UnityChanController : MonoBehaviour
{
    [Header("Movement Settings")]
    public float moveSpeed = 5f; // 캐릭터 이동 속도
    public float jumpForce = 5f; // 점프 힘

    private Rigidbody rigidbody; // 물리 계산을 위한 Rigidbody 컴포넌트
    private Vector2 moveInput;   // 입력 시스템을 통해 받은 방향 입력 값 (x: 좌우, y: 앞뒤)

    void Awake()
    {
        // Rigidbody 컴포넌트 참조를 가져옵니다.
        rigidbody = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // FixedUpdate는 물리 연산 주기마다 호출되며, 입력된 방향으로 캐릭터를 이동시킵니다.
        Vector3 moveDirection = new Vector3(moveInput.x, 0, moveInput.y); // 2D → 3D 방향 변환
        rigidbody.velocity = moveDirection.normalized * moveSpeed + new Vector3(0, rigidbody.velocity.y, 0);
    }

    void Update()
    {
        // 점프 감지는 Update에서 처리합니다.
        HandleJumpInput();
    }

    // Unity Input System의 "Move" 액션이 발생할 때 호출됩니다.
    public void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>(); // 방향 벡터 값을 저장 (예: WASD, 조이스틱 등)
    }

    void HandleJumpInput()
    {
        // Input System을 통해 스페이스 키가 이번 프레임에 눌렸는지 확인합니다.
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            Jump();
        }
    }

    // 캐릭터를 점프시키는 함수
    public void Jump()
    {
        rigidbody.velocity = new Vector3(rigidbody.velocity.x, jumpForce, rigidbody.velocity.z);
    }
}
코드 설명
public void OnMove(InputValue value)

Unity Input System에서 "Move" 액션이 발생했을 때 호출됩니다. value에서 방향 벡터(Vector2)를 받아 저장.
moveInput = value.Get<Vector2>(); 입력된 방향 값을 받아서 moveInput 변수에 저장합니다.
이후 물리 이동 시 사용됩니다.
Vector3 moveDirection = new Vector3(moveInput.x, 0, moveInput.y); 2D 방향(Vector2)을 3D 방향(Vector3)으로 변환하여 이동 방향 계산합니다.
rigidbody.velocity = moveDirection.normalized * moveSpeed + new Vector3(0, rigidbody.velocity.y, 0); Rigidbody의 속도를 설정해 실제 이동 처리. 수직 속도(y)는 보존하여 점프나 중력과 충돌하지 않도록 합니다.
if (Keyboard.current.spaceKey.wasPressedThisFrame) Unity Input System에서 스페이스바 입력이 이번 프레임에 눌렸는지 확인합니다.

저장 후 실행 해보면 기존 Input Manager처럼

잘 움직이는걸 확인할 수 있습니다

기능은 동일한데 코드는 간결해져서 너무 좋아요!


마지막으로 Input System을 UI에 연결해보겠습니다

설정 전에 EventSystem에 들어가서

Standalone Input Module를 Input System과 연결해주겠습니다!

버튼에 On-Screen Button Component를 추가해주세요

Jump는 Space 나머지 버튼들은 WASD를 연결해주면 끝!

간단하죠?

버튼에 키보드 기능을 연결 해보았는데요.

잘 기억해뒀다가 이후에 스킬 공격, HP 회복,

뒤로가기 등에도 사용해보세요!


오늘은 Unity의 기존 Input Manager (Legacy Input) 방식

새로운 Input System 방식을 사용하여

Unity Chan을 직접 조작하는 다양한 방법을 배워봤습니다.

이제 여러분은 게임의 인터랙티브성을 높이는 방법을 이해하고,

키보드, UI 버튼을 통해 캐릭터를 제어할 수 있게 되었을 거예요!

 

앞으로도 Unity를 처음 시작하는 분들을 위해
실전 팁과 초보자용 가이드를 계속 공유할 예정이니,
다음 글도 기대해주세요!

감사합니다!