๐ŸŽฎ ์บ๋ฆญํ„ฐ ์›€์ง์ž„(Input System) - ์œ ๋‹ˆํ‹ฐ ๊ตฌํ˜„

VIN'Spellsยท2025๋…„ 11์›” 21์ผ

์œ ๋‹ˆํ‹ฐ6

๋ชฉ๋ก ๋ณด๊ธฐ
10/12
post-thumbnail

์›๋ž˜ ๊ธฐ์กด์˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ๋Š” ์บ๋ฆญํ„ฐ๋ฅผ ์›€์ง์ž„์„ ๊ตฌํ˜„ํ• ๋–„ ์“ฐ๋˜ ๋ฐฉ๋ฒ•์ด๋‹ค.

Input.GetAxisRaw()๋ฅผ ์ด์šฉํ•˜์—ฌ input์„ ๋ฐ›๊ณ  moveSpeed ๊ฐ€์ค‘์น˜๋ฅผ ์ •ํ•ด์ฃผ์–ด ์›€์ง์ด๋Š” ๋ฐฉ๋ฒ•

๋™์•„๋ฆฌ 2.5D ํ”„๋กœ์ ํŠธ ์ž‘์—… ์ค‘ 3Dํ™˜๊ฒฝ์—์„œ 2D์บ๋ฆญํ„ฐ์˜ ์›€์ง์ž„์„ ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜์˜€์„ ๋•Œ ๋ฌธ์ œ(?)๊ฐ€ ์ƒ๊ฒผ๋‹ค.

InvalidOperationException: You are trying to read input using the UnityEngine.Input class but the current active input system is the new Input System package

์ฝ˜์†”์— ์ด๋Ÿฐ ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋ฉด์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ธ๋ฐ ์•Œ๊ณ ๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „ Unity6 3Dํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์—์„  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ƒˆ๋กœ์šด Input System์ด ์„ค์น˜๋˜์–ด์žˆ๊ณ  ๊ธฐ์กด ๋ฐฉ๋ฒ•์€ ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ์–ด ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋‹ค.(Unity6์—” ์ƒˆ๋กœ์šด input System์ด ๊ธฐ๋ณธ์œผ๋กœ ์„ค์น˜๋˜์–ด์žˆ๋‹ค.)

์ฐพ์•„๋ณด๋‹ˆ ์—ฌ๋Ÿฌ ์žฅ์ ๋„ ์žˆ๊ณ  ์•ž์œผ๋กœ ๋ฐ€์–ด์ฃผ๋ ค๋Š” ๋А๋‚Œ์ด์–ด์„œ ์ด๋ฒˆ๊ธฐํšŒ์— ์ด๊ฒƒ์ €๊ฒƒ ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.


๐Ÿ”ฎLegacy Vs New Input System

ํ•ญ๋ชฉInput Manager (Legacy)New Input System
์ž…๋ ฅ ๋ฐฉ์‹Input.GetAxis, Input.GetKey ๊ฐ™์€ ์ฆ‰์‹œ ์ž…๋ ฅ ์ฝ๊ธฐAction ๊ธฐ๋ฐ˜(Move, Jump)์œผ๋กœ ์ถ”์ƒํ™”๋œ ์ž…๋ ฅ ๊ตฌ์กฐ
์ง€์› ๊ธฐ๊ธฐํ‚ค๋ณด๋“œ/๋งˆ์šฐ์Šค ์ค‘์‹ฌ, ํŒจ๋“œ ์ง€์›์€ ์ œํ•œ์ ํ‚ค๋ณด๋“œ/๋งˆ์šฐ์Šค/ํŒจ๋“œ/๋ชจ๋ฐ”์ผ/ํ„ฐ์น˜/VR ๋“ฑ ๊ด‘๋ฒ”์œ„
๋ฉ€ํ‹ฐ ๋””๋ฐ”์ด์Šค ์ฒ˜๋ฆฌ๋ณต์žกํ•จ(์ง์ ‘ ๊ตฌํ˜„ ํ•„์š”)์ž๋™ ๋””๋ฐ”์ด์Šค ๊ฐ์ง€ ๋ฐ ์ „ํ™˜ ์ง€์›
๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด(ํ”Œ๋ ˆ์ด์–ด๋ณ„ ์ž…๋ ฅ ๋ถ„๋ฆฌ)๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊นŒ์›€PlayerInput ์ปดํฌ๋„ŒํŠธ๋กœ ํ”Œ๋ ˆ์ด์–ด๋ณ„ ์ž๋™ ๋ถ„๋ฆฌ๊ฐ€๋Šฅ
์ž…๋ ฅ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํด๋ง ๋ฐฉ์‹๋งŒ ๊ฐ€๋Šฅ(Update์—์„œ ๊ณ„์† ์ฝ์Œ)์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜(started/performed/canceled) ๋˜๋Š” ํด๋ง ๋‘˜ ๋‹ค ๊ฐ€๋Šฅ
์ƒํƒœ ๊ธฐ๋ฐ˜ ์ž…๋ ฅ(ํ™€๋“œ, ๋”๋ธ”ํƒญ ๋“ฑ)์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จInteractions(Press, Hold, Tap) ๊ธฐ๋ณธ ์ œ๊ณต
ํ™•์žฅ์„ฑํ•œ๊ณ„๊ฐ€ ๋งŽ์Œ๋ชจ๋“ˆํ™”/ํ™•์žฅ์„ฑ ๋งค์šฐ ๋†’์Œ
์„ค์ • ๋‚œ์ด๋„๋งค์šฐ ์‰ฌ์›€(์ฝ”๋“œ ๋ช‡ ์ค„)์ดˆ๊ธฐ ์„ธํŒ…์ด ๋ณต์žก, ๋Ÿฌ๋‹์ปค๋ธŒ ์žˆ์Œ
๊ถŒ์žฅ ์‚ฌ์šฉ ์šฉ๋„๊ฐ„๋‹จํ•œ 2D, ์†Œ๊ทœ๋ชจ ๊ฒŒ์ž„, 1์ธ ๊ฐœ๋ฐœ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ, ํŒจ๋“œ/๋ชจ๋ฐ”์ผ ๋Œ€์‘ ๊ฒŒ์ž„, ์ค‘~๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ
Unity ๊ณต์‹ ์ž…์žฅLegacy system, ๋‹จ์ˆœ ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ถŒ์žฅModern system, ์•ž์œผ๋กœ์˜ ํ‘œ์ค€ ๋ฐฉ์‹

