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

  • 相关阅读:
    [SCOI2007]降雨量
    [SCOI2005]骑士精神
    LUOGU P1342 请柬
    spfa的复活
    Luogu P2396 yyy loves Maths VII
    Luogu P2801 教主的魔法
    HEOI2012 采花
    USACO05DEC Cleaning Shifts
    CF438D The Child and Sequence
    Codechef October Challenge 2019 Div.2
  • 原文地址:https://www.cnblogs.com/xiaoahui/p/13624583.html
Copyright © 2011-2022 走看看