在Canvas不同的渲染模式(RenderMode)下实现UI跟随3D物体

当Canvas.RenderMode为Screen Space-Overlay时

 利用WorldToScreenPoint(worldPos)将物体的世界坐标转换成屏幕坐标,实时更新UI的坐标:

复制代码
using UnityEngine;
using System.Collections;

public class FollowWorldObj : MonoBehaviour {
    [SerializeField]
    GameObject worldPos;//3D物体(人物)
    [SerializeField]
    RectTransform rectTrans;//UI元素(如:血条等)
    public Vector2 offset;//偏移量

    // Update is called once per frame
    void Update () {
        Vector2 screenPos=Camera.main.WorldToScreenPoint(worldPos.transform.position);
        rectTrans.position = screenPos + offset;
    }
}
复制代码

当Canvas.RenderMode为Screen Space-Camera时

利用RectTransformUtility.ScreenPointToLocalPointInRectangle换算出UI元素在Canvas的2D坐标:

复制代码
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

public class UI_FollowObj : MonoBehaviour {
    [SerializeField]
    Camera UI_Camera;//UI相机
    [SerializeField]
    RectTransform image;//UI元素
    [SerializeField]
    GameObject obj;//3D物体
    [SerializeField]
    Canvas ui_Canvas;
    // Update is called once per frame
    void Update () {
        UpdateNamePosition();
    }
    /// <summary>
    /// 更新image位置
    /// </summary>
    void UpdateNamePosition()
    {
        Vector2 mouseDown = Camera.main.WorldToScreenPoint(obj.transform.position);
        Vector2 mouseUGUIPos = new Vector2();
        bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(ui_Canvas.transform as RectTransform, mouseDown, UI_Camera, out mouseUGUIPos);
        if (isRect)
        {
            image.anchoredPosition = mouseUGUIPos;
        }
    }
}
复制代码

转载自(侵删):https://blog.csdn.net/nnew_hande/article/details/78501309

这里着重强调一下RectTransformUtility.ScreenPointToLocalPointInRectangle这个方法:场景->屏幕->UI,所以当场景中的UI是相机模式的UI时,这个方法起到了转换作用

 

posted @   小辉歌  阅读(774)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示