unity VR项目3DUI:人物头部旁“说话框”,功能:1.永远朝向相机 2.打字效果 3.UI不会被模型遮挡 4.切换位置 5.文字自动根据内容扩充

提示:文章有错误的地方,还望诸位大神不吝指教!

文章目录

  • 前言
  • 一、UI搭建
    • 1.创建基节点
    • 2.创建Canvas
    • 3.添加永远看向相机代码
    • 4.创建UI背景,设置相关操作
      • 1.锚点设置
      • 2.添加组件:Vertical Layout Group、Content Size Fitter
      • 3.添加文本
  • 二、UI不被模型遮挡
  • 三、打字效果代码
  • 总结


前言

仅适用于VRAR项目!
需求:
人物说话时:头旁边出现说话内容,且根据内容长短,以打字效果的方式,进行向下自动扩充,并且UI复用,可以多人物使用。
功能:
1.永远朝向相机
2.打字效果
3.UI不会被模型遮挡
4.切换位置
5.文字自动根据内容扩充
效果:
在这里插入图片描述
在这里插入图片描述

一、UI搭建

1.创建基节点

创建空物体作为UI的父节点,改名字:UIDialog,因为是3dUI,大小和高度根据自己的情况调节即可
在这里插入图片描述

2.创建Canvas

因为是VR项目,所以就用XR创建Canvas:在Hierarchy面板中右击鼠标–>XR–>UICanvas
在这里插入图片描述

3.添加永远看向相机代码

在这里插入图片描述