ํ™•์‹คํžˆ legacy๋ฐฉ๋ฒ•์ด ๋” ์ง๊ด€์ ์ด๊ธด ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์— ์ต์ˆ™ํ•ด ์ง€๋Š”๊ฒŒ ์žฅ๊ธฐ์ ์œผ๋กœ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ข€ ์ฐพ์•„๋ณด๋‹ˆ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋ฉด ๋งŽ์€ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—” ๊ฐ„๋‹จํ•œ ์›€์ง์ž„ ์ •๋„๋งŒ ์ž‘์„ฑํ•  ์˜ˆ์ •์ด๋‹ค.


๐Ÿ”ฎ 2D ๊ตฌํ˜„

2Dํ”„๋กœ์ ํŠธ๋กœ ์ƒ์„ฑํ–ˆ์„ ๋•Œ input system์ด ์—†์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋•Œ๋Š”
Unity ์ƒ๋‹จ ๋ฉ”๋‰ด Window -> Package Manager ->
Packages: Unity Registry -> Input System ๊ฒ€์ƒ‰ ->
Install ๋ฒ„ํŠผ ํด๋ฆญ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค

์‚ฌ์ง„์— ๋‚˜์˜ค๋Š” ์บ๋ฆญํ„ฐ๋Š” ํŒ€์›์ธ YHJ๋‹˜๊ป˜์„œ ์ œ์ž‘ํ•˜์‹  ์บ๋ฆญํ„ฐ๋‹ค.

(Window -> Package Management -> Package Manager)

(Unity Registry -> Input System ๊ฒ€์ƒ‰ -> Install)

์™„๋ฃŒ ๋˜์—ˆ๋‹ค๋ฉด ์ด์ œ ์˜ค๋ธŒ์ ํŠธ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  Rigidbody 2D์™€ ์ƒˆ๋กœ์šด C#์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ปดํฌ๋„ŒํŠธ๋กœ ๋„ฃ์–ด์ค€๋‹ค.

์ดํ›„ ์Šคํฌ๋ฆฝํŠธ๋Š” ์š”๋ ‡๊ฒŒ

using UnityEngine;
using UnityEngine.InputSystem;
public class Newmove : MonoBehaviour
{
    public float speed = 4f;

    public InputAction moveAction;

    private Rigidbody2D rb;
    private Vector2 input;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

	//์˜ค๋ธŒ์ ํŠธ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™” ์‹œ์ ์— ์•ก์…˜๋„ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”
    void OnEnable()
    {
        moveAction.Enable();
    }

    void OnDisable()
    {
        moveAction.Disable();
    }

    void Update()
    {
        // Move ์•ก์…˜์€ Vector2๋กœ ์ฝ์Œ (x=์ขŒ์šฐ, y=์ƒํ•˜)
        input = moveAction.ReadValue<Vector2>();

        // ๋Œ€๊ฐ์„  ์ด๋™ ์†๋„ ๋ณด์ •
        if (input.sqrMagnitude > 1f)
            input.Normalize();
    }

