在 Unity 中实现 UGUI 元素跟随 3D 物体,关键在于将 3D 物体的世界坐标转换为 UGUI 所在的屏幕坐标或画布坐标,以下详细介绍坐标转换的原理和实现步骤。
坐标系统概述
世界坐标(World Coordinates):是 Unity 场景中所有物体通用的坐标系统,用于描述物体在整个场景中的位置。
屏幕坐标(Screen Coordinates):以屏幕左下角为原点 (0, 0),右上角为 (Screen.width, Screen.height),单位是像素。常用于表示鼠标位置或 UI 元素在屏幕上的位置。
画布坐标(Canvas Coordinates):UGUI 元素使用的坐标系统,其原点和坐标范围取决于画布的设置(如 Screen Space - Overlay、Screen Space - Camera 或 World Space)。
坐标转换原理及步骤
- 3D 物体世界坐标转屏幕坐标
使用 Camera.WorldToScreenPoint 方法可以将 3D 物体的世界坐标转换为屏幕坐标。该方法会根据相机的位置、角度和投影方式,计算出 3D 物体在屏幕上的对应位置。
新建脚本,脚本挂在到任意地方即可
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UICollor : MonoBehaviour {
public GameObject model;//随便选一个3d模型point
public Image image;//ugui图片
public Text text; //ugui图片text
public float sety = 1;
public LineRenderer line; //line
Vector3[] positions = new Vector3[] { Vector3.zero, Vector3.zero };
void Update()
{
// Vector3 Nposition = Camera.main.WorldToScreenPoint(new Vector3(model.transform.position.x, model.transform.position.y, model.transform.position.z));
image.transform.position = Camera.main.WorldToScreenPoint(new Vector3(model.transform.position.x, model.transform.position.y+sety, model.transform.position.z));
//image.transform.position = Camera.main.WorldToScreenPoint(model.transform.position);
Vector3 Lposition = Camera.main.ScreenToWorldPoint(image.transform.position);
positions[0] = model.transform.position;
positions[1] = Lposition;
line.transform.position = model.transform.position ;
line.SetPositions(positions);
}
//显示文字
public void SetText(string value)
{
text.text = value;
}
//图片消失
public void SetDisPlay()
{
image.gameObject.SetActive(false);
}
//图片出现
public void Setplay()
{
image.gameObject.SetActive(true);
}
//
public void SetModel(GameObject model)
{
this.model = model;
}
//线出现
public void SetLineplay()
{
line.gameObject.SetActive(true);
}
//线消失
public void SetLineHiding()
{
line.gameObject.SetActive(false);
}
}
最后自行测试即可