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时,这个方法起到了转换作用

  • 相关阅读:
    环境安装和工程搭建
    计算机发展史
    计算机硬件介绍--输入设备和输出设备
    计算机硬件介绍--内存
    bit和byte
    计算机硬件介绍--中央处理器--CPU
    取投料成本
    获取BOM标准用量
    取投料数量
    怎么更改當前的USERENV('LANG')返回值 oracle
  • 原文地址:https://www.cnblogs.com/xiaoahui/p/13624583.html
Copyright © 2011-2022 走看看