본문 바로가기

Unity3D/C#

유니티 2D LookRotation으로 클릭한 방향을 쳐다보게 하기

반응형

2D Look Rotation

 

 

적들이 몰려오는 2D 디펜스 게임에서 적들을 공격하는 아군 시설물은 적 한 명 혹은 다중으로 타깃을 잡고 그 방향을 바라본 채로 마구잡이로 공격을 퍼붓습니다. 또는 가운데 자신의 캐릭터가 있고 수많은 적들이 사방에서 몰려올 때 피하는 1분 버티기 게임에서 적들은 내 캐릭터 방향으로 이동하고 그 이동 방향으로 쳐다봅니다. 이렇듯 2D 공간에서 Unity 프로그래밍을 하다 보면 타깃을 설정하고 그 방향을 쳐다보게 하고 싶은 경우가 생깁니다. 또는 특정 사물이나 가야 되는 방향을 알려줘야 되는 경우가 생깁니다. 이럴 때 Quaternion.LookRotation을 사용하면 되는데 3D 공간을 기본으로 하기 때문에 2D 공간에서 사용하려면 추가 작업이 필요합니다. 마우스 클릭을 이용해서 타깃을 잡고 그 위치 방향으로 화살표를 회전해보도록 하겠습니다.

 

 

C# (UNITY 3D)

 

 

회전 예시

 

마우스를 아무 곳이나 클릭하면 타깃 2D 이미지가 클릭한 곳으로 바로 이동하고 화살표가 타깃 방향으로 자동 회전하는 예시입니다. 화살표의 eulerAgles.z를 출력합니다. 이때 단순 출력하면 우리가 기대하는 방향의 반대로 출력이 되기 때문에 360에서 eulerAngles.z를 뺀 값을 출력합니다.

 

 

 

using UnityEngine.UI;

 

회전 값을 표시용 Text를 사용하기 위해 UnityEngine.UI를 사용합니다.

 

 

화살표

 

타깃을 가리킬 화살표를 준비하고 이때 화살표는 위를 향하게 합니다. 만약 화살표가 좌우 아래를 향해있다면 변수의 axis 값을 0~360 사이로 조정하면 됩니다.

 

 

할당

각 오브젝트를 스크립트에 할당해 줍니다.

 

 

 

 

     
    public Transform transform_my;
    public Transform transform_target;
    public Text text_rot;

    private float speed = 500;
    private float axis = 0;
    private void Update()
    {
        Get_MouseInput();
        Update_LookRotation();
    }

    //CodeFinder 코드파인더
    //From https://codefinder.janndk.com/ 

    private void Get_MouseInput()
    {
        if(Input.GetMouseButtonUp(0))
        {
            Vector2 mousePos = Input.mousePosition;
            transform_target.position = mousePos;
        }
    }

    private void Update_LookRotation()
    {
        Vector3 myPos = transform_my.position;
        Vector3 targetPos = transform_target.position;
        targetPos.z = myPos.z;

        Vector3 vectorToTarget = targetPos - myPos;
        Vector3 quaternionToTarget = Quaternion.Euler(0, 0, axis) * vectorToTarget;

        Quaternion targetRotation = Quaternion.LookRotation(forward: Vector3.forward, upwards: quaternionToTarget);
        transform_my.rotation = Quaternion.RotateTowards(transform_my.rotation, targetRotation, speed * Time.deltaTime);

        string message = (360 - transform_my.eulerAngles.z).ToString();
        text_rot.text = message;
        Debug.Log(message);
    }

 

변수(variable)

transform_my(Transform) : 회전 시킬 게임 오브젝트
transform_target(Transform) : 가리킬 방향의 오브젝트
text_rot(Text) : 화살표의 방향 각도 표시 (시계 방향)

speed(float) : 화살표가 회전하는 속도, 기본은 500
axis(float) : 가리키는 방향의 회전 축, 기본은 0

 

함수(function)

Get_MouseInput : 마우스의 클릭 여부 감지 및 타깃 오브젝트 이동
Update_LookRotation : 화살표가 타깃 오브젝트를 바라보도록 회전

 

 

2D Look At Target / Quaternion 회전 / 오브젝트를 바라보게 하기 / 회전 축 변경

 

 

 

반응형