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

  • 相关阅读:
    cocos2d-x 屏幕坐标系和OPenGL坐标系转换
    cocos2d-x 判断系统语言
    cocos2d-x 动画加速与减速
    高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?
    Netty学习三:线程模型
    java NIO原理及实例
    java多线程系列(四)---ReentrantLock的使用
    Java并发之AQS详解
    微服务踩坑之边界
    设计模式:观察者模式(有利于代码解耦)
  • 原文地址:https://www.cnblogs.com/xiaoahui/p/13624583.html
Copyright © 2011-2022 走看看