Behavior - Send Message 옵션

Behavior 속성을 Send Messages로 선택하면 설정한 액션을 void On{액션명}() SendMessage함수를 이용해 호출한다. 

  • 특정 키가 들어오면, 특정한 함수를 자동으로 호출하는 방식
  • Broadcast Messages의 경우, 하위 계층에 있는 오브젝트들까지 제어를 할 수 있다.
  • 함수명이 "On + Actions name"으로 구성된다.
    • 앞에서 Move와 Attack액션을 정의했기 때문에 OnMove, OnAttack함수가 SendMessage를 통해 호출된다.

새로운 스크립트를 만들고 "PlayerCtrl"이라고 변경한다. Warrior에 연결해준다.

#pragma warning disable IDE0051 //함수나 변구를 정의후 사용하지 않는 경고문구를 비활성화하는 구문

using UnityEngine;
using UnityEngine.InputSystem;  //Inputsystem사용을 위해 추가된 namespace

public class PlayerCtrl : MonoBehaviour {
    // Start is called before the first frame update
    void OnMove(InputValue value) {
        Vector2 dir = value.Get<Vector2>();
        Debug.Log($"Move = ({dir.x},{dir.y})");
    }
    void OnAttack() {
        Debug.Log("Attack");
    }
}

이제 키입력을 통해 애니메이션과 이동 처리 로직을 구현한다. PlayerCtrl 스크립트를 다음과 같이 수정한다.

스크립트는 키입력의 이벤트를 통해 애니메이션을 컨트롤 한다.

애니메이션은 Idel, Run, Attack 3가지 뿐이고 방향은 rotation시킨다.

float Movement파라메터를 이용 Idle과 Run애니메이션을 선택하고 bool Attack이 Attack애니메이션을 트리거해준다

#pragma warning disable IDE0051 //함수나 변구를 정의후 사용하지 않는 경고문구를 비활성화하는 구문

using UnityEngine;
using UnityEngine.InputSystem;  //Inputsystem사용을 위해 추가된 namespace

public class PlayerCtrl : MonoBehaviour {
    private Animator anim;
    private Vector3 moveDir;

    void Start () {
        anim = GetComponent<Animator>();  //Animator컴포넌트를 연결
    }
    void Update () {
        if(moveDir != Vector3.zero) {
            transform.rotation = Quaternion.LookRotation(moveDir); //캐릭터회전
            transform.Translate(Vector3.forward * Time.deltaTime * 4.0f); //이동
        }
    }
    void OnMove(InputValue value) {
        Vector2 dir = value.Get<Vector2>();
        moveDir = new Vector3(dir.x,0, dir.y);
        anim.SetFloat("Movement", dir.magnitude);
        Debug.Log($"Move = ({dir.x},{dir.y})");
    }
    void OnAttack() {
        Debug.Log("Attack");
        anim.SetTrigger("Attack");
    }
}

실행해보면 WASD로 이동하고 Space키로 공격하는걸 확인할 수 있다.

 

+ Recent posts