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를 출력
}
}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를 출력
}
}
'게임엔진 > Unity' 카테고리의 다른 글
[Unity] 에디터에서만 사용할 수 있는 커스텀 코루틴 (0) | 2023.02.17 |
---|---|
[Unity] Range 어트리뷰트를 단위로 설정할 수 있는 방법 (0) | 2023.02.17 |
[Unity] UI 카메라 설정하기 (screen space - camera) (0) | 2023.01.15 |
[Unity] Job 시스템 이해 2, NativeContainer (0) | 2023.01.15 |
[Unity] Job 시스템 이해 1, IJob (0) | 2023.01.15 |