⭐ Unity Pico PXR_SDK转场淡入淡出

  1. PXR_ScreenFade 脚本:官方SDK 脚本实现了屏幕的淡入淡出功能,封装了 CloseEyesOpenEyes 方法,可以通过传入 Action 执行淡入淡出完成后的逻辑。

  2. FadeController 脚本

    • 通过 GetComponent 获取 PXR_ScreenFade 组件,并调用 CloseEyes() 和 OpenEyes() 来控制屏幕的淡入淡出。
    • 在淡入淡出结束后,通过传递的回调函数执行相关的操作  
  3. /*******************************************************************************
    Copyright © 2015-2022 Pico Technology Co., Ltd.All rights reserved.  NOTICE:All information contained herein is, and remains the property of 
    Pico Technology Co., Ltd. The intellectual and technical concepts 
    contained hererin are proprietary to Pico Technology Co., Ltd. and may be 
    covered by patents, patents in process, and are protected by trade secret or 
    copyright law. Dissemination of this information or reproduction of this 
    material is strictly forbidden unless prior written permission is obtained from
    Pico Technology Co., Ltd. 
    *******************************************************************************/using System;
    using System.Collections;
    using UnityEngine;namespace Unity.XR.PXR
    {public class PXR_ScreenFade : MonoBehaviour{[Tooltip("Define the duration of screen fade.")]public float fadeTime = 5.0f;[Tooltip("Define the color of screen fade.")]public Color fadeColor = new Color(0.0f, 0.0f, 0.0f, 1.0f);public int renderQueue = 5000;private MeshRenderer fadeMeshRenderer;private MeshFilter fadeMeshFilter;private Material fadeMaterial = null;private bool isFading = false;private float currentAlpha;private float nowFadeAlpha;void Awake(){CreateFadeMesh();SetCurrentAlpha(0);}void OnEnable(){StartCoroutine(ScreenFade(1, 0));}void OnDestroy(){DestoryFadeMesh();}private void CreateFadeMesh(){fadeMaterial = new Material(Shader.Find("PXR_SDK/PXR_Fade"));fadeMeshFilter = gameObject.AddComponent<MeshFilter>();fadeMeshRenderer = gameObject.AddComponent<MeshRenderer>();var mesh = new Mesh();fadeMeshFilter.mesh = mesh;Vector3[] vertices = new Vector3[4];float width = 2f;float height = 2f;float depth = 1f;vertices[0] = new Vector3(-width, -height, depth);vertices[1] = new Vector3(width, -height, depth);vertices[2] = new Vector3(-width, height, depth);vertices[3] = new Vector3(width, height, depth);mesh.vertices = vertices;int[] tri = new int[6];tri[0] = 0;tri[1] = 2;tri[2] = 1;tri[3] = 2;tri[4] = 3;tri[5] = 1;mesh.triangles = tri;Vector3[] normals = new Vector3[4];normals[0] = -Vector3.forward;normals[1] = -Vector3.forward;normals[2] = -Vector3.forward;normals[3] = -Vector3.forward;mesh.normals = normals;Vector2[] uv = new Vector2[4];uv[0] = new Vector2(0, 0);uv[1] = new Vector2(1, 0);uv[2] = new Vector2(0, 1);uv[3] = new Vector2(1, 1);mesh.uv = uv;}private void DestoryFadeMesh(){if (fadeMeshRenderer != null)Destroy(fadeMeshRenderer);if (fadeMaterial != null)Destroy(fadeMaterial);if (fadeMeshFilter != null)Destroy(fadeMeshFilter);}public void SetCurrentAlpha(float alpha){currentAlpha = alpha;SetMaterialAlpha();}IEnumerator ScreenFade(float startAlpha, float endAlpha){float elapsedTime = 0.0f;while (elapsedTime < fadeTime){elapsedTime += Time.deltaTime;nowFadeAlpha = Mathf.Lerp(startAlpha, endAlpha, Mathf.Clamp01(elapsedTime / fadeTime));SetMaterialAlpha();yield return new WaitForEndOfFrame();}}private void SetMaterialAlpha(){Color color = fadeColor;color.a = Mathf.Max(currentAlpha, nowFadeAlpha);isFading = color.a > 0;if (fadeMaterial != null){fadeMaterial.color = color;fadeMaterial.renderQueue = renderQueue;fadeMeshRenderer.material = fadeMaterial;fadeMeshRenderer.enabled = isFading;}}public void CloseEyes(Action _action){StartCoroutine(ScreenFade(0, 1, _action));}IEnumerator ScreenFade(float startAlpha, float endAlpha, Action action){float elapsedTime = 0.0f;while (elapsedTime < fadeTime){elapsedTime += Time.deltaTime;nowFadeAlpha = Mathf.Lerp(startAlpha, endAlpha, Mathf.Clamp01(elapsedTime / fadeTime));SetMaterialAlpha();yield return new WaitForEndOfFrame();}action.Invoke();}public void OpenEyes(Action _action){StartCoroutine(ScreenFadeOpen(1, 0, _action));}IEnumerator ScreenFadeOpen(float startAlpha, float endAlpha, Action action){float elapsedTime = 0.0f;while (elapsedTime < fadeTime){elapsedTime += Time.deltaTime;nowFadeAlpha = Mathf.Lerp(startAlpha, endAlpha, Mathf.Clamp01(elapsedTime / fadeTime));SetMaterialAlpha();yield return new WaitForEndOfFrame();}action.Invoke();}IEnumerator ScreenFade(float closeTime, float openTime, Action action, Action complete){float elapsedTime = 0.0f;while (elapsedTime < closeTime){elapsedTime += Time.deltaTime;nowFadeAlpha = Mathf.Lerp(0, 1, Mathf.Clamp01(elapsedTime / closeTime));SetMaterialAlpha();yield return new WaitForEndOfFrame();}action.Invoke();float elapsedTime2 = 0.0f;while (elapsedTime2 < openTime){elapsedTime2 += Time.deltaTime;nowFadeAlpha = Mathf.Lerp(1, 0, Mathf.Clamp01(elapsedTime2 / openTime));SetMaterialAlpha();yield return new WaitForEndOfFrame();}complete?.Invoke();}public void Blink(float closeTime, float openTime, Action action, Action complete = null){StartCoroutine(ScreenFade(closeTime, openTime, action, complete));}}
    }
    
    using UnityEngine;
    using Unity.XR.PXR;  // 引入PXR_ScreenFade的命名空间public class FadeController : MonoBehaviour
    {private PXR_ScreenFade screenFade;void Start(){// 获取附加在同一对象上的PXR_ScreenFade组件,或者通过其他方式获取screenFade = GetComponent<PXR_ScreenFade>();// 触发淡出效果if (screenFade != null){// 画面淡入:从当前状态到完全黑屏(1为全黑)screenFade.CloseEyes(() => {Debug.Log("淡入结束,画面已完全黑屏");// 在淡入结束时执行一些操作});// 可以在一定时间后触发淡出效果,比如在5秒后淡出Invoke("OpenScreen", 5f);}}void OpenScreen(){// 画面淡出:从完全黑屏(1)回到正常视图(0)screenFade.OpenEyes(() => {Debug.Log("淡出结束,画面已恢复正常");// 在淡出结束时执行一些操作});}
    }
    

    官方文档链接:PICO Unity Integration SDK 画面淡入淡出

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

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

相关文章

前端开发设计模式——状态模式

目录 一、状态模式的定义和特点 二、状态模式的结构与原理 1.结构&#xff1a; 2.原理&#xff1a; 三、状态模式的实现方式 四、状态模式的使用场景 1.按钮的不同状态&#xff1a; 2.页面加载状态&#xff1a; 3.用户登录状态&#xff1a; 五、状态模式的优点 1.提…

Matplotlib和Seaborn数据可视化

目录 Matplotlib图表绘制 准备工作 折线图line 柱状图bar 水平条形图barh 饼图pie 散点图scatter 气泡图csatter 箱线图boxplot 直方图hist 蜂巢图hexbin Seaborn图表绘制 准备数据 关系散点图scatterplot 关系散点线形图replot 分类散点图stripplot 分类小提…

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后&#xff0c;下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口&#xff0c;元素可以被分发到一个或多个窗口中&#xff0c;Flink 内置了常用的窗口分配器&#xff0c;包括&#xff1a;tumbling wi…

前缀和和差分算法

文章目录 一维前缀和一维前缀和概念一维前缀和数组的构建 二维前缀和二维前缀和概念二维前缀和数组的构建 一维差分一维差分概念一维差分数组的构建 二维差分二维差分概念二维差分数组的构建 一维前缀和 一维前缀和概念 一维前缀和是一种常用的数据预处理方法&#xff0c;它能…

JS事件和DOM

1. DOM 1.1 基本概念 DOM&#xff0c;全称 Document Object Model&#xff0c;即文档对象模型。它是 Web 上最常用的 API 之一&#xff0c;是加载在浏览器中的文档模型&#xff0c;可以将文档表示为节点树&#xff08;或称 DOM 树&#xff09;&#xff0c;其中每个节点代表文…

【协议】IIC总线协议学习

一、IIC基本介绍 设计I2C的初衷是减少电视机等复杂电子系统内部的布线数量&#xff0c;同时也降低制造成本。通过使用只有两根线的通信总线&#xff0c;它有效地减少了器件间连接的复杂性。 IIC总线是两线制总线&#xff0c;仅有串行数据线SDA和串行时钟线SCL进行通信。减少…

【Python实例】Python读取并绘制tif数据

【Python实例】Python读取并绘制tiff数据 Python实例-以全球不透水面积数据为例数据准备&#xff1a;全球不透水面积数据基于gdal库绘制tif图基于Rasterio库绘制tif图 参考 GeoTIff 是一个标准的.tif 文件或是一个图像文件格式&#xff0c;它包含了一些额外的空间信息&#xff…

prompt learning

prompt learning 对于CLIP&#xff08;如上图所示&#xff09;而言&#xff0c;对其prompt构造的更改就是在zero shot应用到下游任务的时候对其输入的label text进行一定的更改&#xff0c;比如将“A photo of a{obj}”改为“[V1][V2]…[Vn][Class]”这样可学习的V1-Vn的token…

业务开发常见问题-并发工具类

hello&#xff0c;大家好&#xff0c;本讲我们一起聊一下常见的几个并发工具类的使用和坑&#xff01; 在日常工作中&#xff0c;我们经常会遇到多线程并发问题&#xff0c;比如ThreadLocal、锁、ConcurrentHashMap、CopyOnWriteArrayList等。那么如何正常的使用呢&#xff1f;…

【最新通知】2024年Cisco思科认证CCNA详解

CCNA现在涵盖安全性、自动化和可编程性。该计划拥有一项涵盖IT职业基础知识的认证&#xff0c;包括一门考试和一门培训课程&#xff0c;助您做好准备。 CCNA培训课程和考试最近面向最新技术和工作岗位进行了重新调整&#xff0c;为您提供了向任何方向发展事业所需的基础。CCNA认…

blender分离含有多个动作的模型,并导出含有材质的fbx模型

问题背景 笔者是模型小白&#xff0c;需要将网络上下载的fbx模型中的动作&#xff0c;分离成单独的动作模型&#xff0c;经过3天摸爬滚打&#xff0c;先后使用了blender&#xff0c;3d max&#xff0c;unity&#xff0c;最终用blender完成&#xff0c;期间参考了众多网络上大佬…

【Ansiable】ansible的模块和主机清单

目录 一、介绍一些运维自动化工具 二、Ansible 概述/简介 三、Ansible 工作机制 3.1 内部工作机制 3.2 外部工作机制 四、Ansible 执行流程 五、Ansblie 安装以及日常操作模块***** 5.1 ansible 环境安装部署 5.2 ansible 命令行模块 5.2.1 command 模块 5.2.2 shel…

明源云ERP报表服务GetErpConfig.aspx接口存在敏感信息泄露

一、漏洞简介 在访问 /service/Mysoft.Report.Web.Service.Base/GetErpConfig.aspx?erpKeyerp60 路径时&#xff0c;返回了包含敏感信息的响应。这些信息包括但不限于数据库连接字符串、用户名、密码、加密密钥等。这些敏感信息的暴露可能导致以下风险&#xff1a;数据库访问…

【IPv6】IPv6 NAT66介绍

参考链接 IPv6-to-IPv6 Network Address Translation (NAT66) (ietf.org)https://datatracker.ietf.org/doc/id/draft-mrw-nat66-00.html IPv6 NAT66 NAT66&#xff0c;全称为Network Address Translation for IPv6 to IPv6&#xff0c;是一种用于IPv6网络的地址转换技术。在…

Tkinter -- python GUI学习与使用

前言 python GUI 目前pythonGUI有很多&#xff0c;哪一个最好&#xff1f; 先说说我选择的思路&#xff0c;我的目的是开发一个易用的软件&#xff0c;最重要的是稳定&#xff0c;并且碰到问题能够解决&#xff0c;因此&#xff0c;我的目标很明确&#xff0c;有比较大的用户群…

基于Python的自然语言处理系列(39):Huggingface中的解码策略

在自然语言生成任务中&#xff0c;如何选择下一步的单词或者词语对生成的文本质量影响巨大。Huggingface 提供了多种解码策略&#xff0c;可以在不同的场景下平衡流畅度、创造力以及生成效率。在这篇文章中&#xff0c;我们将逐步介绍 Huggingface 中的几种常见解码策略&#x…

web API基础

作用和分类 作用: 就是使用 JS 去操作 html 和浏览器 分类&#xff1a; DOM (文档对象模型)、 BOM &#xff08;浏览器对象模型&#xff09; 什么是DOM DOM (Document Object Model) 译为文档对象模型&#xff0c;是 HTML 和 XML 文档的编程接口。 HTML DOM 定义了访问和操作 …

mingw64的Windows安装及配置教程gcc、g++等

mingw64.rar 链接&#xff1a;https://pan.baidu.com/s/18YrDRyi5NHtqnTwhJG6PuA 提取码&#xff1a;pbli &#xff08;免费永久有效&#xff0c;免安装&#xff0c;解压后配置环境变量即可使用&#xff09; 1 下载 解压后随便放到一个地方&#xff1a; 复制“bin”路径&am…

重磅:中国首个SVG技术标准发布,计育韬老师主笔起草

编辑搜图 中华人民共和国《融媒体 SVG 交互设计技术规范》是由复旦大学奇点新媒体研究中心等单位牵头&#xff0c;学科带头人计育韬等人主要起草&#xff0c;并于 2024 年 8 月起面向全社会行业从业者发布的最高技术标准。该标准前身为 2016 年计育韬与微信团队合作拟定的《SV…

置分辨率设置多显示器的时候提示, 某些设置由系统管理员进行管理

遇到的问题 设置分辨率设置多显示器的时候提示&#xff08;如下图所示&#xff09;&#xff1a; 某些设置由系统管理员进行管理 解决方法 先试试这个方法&#xff1a; https://answers.microsoft.com/zh-hans/windows/forum/all/%E6%9B%B4%E6%94%B9%E5%88%86%E8%BE%A8%E7%8…