unity3d大型互动照片墙
1.本次應(yīng)客戶需求,制作一個(gè)大型照片墻互動(dòng),輸出分辨率為9600*4320(注:unity3d官方推薦最大分辨率為8192*3686.4),經(jīng)過現(xiàn)場(chǎng)長(zhǎng)達(dá)24小時(shí)暴力測(cè)試中途未發(fā)生問題,姑且判定可以達(dá)到正常標(biāo)準(zhǔn),廢話不多說,先上效果。
unity3d大型照片墻_嗶哩嗶哩_bilibili
下面列舉幾項(xiàng)用到的技術(shù)
待機(jī)視頻滾動(dòng)條問題
在原有的照片層之上生成了一部分遮擋條,通過DoTween控制變化時(shí)間實(shí)現(xiàn)遮罩層的滾動(dòng)問題
?上下相鄰照片重復(fù)問題
因?yàn)楝F(xiàn)場(chǎng)照片墻比較巨大,雖然每個(gè)位置照片都是從照片庫里邊進(jìn)行獲取,但總不可避免上下照片會(huì)有重復(fù),因此需要自己寫特定的算法進(jìn)行規(guī)避上下照片重復(fù)問題,代碼如下:
//numeber數(shù)量,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;}相鄰照片放大縮小問題
因?yàn)槊看斡姓掌糯?#xff0c;相應(yīng)的周圍照片要進(jìn)行縮小,為了使每次交互影響的照片范圍盡量小,可以提高可玩人數(shù),采用放大中間位置,相應(yīng)縮小周圍相鄰左右各兩行,五行一個(gè)單位避免影響其他行
照片上下無限滑動(dòng)
unity3d自帶的Scroll View是無法實(shí)現(xiàn)上線無限滑動(dòng)的,要實(shí)現(xiàn)這個(gè)功能我們就需要進(jìn)行重寫Scroll View組件,代碼如下,篇幅有限就展示部分代碼,博客,github很多大神重寫的,大家有需求可以去找找:
?照片左右擠壓移動(dòng)
導(dǎo)入dotween插件即可實(shí)現(xiàn)照片放大縮小,以及左右移動(dòng)的緩動(dòng)效果
?照片放大后播放視頻
由于現(xiàn)場(chǎng)可互動(dòng)的范圍比較廣,播放視頻的個(gè)數(shù)不確定,可能可以同時(shí)播放20+個(gè)視頻,unity3d自帶的videoplayer就很難勝任播放工作,引入視頻播放插件AVPro,unity商店上大家可自行查找導(dǎo)入使用,同時(shí)AVPro播放視頻也方便大家外置替換
視頻播放點(diǎn)贊
為了簡(jiǎn)化操作,就將點(diǎn)贊數(shù)使用excel存儲(chǔ)(方便甲方給某個(gè)領(lǐng)導(dǎo)設(shè)置點(diǎn)贊數(shù),所以建議外置,隨時(shí)可修改),主要是實(shí)現(xiàn)excel的讀寫,先讀取此人已獲得的點(diǎn)贊數(shù),然后展示出來,如果有用戶點(diǎn)贊,顯示紅心,并且點(diǎn)贊數(shù)+1
讀取excel并顯示代碼如下:
public void ReadExcel(int ID){//1.打開文件,創(chuàng)建一個(gè)文件流操作對(duì)象FileStream fileStream = new FileStream(Application.streamingAssetsPath + "/DZ/" + "/star.xlsx", FileMode.Open, FileAccess.Read);//2.創(chuàng)建一個(gè)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();}}?注意:人物視頻播放點(diǎn)贊,我的實(shí)現(xiàn)方式讀取-》寫入-》讀取,如果有什么簡(jiǎn)化方式可以下方留言討論
視頻播放完畢關(guān)閉
因?yàn)槭峭ㄟ^AVPro官方案例提示實(shí)時(shí)生成視頻組件進(jìn)行播放視頻,因此沒想到檢測(cè)視頻是否播放并關(guān)閉的方法,最后在同事的提示下,為生成的MediaPlayer添加一個(gè)檢測(cè)視頻是否播放完畢的腳本,完美解決視頻播放完畢自動(dòng)關(guān)閉問題
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;}}此次縱向照片就總結(jié)到這,大家有什么意見或者建議,都可在下方留言,大家一起學(xué)習(xí)交流
總結(jié)
以上是生活随笔為你收集整理的unity3d大型互动照片墙的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++基本数据类型所占字节数
- 下一篇: 根据文件扩展名得到文件对应该类型Icon