이전 포스트에서는 Action Asset의 세부사항과 구성에 대해 알아보았습니다.
이번 포스트에서는 본격적으로 Action Asset을 C# 스크립트에서 사용하는 방식에 대해 알아보겠습니다.
스크립트에서 Action Asset을 사용하는 방식은 총 2가지로 구분할 수 있습니다.
1) Inspector 참조를 통한 사용
사용하는 코드는 다음과 같습니다.
public class InspectorRef : MonoBehaviour
{
// Action Asset
public InputActionAsset actionAsset;
// Action Asset 아래의 Action Map
private InputActionMap inGround;
// Action Map 아래의 Action
private InputAction moveAction;
private InputAction spaceAction;
public float valueX;
public bool tryToPress;
private void Awake()
{
// Action Asset으로 InputAction을 연결
// spaceAction = actionAsset.FindActionMap("InGround").FindAction("Press");
// Action Map으로 InputAction을 연결
inGround = actionAsset.FindActionMap("InGround");
spaceAction = inGround.FindAction("Press");
moveAction = inGround.FindAction("MoveHorizontal");
}
private void OnEnable()
{
spaceAction.performed += PressExample;
spaceAction.canceled += PressStopExample;
// Action Asset을 활성화 - 연결된 모든 ActionMap이 활성화됨
// actionAsset.Enable();
// Action Map을 활성화 - 연결된 모든 Action이 활성화됨
inGround.Enable();
}
private void OnDisable()
{
spaceAction.performed -= PressExample;
spaceAction.canceled -= PressStopExample;
// Action Asset을 비활성화 - 연결된 모든 ActionMap이 비활성화됨
// actionAsset.Disable();
// Action Map을 비활성화 - 연결된 모든 Action이 비활성화됨
inGround.Disable();
}
private void Start()
{
}
private void Update()
{
valueX = moveAction.ReadValue<float>();
Debug.Log("valueX : " + valueX);
}
private void PressExample(InputAction.CallbackContext value)
{
tryToPress = true;
Debug.Log("tryToPress : " + tryToPress);
}
private void PressStopExample(InputAction.CallbackContext value)
{
tryToPress = false;
Debug.Log("tryToPress : " + tryToPress);
}
}
총 2개의 Action을 사용하는데 다음과 같습니다.
Inspector 참조라고 불리는 가장 큰 이유는
사용하는 Input Asset을 Inspector 창에서 설정해야 하기 때문입니다.
위의 코드인 InspectorRef를 컴포넌트로 설정한 후 Inspector 창을 살펴보겠습니다.
Input Asset을 Inspector 창에서 참조로 넘겨주는 것을 확인할 수 있습니다.
다음으로 실행 결과를 살펴보겠습니다.
위와 같이 잘 실행되는 것을 확인할 수 있습니다.
다음으로는 Input Asset을 사용하는 다른 방법인 C# 클래스 래핑을 알아보겠습니다.
2) C# 래핑 클래스를 사용
C# 클래스 래핑은 수행하기 전 먼저 Action Asset에서 작업을 하나 수행해야 합니다.
Generate C# Class를 실행하여 동일한 이름의 C# 클래스를 하나 생성하겠습니다.
아무런 설정없이 생성하면
Action Asset과 동일한 이름의 동일한 경로에 스크립트가 생성됨을 확인할 수 있습니다.
이제 코드로 넘어가보겠습니다.
public class ActionAssetClassRef : MonoBehaviour
{
// 생성된 InputAsset의 클래스를 인스턴스로 가져옴
private ActionAsset actionAsset;
public float valueX;
public bool tryToPress;
private void Awake()
{
actionAsset = new ActionAsset();
}
private void OnEnable()
{
actionAsset.InGround.Press.performed += PressExample;
actionAsset.InGround.Press.canceled += PressStopExample;
// InputAsset 클래스에서 ActionMap을 가져와 활성화
// actionAsset.PlayerNormal.Enable();
// InputAsset 클래스에서 InputAsset을 활성화
actionAsset.Enable();
}
private void OnDisable()
{
actionAsset.InGround.Press.performed += PressExample;
actionAsset.InGround.Press.canceled += PressStopExample;
// InputAsset 클래스에서 ActionMap을 가져와 비활성화
// actionAsset.InGround.Disable();
// InputAsset 클래스에서 InputAsset을 비활성화
actionAsset.Disable();
}
private void Start()
{
}
private void Update()
{
valueX = actionAsset.InGround.MoveHorizontal.ReadValue<float>();
Debug.Log("valueX : " + valueX);
}
private void PressExample(InputAction.CallbackContext value)
{
tryToPress = true;
Debug.Log("tryToPress : " + tryToPress);
}
private void PressStopExample(InputAction.CallbackContext value)
{
tryToPress = false;
Debug.Log("tryToPress : " + tryToPress);
}
}
기존의 Inspector 참조에 비해 문자열을 사용하지 않아
ActionMap이나 Action의 이름이 일치하지 않아 발생하는 문제를 줄일 수 있습니다.
또 기존의 Inspector 참조에서는 ActionMap을 활성화/비활성화하였지만,
이번에는 ActionAsset을 활성화/비활성화하여 입력을 수행하도록 설정하였습니다.
그리고 Inspector 참조와 가장 큰 차이점으로는
래핑 클래스를 사용하는 경우 Input Asset의 변경점을
따로 Save Asset으로 반영하지 않아도 즉시 반영한다는 차이점이 존재합니다.
최종적으로 사용 결과를 한번 살펴보겠습니다.
위와 같이 문제없이 실행되는 것을 볼 수 있습니다.
'유니티 엔진 > 입력 처리 심화' 카테고리의 다른 글
유니티 입력 처리 심화 - (5) Action의 Processor (0) | 2024.12.25 |
---|---|
유니티 입력 처리 심화 - (4) Action의 Interaction (0) | 2024.12.25 |
유니티 입력 처리 심화 - (3) Action Asset 방식_01 (0) | 2024.12.24 |
유니티 입력 처리 심화 - (2) 임베디드 방식 (0) | 2024.12.10 |
유니티 입력 처리 심화 - (1) Direct 방식 (0) | 2024.12.09 |