虚拟仿真tip提示功能

本文通过一段Unity3D的C#代码展示了如何计算并显示物体在屏幕上的位置,包括物体点、指引线和提示UI的实现。主要方法是`CalculateScreenPosition`用于将世界坐标转换为屏幕坐标,并根据Canvas的渲染模式调整。代码适用于游戏开发中的目标指示功能。
摘要由CSDN通过智能技术生成

##物体提示
话不多说 直接上代码

//定义信息变量
       [SerializeField] private Transform target;

        [SerializeField] private Camera gameCamera;

        [SerializeField] private Canvas canvas;

//定义UI变量
 [SerializeField,Header("物体点UI")]
        public Image YuanDian;
 [SerializeField, Header("原点偏移量")]
        private Vector3 YuanDianOffset;
 [SerializeField, Header("指引线UI")]
         private Image zhiyinxian;
 [SerializeField,Header("tip偏移量")] 
        public Vector3 tipOffset;

   private RectTransform rectTransform;
 public Transform Target
        {
            get { return this.target; }
            set { this.target = value; }
        }

        public Canvas Canvas
        {
            get { return this.canvas; }
            set { this.canvas = value; }
        }

        public Camera Camera
        {
            get { return this.gameCamera; }
            set { this.gameCamera = value; }
        }

//主要方法
  /// <summary>
        /// 计算屏幕的位置
        /// </summary>
   
        public static Vector3 CalculateScreenPosition(Vector3 position/* 目标点*/, Camera camera, Canvas canvas,
            RectTransform transform)
        {
            
            Assert.IsNotNull<Camera>(camera);
            Assert.IsNotNull<Canvas>(canvas);
            Assert.IsNotNull<RectTransform>(transform);
            //世界坐标转屏幕坐标
            Vector3 vector = camera.WorldToScreenPoint(position);
            Vector3 zero = Vector3.zero;
            //判断canvas 渲染模式
            switch (canvas.renderMode)
            {
                //屏幕空间
                case RenderMode.ScreenSpaceOverlay:
                    RectTransformUtility.ScreenPointToWorldPointInRectangle(transform, vector, null, out zero);
                    break;
                case RenderMode.ScreenSpaceCamera:
                    //世界空间
                case RenderMode.WorldSpace:
                    RectTransformUtility.ScreenPointToWorldPointInRectangle(transform, vector, canvas.worldCamera,
                        out zero);
                    break;
            }
            return zero;
        }
       
   // 主要调用方法
  
   private void LateUpdate()
   {  
     
      
       if (this.gameCamera == null)
       {
           this.gameCamera = Camera.main;
       }
       UpdatePos();
       
   }
private void UpdatePos()
  {
if (this.target == null || this.canvas == null || this.gameCamera == null || this.rectTransform == null)
  {
                return;
            }
           
            //计算屏幕坐标

            Vector3 position = CalculateScreenPosition(this.target.position, this.gameCamera,
                this.canvas,tip.GetComponent<RectTransform>() );
    tip.transform.position = position+tipOffset;
       
           YuanDian.transform.position = Camera.WorldToScreenPoint(target.position)+YuanDianOffset;
            zhiyinxian.transform.position = (YuanDian.transform.position+tip.transform.position)/2;
           zhiyinxian.transform.localEulerAngles = new Vector3(0, 0, Vector2.SignedAngle(Vector2.right, YuanDian.transform.position- tip.transform.position));
           float length = (YuanDian.transform.position-tip.transform.position).magnitude;
           //设置线的宽度 长度
           zhiyinxian.     GetComponent<RectTransform>().sizeDelta = new Vector2(length, 3f);
      
        }

具体效果:
白色image圆点 红色 image线 image提示UI
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值