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
}

+ Recent posts