unity3d大型互动照片墙
1.本次應客戶需求,制作一個大型照片墻互動,輸出分辨率為9600*4320(注:unity3d官方推薦最大分辨率為8192*3686.4),經過現場長達24小時暴力測試中途未發生問題,姑且判定可以達到正常標準,廢話不多說,先上效果。
unity3d大型照片墻_嗶哩嗶哩_bilibili
下面列舉幾項用到的技術
待機視頻滾動條問題
在原有的照片層之上生成了一部分遮擋條,通過DoTween控制變化時間實現遮罩層的滾動問題
?上下相鄰照片重復問題
因為現場照片墻比較巨大,雖然每個位置照片都是從照片庫里邊進行獲取,但總不可避免上下照片會有重復,因此需要自己寫特定的算法進行規避上下照片重復問題,代碼如下:
//numeber數量,minNum最小范圍,maxNum最大范圍public int[] GetNum(int number, int minNum, int maxNum){List<int> RandomNum = new List<int>();int temp;int[] b = new int[number];System.Random r = new System.Random();for (int i = 0; i < number; i++){temp = r.Next(minNum, maxNum);if (!RandomNum.Contains(temp)){RandomNum.Add(temp);b[i] = temp;}else{i--;}}for (int j = 0; j < b.Length; j++){NewRandomNum[j] = b[j];}return b;}相鄰照片放大縮小問題
因為每次有照片放大,相應的周圍照片要進行縮小,為了使每次交互影響的照片范圍盡量小,可以提高可玩人數,采用放大中間位置,相應縮小周圍相鄰左右各兩行,五行一個單位避免影響其他行
照片上下無限滑動
unity3d自帶的Scroll View是無法實現上線無限滑動的,要實現這個功能我們就需要進行重寫Scroll View組件,代碼如下,篇幅有限就展示部分代碼,博客,github很多大神重寫的,大家有需求可以去找找:
?照片左右擠壓移動
導入dotween插件即可實現照片放大縮小,以及左右移動的緩動效果
?照片放大后播放視頻
由于現場可互動的范圍比較廣,播放視頻的個數不確定,可能可以同時播放20+個視頻,unity3d自帶的videoplayer就很難勝任播放工作,引入視頻播放插件AVPro,unity商店上大家可自行查找導入使用,同時AVPro播放視頻也方便大家外置替換
視頻播放點贊
為了簡化操作,就將點贊數使用excel存儲(方便甲方給某個領導設置點贊數,所以建議外置,隨時可修改),主要是實現excel的讀寫,先讀取此人已獲得的點贊數,然后展示出來,如果有用戶點贊,顯示紅心,并且點贊數+1
讀取excel并顯示代碼如下:
public void ReadExcel(int ID){//1.打開文件,創建一個文件流操作對象FileStream fileStream = new FileStream(Application.streamingAssetsPath + "/DZ/" + "/star.xlsx", FileMode.Open, FileAccess.Read);//2.創建一個excel讀取類IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);//方法2:讀取DataSet result = reader.AsDataSet();star = int.Parse(result.Tables[0].Rows[ID][1].ToString());mtext.text = star.ToString();reader.Close();}?寫入excel并顯示代碼如下
public void WriteExce(int wID){//string filePath = Application.dataPath + "/StreamingAssets" + "/" + "star.xlsx";string filePath = Application.streamingAssetsPath + "/DZ/" + "/star.xlsx";//string filePath = Application.dataPath + "/Excel/" + "star.xlsx";FileInfo file = new FileInfo(filePath);if (!file.Exists){Debug.LogError("not excel file!!!");}using (ExcelPackage package = new ExcelPackage(file)){star += 1;ExcelWorksheet worksheet = package.Workbook.Worksheets[1];worksheet.Cells[wID + 1, 2].Value = star;package.Save();}}?注意:人物視頻播放點贊,我的實現方式讀取-》寫入-》讀取,如果有什么簡化方式可以下方留言討論
視頻播放完畢關閉
因為是通過AVPro官方案例提示實時生成視頻組件進行播放視頻,因此沒想到檢測視頻是否播放并關閉的方法,最后在同事的提示下,為生成的MediaPlayer添加一個檢測視頻是否播放完畢的腳本,完美解決視頻播放完畢自動關閉問題
using System.Collections; using System.Collections.Generic; using UnityEngine; using RenderHeads.Media.AVProVideo;public class ControlPlayVideo : MonoBehaviour {private MediaPlayer mediaPlayer;// Start is called before the first frame updatevoid Start(){mediaPlayer = GetComponent<MediaPlayer>();mediaPlayer.Events.AddListener(OnVideoEvent);}public void OnVideoEvent(MediaPlayer mp, MediaPlayerEvent.EventType et, ErrorCode errorCode){switch (et){case MediaPlayerEvent.EventType.ReadyToPlay:break;case MediaPlayerEvent.EventType.Started:break;case MediaPlayerEvent.EventType.FirstFrameReady:break;case MediaPlayerEvent.EventType.FinishedPlaying://Debug.Log(gameObject.name + "播放完畢");mediaPlayer.Control.Stop();if (gameObject.transform.parent.parent!=null){Destroy(gameObject.transform.parent.parent.gameObject, 0.1f);ControlVolume.Instance.RemoveList();} break;}}此次縱向照片就總結到這,大家有什么意見或者建議,都可在下方留言,大家一起學習交流
總結
以上是生活随笔為你收集整理的unity3d大型互动照片墙的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++基本数据类型所占字节数
- 下一篇: Javascript 对象一(对象详解)