์ ๋ฒ ๊ธ์์ ๊ธฐ๋ณธ์ ์ธ ์ ํ ์ ๋๋์๋ค. ์ด๋ฒ ๊ธ์์๋ ์ ๋ ฅ๊ฐ์ ์คํฌ๋ฆฝํธ(script)์ ์ ๋ฌํ๋ ๋ฐฉ์ ์ค 2๊ฐ์ง ์ ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ง์ ์ ์ดํ๋ ๊ฑธ ํด๋ณด๊ณ ์ ํ๋ค. Player ๊ฒ์ ์ค๋ธ์ ํธ์ Player Input ์ปดํฌ๋ํธ๋ฅผ ๋ถ์ฐฉํ์๋ค. ํค๋ฅผ ์ ๋ ฅํ๋ค๋ฉด, ํค๋ณด๋๋ก ๋ค์ด์จ ์ ๋ ฅ๊ฐ์ ์ฃผ์ธ๊ณต ์บ๋ฆญํฐ์๊ฒ ์ ๋ฌํด์ค์ผ ํ๋ค.
1. ๋ก์ง์ ์ ์ดํ ์คํฌ๋ฆฝํธ(script) ๋ถ์ฐฉํ๊ธฐ
Player ๊ฒ์ ์ค๋ธ์ ํธ์ ํค ์ ๋ ฅ๊ฐ์ ์ ๋ฌ๋ฐ๊ณ , ํด๋น ๋ก์ง์ ์ ์ดํ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ ๋ถ์ฌ์คฌ๋ค.
- Send Messages, Broadcast Messages : ์ ๋ํฐ์ Send Message ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ํน์ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์
- Invoke Unity Events, Invoke C Sharp Events : ์ ๋ํฐ๋ C#์ ์ด๋ฒคํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ฐฉ์
- ์ ๋ฐฉ์๋ค์ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์์คํ์ด์ค ์ ์ฉ์ด ํ์
using UnityEngine.InputSystem;
Send Messages ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒฝ์ฐ
- ํน์ ํค๊ฐ ๋ค์ด์ค๋ฉด, ํน์ ํ ํจ์๋ฅผ ์๋์ผ๋ก ํธ์ถํ๋ ๋ฐฉ์
- Broadcast Messages์ ๊ฒฝ์ฐ, ํ์ ๊ณ์ธต์ ์๋ ์ค๋ธ์ ํธ๋ค๊น์ง ์ ์ด๋ฅผ ํ ์ ์๋ค.
- ํจ์๋ช
์ด "On + Actions name"์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ์๋ฅผ ๋ค์ด, "Move"๋ผ๋ Actions๊ฐ ์๋ค๋ฉด, ํจ์๋ช ์ "OnMove"
- ์์ ๊ฐ์ด ํจ์๋ช ์ ๊ตฌ์ฑํ ํ ํด๋น Actions์ ํค ์ ๋ ฅ์ด ๋ค์ด์์ ๊ฒฝ์ฐ, OnMove() ํจ์๋ฅผ ์ฐพ์๊ฐ๋ค.
ํ์ฌ Player ์บ๋ฆญํฐ์ ์ ์ฉํ๋๋ก ๋ง๋ค์ด ๋์ Action Map์ "Move"์ "Jump" ์ด ์๋ค.
ํด๋น Actions์์ ๋ฐ๋ ํค๋ฅผ ์ ๋ ฅํ๊ฒ ๋๋ฉด, On + Actions name ์ด๋ฆ์ธ ํจ์๋ฅผ ์๋์ผ๋ก ํธ์ถํ๊ฒ ๋๋ค.
void OnMove(InputValue value) // "Move" Actions์ ํด๋นํ๋ ํค ์
๋ ฅ ์ ์๋ ํธ์ถ
{
...
}
void OnJump() // "Jump" Actions์ ํด๋นํ๋ ํค ์
๋ ฅ ์ ์๋ ํธ์ถ
{
// Jump๋ Action Type์ "Button"์ผ๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋งค๊ฐ๋ณ์๊ฐ ์๋ค.
// ํจ์๊ฐ ํธ์ถ๋๋ฉด ํค๊ฐ ์
๋ ฅ๋ ๊ฒ, ํธ์ถ๋์ง ์์ผ๋ฉด ์
๋ ฅ๋์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
...
}
Tip) Action Type์ด "Value"์ธ ํค ํธ์ถ์ ์ ๋ ฅ๊ณผ ์ ๋ ฅ๋์ง ์์ ๋, ์ด๋ ๊ฒ ๋ ๋ฒ ํธ์ถ๋๋ค.
void OnMove(InputValue value)
{
Vector2 input = value.Get<Vector2>();
// ์ด์ ๊ฒ์๊ธ์ ๋ณด๋ฉด, "Move" Actions์ ํด๋นํ๋ ํค ๋ฆฌํด์ 'Vector2'๋ก ๋ฐ๊ธฐ๋ก ํ๋ค.
Debug.Log($"SEND_MESSAGE : {input}");
}
์ํ์ข์ฐ ์๋ฌด ํค๋ ๋๋ฌ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํจ์๊ฐ ๋ ๋ฒ ํธ์ถ๋๋ค.
์ฆ, ํค๋ฅผ ๋๋ฅผ ๋๋ ํด๋น ํค ์ ๋ ฅ์ ๋ํ ํจ์ ํธ์ถ์ด ์ด๋ฃจ์ด์ง๊ณ , ํค๋ฅผ ๋ค์ ๋ ๋ ๋ํ ํจ์ ํธ์ถ์ด ์ด๋ฃจ์ด์ง๋ค.
์ค์ต์ผ๋ก OnMove() ํจ์ ํ๋๋ง ๋ก์ง์ ์์ฑํด๋ณด์.
private Vector3 moveDirection;
private float moveSpeed = 4f;
void Update()
{
bool hasControl = (moveDirection != Vector3.zero);
if(hasControl)
{
transform.rotation = Quaternion.LookRotation(moveDirection);
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
}
}
void OnMove(InputValue value)
{
Vector2 input = value.Get<Vector2>();
if(input != null)
{
moveDirection = new Vector3(input.x, 0f, input.y);
Debug.Log($"SEND_MESSAGE : {input.magnitude}");
}
}
์ด๋ ๋ก์ง์ ์ ๊ตฌํ๋์ ๊ฒ์ด๋ค.
Invoke Unity Events ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒฝ์ฐ
- Unity์ Event ๋ฐฉ์์ ์ฌ์ฉ
- ํด๋น Actions์ ๋ํ ํค ์ ๋ ฅ์ด ๋ค์ด์์ ๊ฒฝ์ฐ, ์ค์ ํ ์ด๋ฒคํธ ํจ์๋ฅผ ํธ์ถํด์ค๋ค.
์ ๋ํฐ ์ด๋ฒคํธ ํธ์ถ ๋ฐฉ์์ฒ๋ผ ํธ์ถํ ํจ์๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
๊ธฐ์กด ๋ก์ง์ ๋๊ฐ์ผ๋ฏ๋ก ํจ์๋ง Invoke Unity Events ๋ฐฉ์์ ๋ง๊ฒ ์กฐ๊ธ ์์ ํด์ฃผ์๋ค.
public void OnMove(InputAction.CallbackContext context)
{
Vector2 input = context.ReadValue<Vector2>();
if(input != null)
{
moveDirection = new Vector3(input.x, 0f, input.y);
Debug.Log($"UNITY_EVENTS : {input.magnitude}");
}
}
public void OnJump(InputAction.CallbackContext context)
{
if(context.performed) // Action Type์ด "Button"์ผ ๊ฒฝ์ฐ ํค๊ฐ ๋๋ ธ๋์ง ์ฒดํฌ
{
// ์ ํ ๋ก์ง
}
}
Send Messages์ ๋ฌ๋ฆฌ "On + Actions name"์ผ๋ก ํจ์๋ช ์ ์ง์ ํ์๋ ์์ผ๋, ์ด๋ฒคํธ ํจ์์ ๋ํ ๋ค์ด๋ฐ ๊ท์น, On์ ์ ์ฉํด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์คํํฐ(Inspector) ์ฐฝ์์ ์ด๋ฒคํธ ํจ์๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.
์ฃผ์ํ ์ ์ด ์๋๋ฐ, ํจ์์ ์ ๊ทผ์ง์ ์๋ฅผ public์ผ๋ก ํด์ค์ผ Inspector ์ฐฝ์์ ์ด๋ฒคํธ ํจ์ ๋ฑ๋ก์ ํ ์ ์๋ค.
์ ํ๋ ๋๊ฐ์ด ์ ์ฉํด์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ ๋ฒ ํ ์คํธ๋ฅผ ํด๋ดค๋ค.
์ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
ํ์ํ ๋ถ๋ค์ ์ํ Player ์คํฌ๋ฆฝํธ ์ ์ฒด ์ฝ๋
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
private Animator _animator;
private Vector3 moveDirection;
private float moveSpeed = 4f;
void Start()
{
_animator = this.GetComponent<Animator>();
}
void Update()
{
bool hasControl = (moveDirection != Vector3.zero);
if (hasControl)
{
transform.rotation = Quaternion.LookRotation(moveDirection);
transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
}
}
#region SEND_MESSAGE
void OnMove(InputValue value)
{
Vector2 input = value.Get<Vector2>(); // ์
๋ ฅ ๋ฐ์ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ
if(input != null)
{
moveDirection = new Vector3(input.x, 0f, input.y);
_animator.SetFloat("moveSpeed", input.magnitude); // magnitude๋ ๋ฒกํฐ์ ๊ธธ์ด
Debug.Log($"SEND_MESSAGE : {input.magnitude}");
}
}
void OnJump()
{
// ์ ํ์ ๊ดํ ๋ก์ง
}
#endregion
#region UNITY_EVENTS
public void OnMove(InputAction.CallbackContext context) // Unity Event๋ก ๋ฐ์ ๊ฒฝ์ฐ
{
Vector2 input = context.ReadValue<Vector2>();
if (input != null)
{
moveDirection = new Vector3(input.x, 0f, input.y);
_animator.SetFloat("moveSpeed", input.magnitude);
Debug.Log($"UNITY_EVENTS : {input.magnitude}");
}
}
public void OnJump(InputAction.CallbackContext context)
{
if (context.performed)
{
Debug.Log("Unity Event Jump");
}
}
#endregion
}
์์ฝ
- Actions Map์ Actions์์ ์ค์ ํ ํค ์ ๋ ฅ์ ์คํฌ๋ฆฝํธ๋ก ์ ๋ฌํด์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก Behavior๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- Behavior๊ฐ ์ง์ํ๋ ๊ธฐ๋ฅ์ Send Messages, Broadcast Messages, Invoke Unity Events, Invoke C sharp Events๊ฐ ์๋ค.
- Send Messages, Broadcast Messages๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํจ์๋ช ์ On + Actions name์ผ๋ก ์ค์ ํด์ค์ผ ํค ์ ๋ ฅ์ ๋ํด ํจ์๊ฐ ์๋์ผ๋ก ํธ์ถ๋๋ค.
- ์ด๋ฒคํธ(Event)๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํจ์์ ์ ๊ทผ์ง์ ์๋ฅผ public์ผ๋ก ์ ์ธํด์ผ ํ๋ค.
- ์ด๋ค ๋ฐฉ์์ ๊ณ ๋ฅผ์ง๋ ๊ฐ์ธ์ด ์ ํธํ๋ ์ทจํฅ์ ๋ฐ๋ผ ์ ํํ๋ฉด ๋๋ค.
- ๊ฐ์ธ์ ์ผ๋ก Send Messages, Broadcast Messages ๋ฐฉ๋ฒ์ C#์ ๋ฆฌํ๋ ์ (Reflection) ๊ธฐ๋ฅ์ ์์กดํด์ ์ฑ๋ฅ์ ๊ทธ๋ฆฌ ์ข์ง ์๋ค๊ณ ๋ค์๋ค.