실행하다보니 플레이어를 마우스로 좌우로 회전 컨트롤 하는게 잘 안된다. 

처음에는 마우스로 우클릭을 하면 그 지점을 바라보는 걸 할려고 했다.

물론 스크린좌표를 월드좌표로 변환해서 레이를 쏴서 그 오브젝트를 바라보게해도 되는데 간단하게 LookAt()을 이용해보겠다.

스크립트를 하나 만들고  RightClick으로 이름 짓는다. 스크립트를 Player에 적용한다.

Monster 인스펙터  TAG가 MONSTER로 되어 있어야 한다.

FindwidhtTag()로 간단히 찾아 monsterTR에 저장하고 LookAt()을 이용해 방향을 바꾼다. 

다만. 순간적으로 바꿔지기 때문에 부드럽게 바꾸려면 다른 함수를 써야 한다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RightClick : MonoBehaviour
{
    // Start is called before the first frame update
    private Transform monsterTr;  //컴포넌트의 캐시를 처리할 변수
    void Start()
    {
        monsterTr = GameObject.FindWithTag("MONSTER").GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(1)) {
            transform.LookAt(monsterTr);
        }
    }
}

다른 방법은  어차피 NavMesh가 적에 적용되어 있으니 그걸 응용해보기로 했다. 목적은 자동추적보다는 플레이어의 자동 회전에 가깝다. 일단 하이리키 Player에 NavMesh Agent를 추가한다.

교재의 프로젝트에 영향을 주지 않게 하기 위해 따로 스크립트도 추가하고 NavCtrl로 이름짓는다.

코드는 간단하다. 마우스 우클릭을 하면 Player가 자동으로 적을 따라가고 다시 우클릭을 하면 멈춘다.

다른 스크립트에도 Navigation을 멈추게 하기 위해  SetNavStop()을 추가한다.

    public void SetNavStop() {
        agent.isStopped = true;
    }

추가된 NavCtrl 전체코드, 대부분 MonsterCtrl에서 NavMesh에 관련된 코드를 복붙했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;  //for Navigation
public class NavCtrl : MonoBehaviour
{
    // Start is called before the first frame update
    private NavMeshAgent agent;
    private Transform monsterTr;  //컴포넌트의 캐시를 처리할 변수

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.isStopped = true; //추적을 중지
        monsterTr = GameObject.FindWithTag("MONSTER").GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(1)) {
            if (agent.isStopped == true) {
                agent.SetDestination(monsterTr.position);  //목표설정
                agent.isStopped = false; //추적을 개시
            } else {
                agent.isStopped = true; //추적을 중지
            }
        }
    }
    public void SetNavStop() {
        agent.isStopped = true;
    }
}

WASD키를 눌렀을때 Navigation을 멈추기 위해 다음 코드를 PlayerCtrl스크립트 PlayerAnim()  맨윗에 추가한다.

 GetComponent<NavCtrl>().SetNavStop();로 NavCtrl의 SetNavStop에 접근할 수 있다. 스크립트 이름이 class이름이고 이걸 GetComponet<T>의 인수로 바로 사용할 수 있다.

void PlayerAnim(float h, float v) {
        GetComponent<NavCtrl>().SetNavStop();

좌클릭을 하면 총이 나갈때도 네비게이션을 멈추게 해야하는데 다행이 멈춘다 . 이유는 각자 찾아보세요. ㅎㅎ 아마 애니메이터의 State가 변하면서 뭔가 바뀌는듯.

+ Recent posts