728x90
이 글은 Inflearn - Rookiss : C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 강의를 듣고 정리한 글입니다.

 

목차.

  1. 개요
  2. 소스코드
  3. 코드설명

 

개요

 

마우스 클릭으로 캐릭터를 이동하는 기능이 많은 게임에서 이용되는데 예를들어 스타크래프트, 리그오브레전드 등이 있고 주로 마우스를 우클릭을 하면 해당 지점으로 캐릭터가 이동을 하는데 이것을 코드로 구현해보겠습니다.

 

구현할 기능

 

 

소스코드

  float _speed = 10.0f;

  bool _moveToDest = false;
  Vector3 _destPos;
  RaycastHit hit;
  
  void Start()
  {
     Managers.Input.MouseAction -= OnMouseClicked;
     Managers.Input.MouseAction += OnMouseClicked;
  }
  void Update()
  {
     if (_moveToDest)
       {
          Vector3 dir = _destPos - transform.position;

          if (dir.magnitude < 0.0001f)
            {
                _moveToDest = false;
            }
          else {
                float moveDist = Mathf.Clamp(_speed * Time.deltaTime, 0, dir.magnitude);
                transform.position += dir.normalized * moveDist;
                transform.LookAt(_destPos);
            }
        }
    }
  void OnMouseClicked() {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);

        if (Physics.Raycast(ray, out hit, 100.0f, LayerMask.GetMask("Wall"))) {
          _destPos =   hit.point;
          _moveToDest = true;
        }

 

 

코드설명

 

_moveToDest : 목적지 도착 여부로 오브젝트가 목적지에 도착시 false

* Update에서 dir.magnitude<0.0001f를 한 이유는 정확하게 0이 되지는 않기 때문에 특정 값보다 작아지면 멈추도록 설정

 

Vector3 dir : 목적지 - 나의 위치를 통해 방향 벡터를 구함

 

_destPos : Raycast를 통해 hit.point의 정보를 받아옴

* Camera.main.ScreenPointToRay는 스크린 포인트를 Ray로 반환해줌,Input.mousePosition을 매개변수로 사용하였음

 

moveDis : Mathf.Clamp함수를 사용하여 플레이어의 속도가 지정한 범위를 넘지않도록 하였음

* dir.magnitude의 값은 오브젝트가 목적지에 가까워질수록 작아짐

 

 

 

 

더 자세한 내용은 해당 강의를 통해 들을 수 있습니다.

728x90

+ Recent posts