unity avpro實現互動影游關鍵問題

創建視頻播放器?

  • 在Hierarchy面板中右鍵創建:Video > AVPro Video - MediaPlayer
  • 創建后會生成一個MediaPlayer對象,用于控制視頻播放

添加視頻資源

  • 將視頻文件放入項目的StreamingAssets文件夾下
  • 在MediaPlayer組件的設置中選擇要播放的視頻文件

在UI上顯示視頻?

  • 創建Canvas對象
  • 在Canvas下添加DisplayUGUI組件用于將視頻渲染到UI
  • 將MediaPlayer拖拽到DisplayUGUI組件中

unity avpro切換視頻播放

核心思路,需要切換視頻時。將當前視頻A截一幀圖片pic顯示。播放器加載第二個視頻,等第二個視頻B事件MediaPlayerEvent.EventType.FirstFrameReady,延遲一幀將圖片pic隱藏即可。

實現簡單影游根據選項跳轉不同視頻播放

主要代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using RenderHeads.Media.AVProVideo;
using TMPro;
using System;public class Level : MonoBehaviour
{public MediaPlayer mediaPlayer;public string levelID; // 關卡唯一標識public Button op_btn1; // 操作按鈕1public Button op_btn2;public TextMeshProUGUI op_btn1_text;public TextMeshProUGUI op_btn2_text;public LevelNode levelNode;public float targetTime = 0.0f;public bool hasTriggered = false;public UnityEngine.UI.RawImage displayImage;// Start is called before the first frame updatevoid Start(){mediaPlayer.AutoStart = false;mediaPlayer.Events.AddListener(OnVideoEvent);op_btn1.onClick.AddListener(OnButtonClick_op1);op_btn2.onClick.AddListener(OnButtonClick_op2);HideOptionsUI();Invoke("test", 1.0f); // 延遲1秒顯示操作按鈕displayImage.gameObject.SetActive(false);}// Update is called once per framevoid Update(){}void FixedUpdate(){CheckCurrentTime();}void OnButtonClick_op1(){Debug.Log("Button 1 clicked in level: " + levelID);mediaPlayer.Pause();// 在這里添加按鈕1的操作邏輯FinishLevel(levelNode.op1_level);}void OnButtonClick_op2(){Debug.Log("Button 2 clicked in level: " + levelID);// 在這里添加按鈕2的操作邏輯FinishLevel(levelNode.op2_level);}void ShowOptionsUI(){op_btn1_text.text = levelNode.op1;op_btn2_text.text = levelNode.op2;op_btn1.GetComponent<RectTransform>().localPosition = new Vector3(levelNode.op1_x, levelNode.op1_y, 0);op_btn2.GetComponent<RectTransform>().localPosition = new Vector3(levelNode.op2_x, levelNode.op2_y, 0);op_btn1.gameObject.SetActive(true);op_btn2.gameObject.SetActive(true);}void HideOptionsUI(){op_btn1.gameObject.SetActive(false);op_btn2.gameObject.SetActive(false);}void OnVideoEvent(MediaPlayer mp, MediaPlayerEvent.EventType et, ErrorCode errorCode){switch (et){case MediaPlayerEvent.EventType.ReadyToPlay:Debug.Log("視頻加載完成,準備播放");break;case MediaPlayerEvent.EventType.Started:Debug.Log($"當前時間: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}視頻播放開始");break;case MediaPlayerEvent.EventType.FirstFrameReady:Debug.Log($"當前時間: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}第一幀渲染完成");StartCoroutine(DelayFunction());break;case MediaPlayerEvent.EventType.FinishedPlaying:Debug.Log("視頻播放完畢");break;case MediaPlayerEvent.EventType.FinishedSeeking:Debug.Log("跳轉到指定時間完成");break;default://Debug.Log("未知視頻事件",et);break;}}void CheckCurrentTime(){float currentTime = (float)mediaPlayer.Control.GetCurrentTime();if (targetTime != 0 && currentTime >= targetTime && !hasTriggered){hasTriggered = true;Debug.Log($"視頻已播放到目標時間: {targetTime}秒");// 在這里執行你的回調邏輯ShowOptionsUI();}}void test(){StartLevel("1");}void StartLevel(string levelid){LevelNode n = NodeCfg.Instance.GetNode(levelid);levelNode = n;Debug.Log($"當前時間: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}加載視頻開始");string fullpath = System.IO.Path.Combine(Application.streamingAssetsPath, "videos", levelNode.mp4);if (!mediaPlayer.OpenMedia(MediaPathType.RelativeToStreamingAssetsFolder, fullpath, false)){Debug.LogError("Video not found!");return;}if (n.op_time > 0){targetTime = n.op_time;}mediaPlayer.Play();Debug.Log($"當前時間: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}加載視頻結束");}void FinishLevel(string nextlevelid){HideOptionsUI();hasTriggered = false; // 重置觸發狀態targetTime = 0;CaptureAndDisplayLastFrame();StartLevel(nextlevelid);}private void CaptureAndDisplayLastFrame(){Debug.Log($"當前時間: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}截圖");// 創建Texture2D來保存截圖Texture2D texture = new Texture2D(mediaPlayer.Info.GetVideoWidth(), mediaPlayer.Info.GetVideoHeight(), TextureFormat.ARGB32, false);// 截取當前幀(最后一幀)mediaPlayer.ExtractFrame(texture);// 顯示截圖if (displayImage != null){displayImage.texture = texture;}displayImage.gameObject.SetActive(true);}IEnumerator DelayFunction(){yield return null; // 暫停一幀Debug.Log($"當前時間: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}下一幀執行");displayImage.gameObject.SetActive(false);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93897.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C找第一個只出現一次的字符】2022-8-18

緣由樣例通過&#xff0c;請問為什么錯了呢&#xff1f;(語言-c語言)-編程語言-CSDN問答 char str[100000];fgets(str, 100000, stdin);int a[26]{}, i, count 0;int len strlen(str);for (i 0; i<len; i) a[str[i] - a];for (i 0; i<len; i){if (a[str[i] - a] 1){…

MCP AI應用通信的底層機制

技術小館專注AI與Java領域的前沿技術知識庫 技術小館官網 在AI應用快速發展的今天&#xff0c;不同AI系統之間的高效通信成為技術架構的關鍵挑戰。MCP&#xff08;Model Context Protocol&#xff09;作為新一代AI應用通信協議&#xff0c;正在重新定義AI工具生態的構建方式。…

UI測試平臺TestComplete如何實現從Git到Jenkins的持續測試

還在為手動做UI測試又慢又累發愁&#xff1f;更頭痛的是&#xff0c;代碼改完還得等半天才能測&#xff0c;測完了結果又散得到處都是&#xff0c;根本看不清質量全貌?TestComplete幫你搞定&#xff1a;直接連上你的Git倉庫&#xff0c;代碼一有動靜就能感知。接著&#xff0c…

【Debian】4-?2 Gitea搭建

【Debian】4-?2 Gitea搭建一、準備工作二、創建 Gitea 用戶&#xff08;推薦&#xff09;三、下載并安裝 Gitea四、配置Gitea4-1 創建目錄結構4-2 創建配置目錄五、配置 Systemd 服務六、訪問 Gitea Web 界面七、小插曲一、準備工作 更新系統軟件為最新 sudo apt update &am…

【CDH × Docker】一次測試部署,N 次復用的環境鏡像方案

&#x1f680; 一次測試環境的探索&#xff1a;我如何將 CDH 集群打包成 Docker 鏡像&#xff0c;留給未來的自己 &#x1f9e9; 背景故事 最近在項目中&#xff0c;我們計劃上線一個基于 CDH&#xff08;Cloudera Distribution Hadoop&#xff09; 的大數據平臺。正式上生產環…

Java 日期時間格式化模式說明

Java 中日期時間格式化使用特定的模式字符串來定義輸出格式。以下是常見的格式化符號及其含義&#xff0c;適用于 SimpleDateFormat 和 DateTimeFormatter一、日期部分格式化符號符號含義示例y年 (Year)yyyy → 2023M月 (Month)MM → 09, MMM → Sep, MMMM → Septemberd月中的…

代碼隨想錄算法訓練營三十三天|動態規劃part06

LeetCode 322 零錢兌換 題目鏈接&#xff1a;322. 零錢兌換 - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xff0c;表示總金額。 計算并返回可以湊成總金額所需的 最少的硬幣個數 。…

【大模型LLM】大模型訓練加速 - 梯度累積(Gradient Accumulation)原理詳解

梯度累積&#xff08;Gradient Accumulation&#xff09;原理詳解 梯度累積是一種在深度學習訓練中常用的技術&#xff0c;特別適用于顯存有限但希望使用較大批量大小&#xff08;batch size&#xff09;的情況。通過梯度累積&#xff0c;可以在不增加單個批次大小的情況下模擬…

【數據分享】各省文旅融合耦合協調度及原始數據(2012-2022)

數據介紹引言 文旅融合是推動區域經濟高質量發展、促進共同富裕的重要路徑。黨的二十大報告明確提出“推進文化和旅游深度融合發展”的戰略目標&#xff0c;文旅產業通過資源整合與業態創新&#xff0c;可顯著縮小城鄉、區域差距&#xff0c;提升物質與精神雙重福祉&#xff08…

Linux編程: 10、線程池與初識網絡編程

今天我計劃通過一個小型項目&#xff0c;系統講解線程池與網絡編程的核心原理及實踐。項目將圍繞 “利用線程池實現高并發網絡通信” 這一核心需求展開&#xff0c;具體設計如下&#xff1a; 為保證線程安全&#xff0c;線程池采用單例模式設計&#xff0c;確保全局唯一實例避…

藏云閣 Logo 庫(開源項目SVG/PNG高清Logo)

在日常技術方案設計、架構圖繪制或PPT制作中&#xff0c;常常會遇到一些問題&#xff0c;比如&#xff1a; 找不到統一風格的開源項目組件圖標&#xff0c;PPT中的logo五花八門下載的圖標分辨率不足&#xff0c;放大后模糊失真不同來源的圖標顏色風格沖突&#xff0c;破壞整體…

從0開始學習R語言--Day64--決策樹回歸

對于沒有特征或者說需要尋找另類關系的數據集&#xff0c;我們通常會用聚合或KNN近鄰的方法來分類&#xff0c;但這樣的分類或許在結果上是好的&#xff0c;但是解釋性并不好&#xff0c;有時候我們甚至能看到好的結果反直覺&#xff1b;而決策樹回歸做出的結果&#xff0c;由于…

B+樹高效實現與優化技巧

B樹的定義 一顆M階B樹T,滿足以下條件 每個結點至多擁有M課子樹 根結點至少擁有兩顆子樹 除了根結點以外,其余每個分支結點至少擁有M/2課子樹 所有的葉結點都在同一層上 有k棵子樹的分支結點則存在k-1個關鍵字,關鍵字按照遞增順序進行排序 關鍵字數量滿足 ceil( M/2 ) - 1 &…

Android 基礎入門學習目錄(持續更新)

四大組件 Activity&#xff1a; Service&#xff1a; BroadcastReceiver&#xff1a; ContentProvider&#xff1a; UI 與交互開發 常見的UI布局和UI控件 樣式與主題 Fragment Intent 數據存儲 自定義View和自定義Group 自定義View 自定義ViewGroup 事件分發 Key…

Linux移動大量文件命令

背景 使用 mv 命令報“/bin/mv: 參數列表過長”&#xff0c;也是第一遇到&#xff0c;查了一下&#xff0c;最后用rsync命令解決了。還好每臺服務器&#xff0c;都必裝rsync了&#xff0c;記錄如下。 命令 nohup rsync -av --remove-source-files --progress /public/tmp/video…

SQL中的HAVING用法

HAVING 是 SQL 中專門對 “分組之后的聚合結果” 再做篩選的子句。 它一般跟在 GROUP BY 后面&#xff0c;不能單獨使用&#xff0c;作用類似于分組版的 WHERE。? 1. 語法位置 SELECT 列1, 聚合函數(列2) AS 別名 FROM 表 GROUP BY 列1 HAVING 聚合條件; -- 這里寫對聚合…

【Halcon 】Halcon 實戰:如何為 XLD 模板添加極性信息以提升匹配精度?

Halcon 實戰&#xff1a;如何為 XLD 模板添加極性信息以提升匹配精度&#xff1f; 在使用 Halcon 進行模板匹配時&#xff0c;我們通常有兩種方式創建模板&#xff1a; 基于圖像灰度&#xff08;CreateScaledShapeModel&#xff09;基于輪廓 XLD&#xff08;CreateScaledShapeM…

grafana/lock-stack 日志 Pipeline 配置

前言 本文使用的是 grafana/loki-stack chart 抓取的 k8s 日志。其他 chart 配置都差不多。 日志問題 docker 容器運行時 pod 內原始日志 [cpu-4] Hello, 第 9788 次報時&#xff0c;時間&#xff1a;2025-08-01T06:35:420000 {"HOSTNAME":"cpu-4",&qu…

appium2.0+之PointerActions詳解

以下內容在 夜神模擬器 上進行。 一、應用場景 一些針對手勢的操作&#xff0c;比如滑動、長按、拖動等。可以將這些基本手勢組合成一個相對復雜的手勢。 二、使用步驟創建觸摸輸入設備&#xff08;模擬手指操作&#xff09; touch_input PointerInput(interaction.POINTER_TO…

Java HTTPS 請求失敗排查與證書導入全過程

文章目錄Java HTTPS 請求失敗排查與證書導入全過程問題背景問題初步分析排查過程查看目標地址證書導入證書驗證證書是否導入成功重啟應用進一步驗證&#xff1a;是否真的是證書問題&#xff1f;1. 瀏覽器訪問2. 抓包工具驗證&#xff08;如 Charles、Wireshark&#xff09;補充…