본문 바로가기
게임 개발/유니티

RectTransformUtility.ScreenPointToLocalPointInRectangle

by FlowTree 2020. 4. 11.
반응형

RectTransformUtility.ScreenPointToLocalPointInRectangle

public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint);

 

ScreenPoint(스크린좌표)를 RectTransform의 LocalPoint(캔버스좌표?)로 변환합니다.

Camera의 매개 변수는 ScreenPoint(스크린 좌표)와 연관된 카메라이어야 한다.

캔버스에서 RectTransform이 Screen Space-Overlay 모드로 설정된 경우 cam 매개 변수는 null 이어야 한다.

(그래서 EnemyHpBar 구현할 때 없어도 됐던 것이었다.)

 

rect

screenPoint를 출력할 Canvas의 RectTransform
screenPoint 출력하고 싶은 스크린좌표
cam
스크린좌표와 연관된 카메라
캔버스의 Render Mode가 Screeen Space - Overlay면 Null
out localPoint

변환된 좌표를 저장할 변수


예문 - EnemyHpBar 스크립트

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

public class EnemyHpBar : MonoBehaviour
{
    private Camera uiCamera; //UI 카메라를 담을 변수
    private Canvas canvas; //캔버스를 담을 변수
    private RectTransform rectParent; //부모의 rectTransform 변수를 저장할 변수
    private RectTransform rectHp; //자신의 rectTransform 저장할 변수

    //HideInInspector는 해당 변수 숨기기, 굳이 보여줄 필요가 없을 때 
    public Vector3 offset = Vector3.zero; //HpBar 위치 조절용, offset은 어디에 HpBar를 위치 출력할지
    public Transform enemyTr; //적 캐릭터의 위치


    void Start()
    {
        canvas = GetComponentInParent<Canvas>(); //부모가 가지고있는 canvas 가져오기, Enemy HpBar canvas임
        uiCamera = canvas.worldCamera;
        rectParent = canvas.GetComponent<RectTransform>();
        rectHp = this.gameObject.GetComponent<RectTransform>();
    }

    //LateUpdate는 update 이후 실행함, 적의 움직임은 Update에서 실행되니 움직임 이후에 HpBar를 출력함
    private void LateUpdate()
    {
        var screenPos = Camera.main.WorldToScreenPoint(enemyTr.position + offset); //월드좌표(3D)를 스크린좌표(2D)로 변경, offset은 오브젝트 머리 위치
        /*
        if(screenPos.z < 0.0f)
        {
            screenPos *= -1.0f;
            //x, y, (z) 메인카메라에서 XY평면까지의 거리
        }
        백뷰시점에서는 뒤돌 경우 HpBar가 보이는 문제가 있어서 위의 코드로 안보이게 했지만, 나는 쿼터뷰 시점이라서 필요없음
        */

        var localPos = Vector2.zero;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(rectParent, screenPos, uiCamera, out localPos); //스크린좌표에서 캔버스에서 사용할 수 있는 좌표로 변경?
    
        rectHp.localPosition = localPos; //그 좌표를 localPos에 저장, 거기에 hpbar를 출력
    }

}

 


참고 링크

https://docs.unity3d.com/ScriptReference/RectTransformUtility.ScreenPointToLocalPointInRectangle.html

 

http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=76516

 

반응형

'게임 개발 > 유니티' 카테고리의 다른 글

Vector3.Lerp  (0) 2020.04.29
Vector3.Slerp  (0) 2020.04.14
Camera.WorldToScreenPoint  (0) 2020.04.11
유니티 Layer - UI 출력 우선 순위 정하기  (1) 2020.04.11
유니티 Canvas  (0) 2020.04.11

댓글