Unity3d C# 实现UGUI面板跟随标注3D模型功能(含源码)

前言

如题的需求,让UI的窗体跟随场景中模型进行移动,现在很多游戏的血条就是按这个进行;如果我们直接使用世界中的Canvas,每个窗体都需要一个Canvas,消耗很大,我们一般还是在屏幕内同步显示UI的方式。

效果

在这里插入图片描述

在这里插入图片描述

如上就是同步的效果。

实现

UI搭建

按如图搭建UI

在这里插入图片描述

重点是pivot是UI的同步点,如果调整不准可以用偏移值修正。

定义变量

[Header("跟随的物体")]
public Transform FollowTran;

[Header("偏移值")]
public Vector2 Offset;

RectTransform ParentTran, Rtran;

同步位置

 if (FollowTran != null)
 {
Vector2 mScreenPos = Camera.main.WorldToScreenPoint(FollowTran.transform.position);
      Vector2 mRectPos;
      RectTransformUtility.ScreenPointToLocalPointInRectangle(ParentTran, mScreenPos, null, out mRectPos);
      Rtran.localPosition = mRectPos + Offset;
}

思路就是世界坐标转屏幕点;通过屏幕点再转为UI位置即可。

源码工程

https://download.csdn.net/download/qq_33789001/33465355

\---------------------------------------------华丽分割线---------------------------------------------\

以下2022.3.9更新

问题

感谢kindred_joe网友的反馈,在摄像头背面会出现标签问题:
在这里插入图片描述

该问题的原因是在世界位置映射屏幕位置(WorldToScreenPoint)时,在摄像机背面的世界位置也会映射到屏幕内位置造成了该问题。

我这边的解决思路是判断物体是否在在摄像机前面,在前面时进行标注,否则不标注。

同步位置

if (FollowTran != null)
        {
            if (isInFront())
            {
                Vector2 mScreenPos = Camera.main.WorldToScreenPoint(FollowTran.transform.position);
                Vector2 mRectPos;
                RectTransformUtility.ScreenPointToLocalPointInRectangle(ParentTran, mScreenPos, null, out mRectPos);
                Rtran.localPosition = mRectPos + Offset;
                Rtran.localScale = Vector3.one;
            }
            else
                Rtran.localScale = Vector3.zero;
}

位置判断

//判定在摄像头前面
    public bool isInFront() {
        Vector2 viewPos = Camera.main.WorldToViewportPoint(FollowTran.position);
        Vector3 dir = (FollowTran.position - Camera.main.transform.position).normalized;
        float dot = Vector3.Dot(Camera.main.transform.forward, dir);
        if (dot > 0)
            return true;
        else
            return false;
    }
  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 在Unity 3D,打标记是一个常用的操作,可以在场景标识出需要注意的位置、物体或区域。下面介绍一下在Unity 3D如何打标记。 首先,在Scene视图,选需要标记的物体或位置,右键点击菜单选择“Add Tag”,可以选择添加一个新标记或者使用已有的标记。添加新标记后,可以在Inspector视图对标记进行修改,如改变颜色、名称等属性。 其次,在Hierarchy视图或Project视图物体上也可以进行标记操作。选需要标记的物体,在Inspector找到“Tags”属性,点击右侧下拉箭头选择已有的标记或添加一个新标记。 另外,可以通过Script代码来实现打标记的功能。使用TagManager类的静态方法AddTag可以添加一个新标记,RemoveTag可以删除标记,GetTagByIndex可以获取指定索引的标记名称。 最后,要注意的一点是,标记只是场景的一种辅助工具,不会影响游戏逻辑和物体的行为。在使用标记时要注意选择合适的颜色和名称,尽量避免混淆和重名,以便于管理和维护场景。 ### 回答2: Unity 3D场景打标记是指在场景添加一个特定的标记,用于标识场景的某个特定位置或物体。这个标记可以是一个文字、图片或者一个特定的游戏对象。 打标记有很多用处,比如在开发游戏时,我们可以将游戏需要调试的位置打上标记,便于开发人员进行调试和修改,在开发测试时也可以使用标记及时捕捉游戏的异常情况。 在Unity 3D,打标记非常简单,只需要在Hierarchy面板需要打标记的对象,右键点击该对象,选择“Add Tag”即可,然后在标记栏添加想要添加的标记。另外,也可以通过代码来给一个物体打标记,使用Tag属性即可。 需要注意的是,Unity 3D的标记是与Tag相关联的,Tag一般用于标识游戏的不同种类的物体或角色,而标记则用于标识位置或需要调试的对象,使用时需要区分。同时,打标记也应该尽可能简洁明了,避免产生混淆和误解。 ### 回答3: Unity 3D场景打标记是一种常用的场景编辑工具,它可以帮助开发者对场景的对象或元素进行标记和分类,以便于后续的管理和处理。在Unity 3D,打标记可以通过多种方式实现,比如在场景对象,右键选择“标记”菜单,然后选择相应的标记类型,比如“重要性高”,“可见性低”等等,即可在对象上标记出对应的标记。 除此之外,Unity 3D还支持用户自定义标记类型,可以根据不同的需求和场景设置不同的标记类型,来满足开发者的需求。在自定义标记类型时,用户可以选择标记图标、颜色、名称等属性,使得标记更加直观明了,方便用户进行统一管理和分类查询。 在使用Unity 3D进行场景打标记时,需要注意标记的合理使用和管理,避免对场景系统造成过多的负担和干扰。同时,还需要针对不同的游戏开发项目,采用不同的标记类型和规划方案,以达到最佳的开发效果和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十幺卜入

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值