zoukankan      html  css  js  c++  java
  • 在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时,这个方法起到了转换作用

  • 相关阅读:
    sharding-jdbc精确分片配置
    sharding-jdbc注意事项
    sharding-jdbc绑定表和公共表
    go 语言解析yaml文件作为配置文件
    go语言添加全局的json配置文件
    go查询数据库讲单数据结果绑定结构体
    sharding-jdbc分库分表节点路由
    增强for循环对遍历的集合进行增删改操作会出现并发修改异常
    go语言数据模型改变响应给前端字段名
    视图
  • 原文地址:https://www.cnblogs.com/xiaoahui/p/13624583.html
Copyright © 2011-2022 走看看