728x90
이 글은 Inflearn - Rookiss : C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 강의를 듣고 정리한 글입니다.
목차.
개요
마우스 클릭으로 캐릭터를 이동하는 기능이 많은 게임에서 이용되는데 예를들어 스타크래프트, 리그오브레전드 등이 있고 주로 마우스를 우클릭을 하면 해당 지점으로 캐릭터가 이동을 하는데 이것을 코드로 구현해보겠습니다.
소스코드
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
'유니티' 카테고리의 다른 글
[Unity] 유니티 : 마우스 드래그로 UI 움직이기 (0) | 2023.07.23 |
---|---|
[Unity 3D] 오브젝트와 플레이어 사이의 카메라 자동 조정 (0) | 2023.07.22 |
[Unity] 유니티 : Cinemachine Body Follow Offset 스크립트 수정 (0) | 2023.06.07 |
[Unity] 유니티 : 애니메이션 이벤트 추가하기(ReadOnly도 가능) (0) | 2023.06.02 |
[Unity] 유니티 : IgnoreLayerCollision 특정 레이어 충돌 무시 (0) | 2023.05.23 |