유니티 오브젝트 이동 방법(Input, CharacterController, NavMeshAgent)

728x90

Input.GetAxis()와 Translate()를 사용한 이동

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

public class move : MonoBehaviour
{
    void Update()
    {   
        float mH = Input.GetAxis("Horizontal");
        float mV = Input.GetAxis("Vertical");
        Vector3 mov = new Vector3(mH*Time.deltaTime, 0f, mV*Time.deltaTime);
        transform.Translate(mov);
    }
}

CharacterController와 Move()를 사용한 이동

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

public class moveCC : MonoBehaviour
{
    CharacterController cc;
    // Start is called before the first frame update
    void Start()
    {
        cc = GetComponent<CharacterController>();
    }
    // Update is called once per frame
    void Update()
    {
        float mH = Input.GetAxis("Horizontal");
        float mV = Input.GetAxis("Vertical");
        Vector3 mov = new Vector3(mH * Time.deltaTime, 0f, mV * Time.deltaTime);

        cc.Move(mov);
    }
}

CharacterController을 사용하면 오브젝트 앞에 장애물(계단)이 있을 때 올라가게 만들 수 있다. (일반 move함수를 사용하려면 코드가 매우 복잡해짐) 즉, CC에 이미 내장함수 및 옵션들이 적용되어 있기 때문에 다른 오브젝트들과 상호작용하는 복잡한 이동 컨트롤에 유리하다.

 

NavMeshAgent를 사용한 이동

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

public class moveNavi : MonoBehaviour
{
    public Transform targetTrans;
    NavMeshAgent agent;
    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        agent.SetDestination(targetTrans.position);
    }
}
  • Cube에 NavmeshAgent를 추가
  • Window - AI - Navigation 추가 후 Ground 선택 - Object - Navigation Static/walkable & Bake
  • Block 선택 - Object - Navigation Static/not walkable & Bake
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayPoint : MonoBehaviour
{
    public Transform PointObj;
    Ray ray;
    RaycastHit hit;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit))
            {
                PointObj.position = hit.point;
            }
        }
    }
}

포인터의 위치를 표시해줄  Sphere을 생성하고, 포인터의 현재 위치를 표시하는 빈 오브젝트(Create empty) 생성 및 스크립트를 연결해주면 된다. public된 PointObj에 Sphere을 매핑 후 플레이해보면 마우스 클릭 지점에 타겟 지점 생성, Cube가 길을 찾아오게 된다. 

728x90