[Unity]벡터를 이용한 플레이어 이동 구현하기

728x90
  • 벡터 : 크기와 방향을 함께 가지고 있는 것

A(2,4)에서 B(6,7)로 이동하는 벡터는 B-A를 해주면 된다.

(6, 7) - ( 2, 4) = (4,3) / 피타고라스 정리를 사용해서 빗변의 길이는 5이다.

 

※방향 벡터를 만들어주기 위해서는 크기(빗변)를 1로 만들어주어야 한다.

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

public class PlayerController2 : MonoBehaviour
{
    public GameObject bulletObject;
    public Transform bulletContainer;
    public GameObject guideLine;
    
    public float ditectionRange = 4f;
    private Camera mainCamera;
    
    //마우스의 위치에 따라서 가이드라인이 생기고 미사일이 발사
    //카메라 위에 마우스의 좌표가 어떻게 나오는지 알기 위해서

    void Start()
    {
        mainCamera = Camera.main; 
        //현재 사용하고 있는 카메라 객체가 들어가게 됨
    }

    void Update()
    {
        MouseCheck();
        
        if (Input.GetMouseButtonDown(0))
        {
            Vector2 mousePos = Input.mousePosition;
            mousePos = mainCamera.ScreenToWorldPoint(mousePos);

            Vector3 playerPos = transform.position;
            
            Vector2 dirVec = mousePos - (Vector2)playerPos; //그냥 벡터를 만듦
            dirVec = dirVec.normalized; //normalized를 해줘야 방향벡터

            GameObject tempObject = Instantiate(bulletObject, bulletContainer);
            tempObject.transform.right = dirVec;
            //총알의 오른쪽 방향을 dirVec(방향벡터)로 설정

            tempObject.transform.position = (Vector2)playerPos + dirVec * 0.5f;
            //총알이 플레이어보다 살짝 앞에서 발사(자연스러움)

            transform.Translate(-dirVec); //플레이어가 반대 방향으로 이동
            //dirVec의 정반대의 벡터를 만들기 위해서 (-)를 곱해주면 된다
        }
    }

    void MouseCheck()
    {
        Vector2 mousePos = Input.mousePosition; //마우스의 위치값을 받음
        mousePos = mainCamera.ScreenToWorldPoint(mousePos);
        Debug.Log(mousePos);
        //현재 마우스의 위치를 게임 내의 Position 값으로 변환(ScreenToWorldPoint)

        Vector3 playerPos = transform.position;
            
        Vector2 distanceVec = mousePos - (Vector2)playerPos; //마우스 위치(도착지점) - 플레이어 위치(시작지점)
        guideLine.SetActive(distanceVec.magnitude < ditectionRange ? true : false); //삼항연산자
        //가이드라인 활성화?
        //일정 거리 안에 들어가면 활성화된다
        //magnitude를 이용하면 거리를 알 수 있다
        //sqrMagnitude를 이용하면 거리의 제곱을 알 수 있다
        guideLine.transform.right = distanceVec.normalized;
        //가이드라인의 오른쪽 방향을 distanceVec의 방향벡터로 설정
        //방향벡터를 설정하는 것은 벡터.normalized
        //distanceVec.normalized == distanceVec / distanceVec.magnitude(둘다 같은 개념)
        //방향에 관련된 것은 전부 방향벡터로 설정
    }
}

 

728x90