⭐ 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 分类小提…

代码随想录算法训练营第五天| 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表基础课程笔记 1. 什么是哈希表 哈希表&#xff08;Hash Table&#xff09;又称为散列表&#xff0c;是一种基于关键码&#xff08;Key&#xff09;直接进行访问的数据结构。简单理解&#xff0c;数组其实也是一种哈希表。哈希表通过关键码映射到数组的索引&#xff0c;…

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;其中每个节点代表文…

Docker system

docker system --help siqialiyun-sh-001:~/images$ sudo docker system --helpUsage: docker system COMMANDManage DockerCommands:df Show docker disk usage(显示docker磁盘使用情况)events Get real time events from the server(从服务器获取实时事件)in…

MySQL新手向:对比常用存储引擎

前言 为什么MySQL拥有的存储引擎有那么多&#xff0c;偏偏最常用的是InnoDB呢&#xff1f;带着这个问题&#xff0c;让我们对比几种常用的存储引擎&#xff0c;理解InnoDB的优势吧。 一、MyISAM存储引擎 1.1、MyISAM介绍 先说说MyISAM存储引擎的特点&#xff1a; 不支持事…

【协议】IIC总线协议学习

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

代码笔记:Linux系统上解压文件

zip unzip filename.zip -d /path/to/directorytar.gz tar -xzvf file.tar.gz -x: 表示提取&#xff08;extract&#xff09;文件&#xff0c;从压缩包中解压内容。-z: 表示使用 gzip 压缩&#xff0c;.tar.gz 文件是经过 gzip 压缩的 tar 包&#xff0c;因此需要这个选项来处…

存储设备专栏 2.5 -- linux 下块设备信息查看命令 lsblk 详细介绍】

> 请阅读【嵌入式及芯片开发学必备专栏】< 文章目录 lsblk 命令命令结构常用参数示例示例 1&#xff1a;基本用法示例 2&#xff1a;显示文件系统信息示例 3&#xff1a;仅列出磁盘示例 4&#xff1a;指定输出格式示例 5&#xff1a;以 JSON 格式输出 Summary lsblk 命令…

算法之二分查找

概述 二分查找算法的应用&#xff0c;包括有序和无序数据&#xff0c;有序数组默认按从小到大排序 在有序数组中找到num /*** 4 二分查找 在有序数组中找到num* 思路&#xff1a;找中值&#xff0c;然后中值元素和目标值比较。如果中值元素比目标值大&#xff0c;则继续在左…

React开发一个WebSocket

export default class SocketService {static instance null;static get Instance() {if (!this.instance) {this.instance new SocketService();}return this.instance;}// 和服务端连接的socket对象ws null;// 存储回调函数callBackMapping {};// 标识是否连接成功connec…

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

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

Prometheus 抓取 nginx 访问日志的指标

要通过 Prometheus 的 NGINX Exporter 来抓取 NGINX 中的日志信息&#xff0c;例如状态码为 4xx 或 5xx 的日志&#xff0c;需要结合以下几种工具和方法&#xff1a; 1. NGINX Exporter 基础功能 NGINX Exporter 是一个 Prometheus Exporter&#xff0c;用于从 NGINX 的 /sta…

.mkp勒索病毒攻击全攻略:防护、数据恢复与安全建议

导言 随着互联网的发展&#xff0c;勒索病毒的威胁也在不断升级&#xff0c;给个人和企业的数据安全带来了巨大的挑战。其中&#xff0c;[datastorecyberfear.com].mkp、 [tsai.shenmailfence.com].mkp、 [sspdlk00036cock.li].mkp勒索病毒作为一种新型的加密型恶意病毒&#…

Chromium 中HTML5 WebSocket实现分析c++(一)

一、WebSocket前端接口定义&#xff1a; WebSocket 对象提供了用于创建和管理 WebSocket 连接&#xff0c;以及可以通过该连接发送和接收数据的 API。 使用 WebSocket() 构造函数来构造一个 WebSocket。 构造函数 WebSocket(url[, protocols]) 返回一个 WebSocket 对象。 …

如何读书?

如何读书&#xff1f; 方法论、读书、意义、思考背景 对于知识获取一直有一个疑问&#xff0c;那就是如何有效获取知识&#xff1f;这个答案我自己并没有总结出来&#xff0c;其一是本文要谈的读书&#xff0c;其他呢&#xff1f;多了暂未想到&#xff0c;先写读书吧。 恰巧…

System:oneshot类型的service

有的时候,某个进程只在特殊的情况下运行一下即可,不需要一直以服务的形式待命,这种情况下,可以设置service的type为oneshot,然后设置RemainAfterExit=yes。 这样设置的service,即使在其进程启动完成之后退出了,systemd 也仍然会认为这个服务还在运行中,将此服务视为活…

新时代下吉林省城乡流动人才就业问题及路径探析

摘要&#xff1a;新时代背景下&#xff0c;中国经济快速发展&#xff0c;城乡融合发展成为缩小城乡差距&#xff0c;推动共同富裕的重要方式。吉林省作为东北老工业基地&#xff0c;传统产业竞争优势减弱&#xff0c;城乡流动人才就业规模增加&#xff0c;并呈现“农村-城市”的…