    void FixedUpdate()
    {
        rb.linearVelocity = input * speed;
    }
}
  • Enable()๊ณผ Disable()
    - ์œ„ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ moveAction์„ ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ๋Š”๋ฐ ์˜ค๋ธŒ์ ํŠธ๋Š” ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ์ด์ง€๋งŒ moveAction๋งŒ ํ™œ์„ฑํ™” ์ƒํƒœ์ผ ๊ฒฝ์šฐ ์ž…๋ ฅ์ด ๊ณ„์† ๋‚จ์•„ ์žˆ์–ด ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ธŒ์ ํŠธ์™€ ํ•จ๊ป˜ ๋น„ํ™œ์„ฑํ™”ํ•ด์ค€๋‹ค.
  • if (input.sqrMagnitude > 1f)
    - ๋Œ€๊ฐ์„  ์ž…๋ ฅ์‹œ ์œ„์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”๋ฐ(sqrMagnitude:๋Œ€๊ฐ์„ ์˜ ๊ธธ์ด^2) ์ž…๋ ฅ๊ฐ’์ด ํ•œ์ชฝ ๋ฐฉํ–ฅ์— ๋น„ํ•ด โˆš2๋ฐฐ ๋” ๋นจ๋ผ์ง€๊ฒŒ ๋˜๋ฏ€๋กœ Normalize()ํ•ด์คŒ์œผ๋กœ์จ ์ผ์ • ๋Œ€๊ฐ์„ ์ผ๋•Œ์—๋„ ์ผ์ • ์†๋„๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

์—ฌ๊ธฐ ๊ณผ์ •๊นŒ์ง€ ํ–ˆ๋‹ค๋ฉด ์ด์ œ ์ธ์ŠคํŽ™ํ„ฐ ์ฐฝ์—์„œ ํ‚ค์„ธํŒ…์„ ํ•ด์ค€๋‹ค

Move Action์—์„œ ์„ค์ • ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ๊ณ  Control Type์„ Vector 2๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

์ง์ ‘ Binding์„ ์„ค์ •ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์ธ ์ƒํ•˜์ขŒ์šฐ ๊ตฌํ˜„์€ Add Up\Down\Left\Right Composite๋ฅผ ํด๋ฆญํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ์ฒ˜๋Ÿผ ๋ฐ”์ธ๋”ฉ์ด ์„ธํŒ…๋œ๋‹ค.

์›ํ•˜๋Š” ์นธ์„ ๋”๋ธ”ํด๋ฆญํ•œ๋’ค ๊ฒ€์ƒ‰์ฐฝ์— ์›ํ•˜๋Š” ํ‚ค๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค(ํŒจ๋“œ ๋ฐ ๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค ๊ฐ€๋Šฅ)

์Šคํฌ๋ฆฐ ์ƒท์œผ๋กœ ์ด๋™ํ•˜๋Š”๊ฒŒ ์ข€ ์ด์ƒํ•œ๋ฐ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„  ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ถ”๊ฐ€ํ•ด์•ผ์ง€...


๐Ÿ”ฎ 3D ๊ตฌํ˜„

3D์—์„œ๋Š” ๊ธฐ์กด ์ฝ”๋“œ์— ์กฐ๊ธˆ๋งŒ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

using UnityEngine;
using UnityEngine.InputSystem;

public class chmove : MonoBehaviour
{
    public float moveSpeed = 4f;
    Rigidbody rb;
    Vector3 input;

    public InputAction moveAction;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void OnEnable() => moveAction.Enable();
    void OnDisable() => moveAction.Disable();

    void Update()
    {
        // Vector3๋กœ ์ž…๋ ฅ ์ฝ๊ธฐ
        Vector3 raw = moveAction.ReadValue<Vector3>();

        // x = ์ขŒ์šฐ, z = ์•ž๋’ค
        input = new Vector3(raw.x, 0f, raw.z);

        // ๋Œ€๊ฐ์„  ์†๋„ ๋ณด์ •
        if (input.sqrMagnitude > 1f)
            input.Normalize();
    }

    void FixedUpdate()
    {
        rb.velocity = input * moveSpeed;
    }
}
  • Rigidbody2D -> Rigidbody๋กœ ๋ณ€๊ฒฝ
  • Vector2 -> Vector3๋ณ€๊ฒฝ

Move Action Control Type์„ Vector3๋กœ ๋ฐ”๊พธ๊ณ  ํ‚ค์…‹ํŒ…์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค
3D์ด๋ฏ€๋กœ ๋ณดํ†ต ์•ž๋’ค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๊ฑด Forward์™€ Backward๋กœ Z๊ฐ’ ๋ณ€๊ฒฝ

์• ๋‹ˆ๋ฉ”์ด์…˜ ์—์…‹๋„ YHJ๋‹˜์ด ์ œ์ž‘ํ•˜์…จ๋‹ค

์œ ๋‹ˆํ‹ฐ ์ ์šฉ ๊ณผ์ •์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์—...

0๊ฐœ์˜ ๋Œ“๊ธ€