Behavor 속성중 Invoke C Sharp Events 옵션은 C# 스크립트에서 직접 이벤트를 연결해 사용하는 방식이다. Player Input컴포넌트를 사용할 수도 있고 Input Action에셋과 Player Inptu 컴포넌트 없이 모두 다 스크립트로 처리할 수도 있다.
사용을 위해 Behavior속성을 Invoke C Sharp Events로 변경한다.
PlayerCtrl 스크립트를 다음과 같이 변경한다.
코드를 보면 동적으로 연결할 변수들을 선언한다.
private PlayerInput playerInput; //invoke C# Events용 선언
private InputActionMap mainActionMap; //invoke C# Events용 선언
private InputAction moveAction; //invoke C# Events용 선언
private InputAction attackAction; //invoke C# Events용 선언
이 변수들에 맞는 컴포넌트및 ActionMap, Action등을 연결해준다
playerInput = GetComponent<PlayerInput>(); //PlayerInput 컴포넌트 연결
mainActionMap = playerInput.actions.FindActionMap("PlayerActions");
moveAction = mainActionMap.FindAction("Move"); //Move Action 추출
attackAction = mainActionMap.FindAction("Attack"); // Attack Action추출
이후 액션의 이벤트들이 발생했을때 실행할 로직을 람다식으로 지정한다.
moveAction.performed += ctx => { //중략};
moveAction.canceled += ctx => { //중략};
attackAction.performed += ctx => { //중략};
PlayerCtrl 전체 스크립트
#pragma warning disable IDE0051 //함수나 변구를 정의후 사용하지 않는 경고문구를 비활성화하는 구문
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.InputSystem; //Inputsystem사용을 위해 추가된 namespace
public class PlayerCtrl : MonoBehaviour {
private Animator anim;
private Vector3 moveDir;
private PlayerInput playerInput; //invoke C# Events용 선언
private InputActionMap mainActionMap; //invoke C# Events용 선언
private InputAction moveAction; //invoke C# Events용 선언
private InputAction attackAction; //invoke C# Events용 선언
void Start () {
anim = GetComponent<Animator>(); //Animator컴포넌트를 연결
playerInput = GetComponent<PlayerInput>();
mainActionMap = playerInput.actions.FindActionMap("PlayerActions");
moveAction = mainActionMap.FindAction("Move"); //Move Action 추출
attackAction = mainActionMap.FindAction("Attack"); // Attack Action추출
moveAction.performed += ctx => {
Vector2 dir = ctx.ReadValue<Vector2>();
moveDir = new Vector3(dir.x, 0, dir.y);
anim.SetFloat("Movement", dir.magnitude);
};
moveAction.canceled += ctx => {
moveDir = Vector3.zero;
anim.SetFloat("Movement", 0.0f);
};
attackAction.performed += ctx => {
Debug.Log("Attack by c# event");
anim.SetTrigger("Attack");
};
}
void Update () {
if(moveDir != Vector3.zero) {
transform.rotation = Quaternion.LookRotation(moveDir); //캐릭터회전
transform.Translate(Vector3.forward * Time.deltaTime * 4.0f); //이동
}
}
#region SEND_MESSAGE
//중략
#endregion
#region UNITY_EVENTS
//중략
#endregion
}
'유니티게임강좌 > Input System' 카테고리의 다른 글
[Input system] Input Debug (0) | 2023.03.28 |
---|---|
[Input System] Behavior - Invoke C# event - Direct Binding (0) | 2023.03.28 |
[Input Systems] Behavior - Invoke Unity Evnets (0) | 2023.03.27 |
[Input Systems] Behavior - Send Message (0) | 2023.03.27 |
[Input Systems] Behavior 속성 (0) | 2023.03.27 |