using UnityEngine;public class LookatPlayer : MonoBehaviour
{Camera MainCamera;void Awake(){MainCamera = Camera.main;if (MainCamera == null){Debug.LogError("没有找到MainCamera");return;}}void Update(){this.transform.LookAt(MainCamera.transform);// this.transform.forward = Vector3.forward;this.transform.localRotation = Quaternion.Euler(new Vector3(0, this.transform.localRotation.eulerAngles.y, 0));}
}

4.创建UI背景,设置相关操作

1.锚点设置

把Pivot的Y改为:1,即可。作业:扩张时会向下,扩展。
在这里插入图片描述

2.添加组件:Vertical Layout Group、Content Size Fitter

Vertical Layout Group:竖向排列 (横向排列:Horizontal Layout Group)
Content Size Fitter:根据子物体内容多少扩展(可根据需求设置:横向或者竖向,如下图)
在这里插入图片描述

3.添加文本

我选择添加旧版文本:Text (Legacy),并没有使用Text (TMP),原因是后面要做一个UI不被模型遮挡的效果。
但是TextMeshPro - Text (UI)组件效果更好
在这里插入图片描述

二、UI不被模型遮挡

如果UI设置跟随,或者当前位置模型太多,会出现UI被模型挡住,看不全UI面板的内容。
所有Text、Image都需要指定该shader
在这里插入图片描述
在这里插入图片描述
效果图:
在这里插入图片描述

使用Shader修改渲染层级

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "Custom/UIForground"
{Properties{[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}_Color ("Tint", Color) = (1,1,1,1)_StencilComp ("Stencil Comparison", Float) = 8_Stencil ("Stencil ID", Float) = 0_StencilOp ("Stencil Operation", Float) = 0_StencilWriteMask ("Stencil Write Mask", Float) = 255_StencilReadMask ("Stencil Read Mask", Float) = 255_ColorMask ("Color Mask", Float) = 15[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0}SubShader{Tags{"Queue"="Transparent""IgnoreProjector"="True""RenderType"="Transparent""PreviewType"="Plane""CanUseSpriteAtlas"="True"}Stencil{Ref [_Stencil]Comp [_StencilComp]Pass [_StencilOp]ReadMask [_StencilReadMask]WriteMask [_StencilWriteMask]}Cull OffLighting OffZWrite Off//ZTest [unity_GUIZTestMode]ZTest AlwaysBlend One OneMinusSrcAlphaColorMask [_ColorMask]Pass{Name "Default"CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"#include "UnityUI.cginc"#pragma multi_compile_local _ UNITY_UI_CLIP_RECT#pragma multi_compile_local _ UNITY_UI_ALPHACLIPstruct appdata_t{float4 vertex   : POSITION;float4 color    : COLOR;float2 texcoord : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float4 vertex   : SV_POSITION;fixed4 color    : COLOR;float2 texcoord  : TEXCOORD0;float4 worldPosition : TEXCOORD1;half4  mask : TEXCOORD2;UNITY_VERTEX_OUTPUT_STEREO};sampler2D _MainTex;fixed4 _Color;fixed4 _TextureSampleAdd;float4 _ClipRect;float4 _MainTex_ST;float _UIMaskSoftnessX;float _UIMaskSoftnessY;v2f vert(appdata_t v){v2f OUT;UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);float4 vPosition = UnityObjectToClipPos(v.vertex);OUT.worldPosition = v.vertex;OUT.vertex = vPosition;float2 pixelSize = vPosition.w;pixelSize /= float2(1, 1) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);float2 maskUV = (v.vertex.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);OUT.texcoord = TRANSFORM_TEX(v.texcoord.xy, _MainTex);OUT.mask = half4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy)));OUT.color = v.color * _Color;return OUT;}fixed4 frag(v2f IN) : SV_Target{half4 color = IN.color * (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd);#ifdef UNITY_UI_CLIP_RECThalf2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);color.a *= m.x * m.y;#endif#ifdef UNITY_UI_ALPHACLIPclip (color.a - 0.001);#endifcolor.rgb *= color.a;return color;}ENDCG}}
}

三、打字效果代码

using System.Collections;
using System.Collections.Generic;
using Twq;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 对话框(3DUI,可换到任意人物头部位置)
/// </summary>
public class UICS_Dialog : SingletonMono<UICS_Dialog>
{public GameObject Mask;float Speed = 10;public  Text textLabel;void Start(){// GetText("作业负责人:进入场景后,弹出界面对任务进行一个介绍,可以视频、文字,点击开始");}/// <summary>/// 获得文字/// </summary>/// <param name="textToType"></param>public void GetText(string text_){StartCoroutine(WriteText(text_));}/// <summary>/// 写出来/// </summary>/// <param name="textToType"></param>/// <returns></returns>IEnumerator WriteText(string text_){float t = 0;//经过的时间int charIndex = 0;//字符串索引值while (charIndex < text_.Length){t += Time.deltaTime * Speed;//简单计时器赋值给tcharIndex = Mathf.FloorToInt(t);//把t转为int类型赋值给charIndexcharIndex = Mathf.Clamp(charIndex, 0, text_.Length);textLabel.text = text_.Substring(0, charIndex);yield return null;}textLabel.text = text_;}/// <summary>/// 设置UI/// </summary>/// <param name="bo">UI显隐开关</param>/// <param name="parentTran">父节点</param>/// <param name="textStr">文字内容</param>public void SetState(bool bo, Transform parentTran, string textStr){this.transform.SetParent(parentTran);//设置父节点this.transform.position = new Vector3(0,1.345f,0);//设置固定高度this.transform.Rotate(new Vector3(0,0,0)); //设置旋转Mask.SetActive(bo);//设置UI显隐if (bo){GetText(textStr);}}}

总结

好记性不如烂笔头!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393406.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海冷链配送新篇章 华鼎冷链科技以卓越服务餐饮品牌

在快速发展的上海餐饮连锁行业中&#xff0c;冷链运输作为保障食品安全与品质的关键环节&#xff0c;正迎来前所未有的发展机遇与挑战。华鼎冷链科技作为该领域的佼佼者&#xff0c;正引领着上海乃至全国冷链运输行业的新风尚。 华鼎冷链科技的成功并非一蹴而就。首先&#xff…

视频融合技术

三维视频融合技术遵循数字孪生多源数据融合的原则&#xff0c;比视频窗口、矩阵更加直观高效&#xff0c;省去了人脑理解空间的时间&#xff0c;可有效提升数字孪生城市在物联感知操作、虚实融合交互等方面的能力&#xff0c;动静一体、虚实结合&#xff0c;让三维场景“动起来…

MATLAB基础应用精讲-【数模应用】配对样本Wilcoxon检验(附MATLAB、R语言和python代码实现)

目录 知识储备 常用的统计假设检验的方法 算法原理 什么是Wilcoxon符号秩检验? 何时使用Wilcoxon符号秩检验 适用条件 SPSS-符号秩检验 一统计理论 二实例分析 三拓展知识 SAS --配对样本Wilcoxon符号秩检验 SPSSAU 配对样本Wilcoxon检验案例 1、背景 2、理论 …

SQL注入sqli-labs-master关卡一

本文环境搭建使用的是小皮&#xff0c;靶机压缩包&#xff1a;通过百度网盘分享的文件&#xff1a;sqli-labs-php7-master.zip 链接&#xff1a;https://pan.baidu.com/s/1xBfsi2lyrA1QgUWycRsHeQ?pwdqwer 提取码&#xff1a;qwer 下载解压至phpstudy的WWW目录下即可。 第一…

无缝协作的艺术:Codigger 视频会议(Meeting)的用户体验

在当今数字化的时代&#xff0c;远程协作已经成为工作和学习中不可或缺的一部分。然而&#xff0c;远程协作也面临着诸多挑战&#xff0c;如沟通不畅、信息同步不及时、协作工具的复杂性等。而 Codigger 视频会议&#xff08;Meeting&#xff09;作为一款创新的工具&#xff0c…

计算机的错误计算(五十四)

摘要 回复网友关于正确计算计算机的错误计算&#xff08;五十一&#xff09;与&#xff08;五十二&#xff09;中所述案例时的 3点注意事项。 问&#xff1a;对于计算机的错误计算&#xff08;五十一&#xff09;中的案例 &#xff0c;由&#xff08;五十二&#xff09;知&a…

数据结构第九讲:二叉树

数据结构第九讲&#xff1a;二叉树 1.实现链式结构二叉树1.1二叉树的节点结构1.2创建二叉树节点1.3前中后序遍历1.3.1前序遍历1.3.2中序遍历1.3.3后序遍历1.3.4总结 1.4二叉树结点的个数1.4.1错误示范1.4.2实现方法 1.5二叉树叶子结点的个数1.6二叉树第k层结点的个数1.7二叉树的…

计算机语言-CSP初赛知识点整理

历年真题 [2020-CSP-J-第2题] 编译器的主要功能( ) A. 将源程序翻译成机器指令代码 B. 将源程序重新组合 C. 将低级语言翻译成高级语言 D. 将一种高级语言翻译成另一种高级语言 [2021-CSP-J-第1题] 以下不属于面向对象程序设计语言的是&#xff08;&#xff09;。 A. C B. Pyt…

CLOS架构

CLOS Networking CLOS Networking 是指使用 Clos 网络拓扑结构&#xff08;Clos Network Topology&#xff09;进行网络设计的一种方法。该方法是由贝尔实验室的工程师 Charles Clos 在1950年代提出的&#xff0c;以解决电路交换网络的可扩展性和性能问题。随着现代计算和网络…

P33-模拟实现字符串相关函数

模拟实现strcpy strcpy函数是C语言中的字符串拷贝函数&#xff0c;用于将一个字符串复制到另一个字符串中。 函数原型如下&#xff1a; char* strcpy(char* destination, const char* source);参数说明&#xff1a; destination&#xff1a;目标字符串的指针&#xff0c;用于存…

北大和鹏城实验室联合推出的图像视频统一多模态大模型Chat-UniVi(CVPR 2024)

Chat-UniVi: Unified Visual Representation Empowers Large Language Models with Image and Video Understanding 论文信息 paper&#xff1a;CVPR 2024 code&#xff1a;https://github.com/PKU-YuanGroup/Chat-UniVi 训练130亿大模型仅3天&#xff0c;北大提出Chat-UniVi…

Tomcat 漏洞

一.CVE-2017-12615 1.使用burp抓包 把get改成put jsp文件后加/ 添加完成后访问 木马 然后木马的网址 在哥斯拉测试并且添加 添加成功 然后我们就成功进去啦、 二.弱口令 点击后输入默认用户名、密码&#xff1a;tomcat/tomcat 登陆之后上传一个jsp文件 后缀改成war 然后访问我…

android compose设置圆角不起作用

进度条progress设置背景圆角不起作用&#xff1a; 源码&#xff1a; Composablefun CircularProgress(modifier: Modifier, vm: TabarCmpViewModel?) {if (vm?.showLoading?.value ! true) returnBox(modifier modifier.background(Color(0x99000000)).defaultMinSize(minW…

【深度学习】【语音TTS】OpenVoice v2,测评,中英文语料,Docker镜像,对比GPT-SoVITS、FishAudio、BertVITS2

https://github.com/myshell-ai/OpenVoice/blob/main/docs/USAGE.md 实际体验OpenVoice v2的TTS效果。 文章目录 环境启动 jupyter代码代码分析主要模块和功能测试一些别的中文和中英文混合总结优点缺点对比GPT-SoVITS、FishAudio、BertVITS2使用我的Docker镜像快速体验OpenVo…

4.7.深层循环神经网络

深层循环网络 ​ 就是更深了&#xff0c;因为之前的网络都只有一层隐藏层&#xff0c;弄多一点 ​ 我们将多层循环神经网络堆叠在一起&#xff0c;通过对几个简单层的组合&#xff0c;产生了一个灵活的机制。上图展示了一个具有 L L L个隐藏层的深度循环神经网络&#xff0c;每…

【C++】STL | vector 详解及重要函数的实现

目录 前言 总代码 vector类框架建立&#xff08;模板与成员变量&#xff09; 构造、析构、swap 与 赋值重载 构造 析构 swap 赋值重载 reserve 扩容&#xff08;重要&#xff01;&#xff01;&#xff09;、size、capacity operator[ ]重载 insert 插入 逻辑讲解 i…

Oracle认证1Z0-071线上考试注意事项

目录 一、前言二、回顾过往战绩第一次 裸考&#x1f412;第二次 背题库硬考&#xff01;&#x1f412;第三次 软件卡住&#xff0c;寄&#xff01;&#x1f648;第四次 汇总纠错&#xff0c;通过&#xff01;&#x1f31a; 三、考试流程四、考试注意事项1. 是否需要科学上网2. …

探索四川财谷通抖音小店:安全与信赖的购物新体验

在数字经济蓬勃发展的今天&#xff0c;抖音平台凭借其庞大的用户基础和强大的内容生态&#xff0c;逐渐成为了电商领域的一股不可忽视的力量。其中&#xff0c;四川财谷通抖音小店作为这一浪潮中的佼佼者&#xff0c;不仅以其丰富的商品种类和独特的品牌魅力吸引了众多消费者的…

Java多线程的单例设计模式 多种实现方法

目录 前言 饿汉式 懒汉式 Double_check volatile double_check Holder方式 枚举 前言 单例设计模式GOF23中设计模式中最常用的设计模式之一, 单例设计模式提供了多线程环境下的保证唯一实例性的解决方案, 虽然简单, 但是实现单例模式的方式多种多样, 因此需要从多个维度去…

[安洵杯 2019]easy_serialize_php

[安洵杯 2019]easy_serialize_php [安洵杯 2019]easy_serialize_php - DGhh - 博客园 (cnblogs.com) [安洵杯 2019]easy_serialize_php - 何止(h3zh1) - 博客园 (cnblogs.com) 涉及的考点是字符串逃逸 <?php //GET一个f $function $_GET[f];//定义过滤的字符串数组 fu…