Unity3D中实现UI显示在3D物体旁边

实现原理:在Update函数里面将3D对象的位置坐标转化为屏幕坐标,然后再赋值给UI对象,这样UI对象还是实时跟随3D对象。

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

public class UIFollow : MonoBehaviour
{
    GameObject currentObj;
    GameObject BGContent;

    public Vector2 offset;
    public GameObject Target;

    void Start()
    {
        BGContent = GameObject.Find("BGContent");
    }

    private void Update()
    {
        // 如果目标对象在相机视野中
        if (IsVisableInCamera(Target.transform.position))
        {
            // 激活背景内容
            BGContent.transform.gameObject.SetActive(true);
            // 获取目标对象的屏幕位置
            BGContent.GetComponent<RectTransform>().anchoredPosition = GetScreenPosition(Target.transform.position);
        }
        else
        {
            // 否则,关闭背景内容
            BGContent.transform.gameObject.SetActive(false);
        }
    }

    public Vector2 GetScreenPosition(Vector3 v3)
    {
        // 将屏幕坐标转换为世界坐标
        Vector3 viewportPos = new Vector3();
        viewportPos = Camera.main.WorldToViewportPoint(v3);
        // 获取Canvas组件
        Transform ca = GameObject.Find("Canvas").transform;
        // 获取Canvas的RectTransform组件
        RectTransform canvasRtm = ca.GetComponent<RectTransform>();
        // 定义一个Vector2变量,用于存储最终的Ugui坐标
        Vector2 uguiPos = Vector2.zero;
        // 将屏幕坐标转换为Ugui坐标
        uguiPos.x = (viewportPos.x - offset.x) * canvasRtm.sizeDelta.x;
        uguiPos.y = (viewportPos.y - offset.y) * canvasRtm.sizeDelta.y;
        // 返回最终的Ugui坐标
        return uguiPos;
    }

    public bool IsVisableInCamera(Vector3 v3)
    {
        // 获取主相机
        Camera mCamera = Camera.main;
        // 将给定的点从世界坐标转换为视口坐标
        Vector3 viewPos = mCamera.WorldToViewportPoint(v3);
        // 如果视口坐标的z轴小于0,则返回false
        if (viewPos.z < 0) return false;
        // 如果视口坐标的z轴大于主摄像机的farClipPlane,则返回false
        if (viewPos.z > mCamera.farClipPlane)
            return false;
        // 如果视口坐标的x轴小于0,或者y轴小于0,或者x轴大于1,或者y轴大于1,则返回false
        if (viewPos.x < 0 || viewPos.y < 0 || viewPos.x > 1 || viewPos.y > 1) return false;
        // 否则返回true
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼头汤の

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值