TemplateModel.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. using SC.XR.Unity.Module_InputSystem;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.IO.Compression;
  7. using System.Reflection;
  8. using TriLibCore;
  9. using TriLibCore.Extensions;
  10. using UnityEngine;
  11. public class TemplateModel : BaseTemPlate
  12. {
  13. private GameObject m_ModelObj = null;
  14. protected override void OnEnable()
  15. {
  16. base.OnEnable();
  17. if (GameManager.Instance.IsRuning && m_ModelObj == null)
  18. {
  19. Debug.Log("ExtractZipFile===>1");
  20. if (IsAB())
  21. LoadABModel();
  22. else
  23. TriLibModel();
  24. }
  25. else
  26. {
  27. if (m_ModelObj && m_ModelObj.GetComponent<Animation>())
  28. {
  29. Debug.Log("Animation===>1"+ m_ModelObj.name);
  30. Animation _animation = m_ModelObj.GetComponent<Animation>();
  31. List<AnimationClip> _animations = _animation.GetAllAnimationClips();
  32. m_ModelObj.GetComponent<Animation>().Play(_animations[0].name, PlayMode.StopAll);
  33. }
  34. }
  35. if(this.gameObject.GetComponent<AudioSource>())
  36. this.gameObject.GetComponent<AudioSource>().Play();
  37. }
  38. private IEnumerator LoadModel()
  39. {
  40. yield return new WaitForSeconds(0.01f);
  41. if (GameManager.Instance.IsRuning && m_ModelObj == null)
  42. {
  43. //Debug.Log(Data.name);
  44. Debug.Log("DGJ ==>> "+Data.localLoadPath);
  45. var ab = AssetBundle.LoadFromFileAsync(Data.localLoadPath);
  46. yield return ab;
  47. if (ab == null)
  48. {
  49. Debug.Log("Failed to load AssetBundle!");
  50. }
  51. else
  52. {
  53. var allab = ab.assetBundle.LoadAllAssetsAsync<GameObject>();
  54. yield return allab;
  55. var prefab = ab.assetBundle.LoadAssetAsync<GameObject>((allab.allAssets[0] as GameObject).name);
  56. yield return prefab;
  57. switch (prefab.asset.name)
  58. {
  59. case "GHZ_OOBE_230721":
  60. var objload = Resources.LoadAsync<GameObject>("GongYe");
  61. yield return objload;
  62. GameObject obj = null;
  63. if (objload.asset is GameObject)
  64. {
  65. obj = objload.asset as GameObject;
  66. }
  67. if (obj == null)
  68. {
  69. Debug.LogError(" GHZ_OOBE_230721 物体加载失败,请查看是否导入相关Packages ");
  70. obj = new GameObject();
  71. }
  72. m_ModelObj = GameObject.Instantiate(obj,transform);
  73. m_ModelObj.name = "GongYe";
  74. if (GameObject.Find("AudioManager") ==null)
  75. {
  76. GameObject audio = Resources.Load<GameObject>("AudioManager");
  77. if(audio ==null)
  78. {
  79. Debug.LogError(" GHZ_OOBE_230721 Packages内AudioManager组件丢失");
  80. audio = new GameObject();
  81. }
  82. GameObject Audio = GameObject.Instantiate(audio, transform);
  83. Audio.name = "AudioManager";
  84. }
  85. break;
  86. case "GHZ_XXXXXX_230721":
  87. break;
  88. default:
  89. m_ModelObj = Instantiate(prefab.asset as GameObject, transform);
  90. break;
  91. }
  92. //if (ab.LoadAllAssets<GameObject>()[0].name == "MRVideo")
  93. //m_ModelObj.AddComponent<MovieScreen>();
  94. gameObject.AddComponent<ManipulationHandler>();
  95. gameObject.AddComponent<BoundingBox>();
  96. gameObject.AddComponent<Patch_ModelController>();
  97. yield return new WaitForSeconds(0.3f);
  98. ab.assetBundle.Unload(false);
  99. HideCollider();
  100. }
  101. //var obj = DownloadManager.Instance.GetAbObj(Util.MD5Encrypt(Data.downloadPath));
  102. //if (obj != null)
  103. //{
  104. // m_ModelObj = Instantiate(obj, transform);
  105. // m_ModelObj.transform.localPosition = Vector3.zero;
  106. // m_ModelObj.gameObject.SetActive(true);
  107. //}
  108. }
  109. }
  110. public void LoadModel(AssetBundle ab)
  111. {
  112. GameManager.Instance.StartCoroutine(LoadABModel(ab));
  113. //LoadABModel(ab);
  114. }
  115. private IEnumerator LoadABModel(AssetBundle ab)
  116. {
  117. if (ab == null)
  118. {
  119. Debug.Log("Failed to load AssetBundle!");
  120. }
  121. else
  122. {
  123. var allab = ab.LoadAllAssetsAsync<GameObject>();
  124. yield return allab;
  125. var prefab = ab.LoadAssetAsync<GameObject>((allab.allAssets[0] as GameObject).name);
  126. switch (prefab.asset.name)
  127. {
  128. case "GHZ_OOBE_230721":
  129. var objload = Resources.LoadAsync<GameObject>("GongYe");
  130. yield return objload;
  131. GameObject obj = null;
  132. if (objload.asset is GameObject)
  133. {
  134. obj = objload.asset as GameObject;
  135. }
  136. m_ModelObj = GameObject.Instantiate(obj, transform);
  137. m_ModelObj.name = "GongYe";
  138. if (GameObject.Find("AudioManager") == null)
  139. {
  140. GameObject audio = Resources.Load<GameObject>("AudioManager");
  141. if (audio == null)
  142. {
  143. Debug.LogError(" GHZ_OOBE_230721 Packages内AudioManager组件丢失");
  144. audio = new GameObject();
  145. }
  146. GameObject Audio = GameObject.Instantiate(audio, null);
  147. Audio.name = "AudioManager";
  148. }
  149. break;
  150. case "GHZ_XXXXXX_230721":
  151. break;
  152. default:
  153. m_ModelObj = Instantiate(prefab.asset as GameObject, transform);
  154. break;
  155. }
  156. //if (ab.LoadAllAssets<GameObject>()[0].name == "MRVideo")
  157. //m_ModelObj.AddComponent<MovieScreen>();
  158. gameObject.AddComponent<ManipulationHandler>();
  159. gameObject.AddComponent<BoundingBox>();
  160. // yield return new WaitForSeconds(0.3f);
  161. ab.Unload(false);
  162. HideCollider();
  163. ModelItem.isLoad = false;
  164. }
  165. }
  166. protected override void OnAwake()
  167. {
  168. base.OnAwake();
  169. }
  170. public override void SetData(MaterialObjValue value, int updateTime)
  171. {
  172. base.SetData(value, updateTime);
  173. //if (gameObject.GetComponent<Collider>() != null)
  174. //{
  175. // Destroy(gameObject.GetComponent<Collider>());
  176. //}
  177. //下载列表中加入数据
  178. if (!GameManager.Instance.IsRuning|| Data == null)
  179. {
  180. // DownloadManager.Instance.AddDownloadData(Data);
  181. DownLoadMaterial data = new DownLoadMaterial();
  182. this.Data = data;
  183. data.downLoadPath = value.DownloadPath;
  184. data.localLoadPath = Application.persistentDataPath + "/Material/" + Path.GetFileName(value.DownloadPath);
  185. data.updataTime = GameManager.Instance.m_SceneValue.updateTime;
  186. data.type = "3";
  187. MsgHandler.AddListener(value.DownloadPath, HandleMsg);
  188. DownloadResManager.Instance.DownLoad(data);
  189. Debug.Log(" SetData " + updateTime);
  190. }
  191. else
  192. {
  193. if (IsAB())
  194. LoadABModel();
  195. else
  196. TriLibModel();
  197. //AssetBundle ab = AssetBundle.LoadFromFile(Data.localLoadPath);
  198. //if (ab == null)
  199. //{
  200. // Debug.Log("Failed to load AssetBundle!");
  201. // return;
  202. //}
  203. //var prefab = ab.LoadAsset<GameObject>(ab.LoadAllAssets<GameObject>()[0].name);
  204. //m_ModelObj = Instantiate(prefab, transform);
  205. //ab.Unload(false);
  206. //gameObject.AddComponent<ManipulationHandler>();
  207. //gameObject.AddComponent<BoundingBox>();
  208. //var obj = DownloadManager.Instance.GetAbObj(Util.MD5Encrypt(Data.downloadPath));
  209. //if (obj != null)
  210. //{
  211. // m_ModelObj = Instantiate(obj, transform);
  212. // m_ModelObj.transform.localPosition = Vector3.zero;
  213. // m_ModelObj.gameObject.SetActive(true);
  214. //}
  215. }
  216. }
  217. private void HandleMsg(Msg msg)
  218. {
  219. Debug.Log("DGJ TemplateModel ");
  220. if(msg.Value!=null)
  221. {
  222. if (IsAB())
  223. LoadABModel();
  224. else
  225. TriLibModel();
  226. }
  227. else
  228. {
  229. InstantiateCommand Command = new InstantiateCommand(
  230. InstantiateSystem.Instance.BlueObject.WarningPopUp,
  231. InstantiateSystem.Instance.BlueObject.NetErrorText);
  232. CommandSystem.Instance.Send(Command);
  233. Debug.LogError(" 模型下载失败 ");
  234. }
  235. }
  236. private bool IsAB()
  237. {
  238. bool finish = false;
  239. string fileName = Path.GetFileName(Data.localLoadPath);
  240. Debug.Log("HJJ fileName===>"+ fileName);
  241. if(fileName.Contains(".ghb") ||!fileName.Contains("."))
  242. {
  243. finish = true;
  244. }
  245. return finish;
  246. }
  247. private void LoadABModel()
  248. {
  249. AssetBundle ab = AssetBundle.LoadFromFile(Data.localLoadPath);
  250. if (ab == null)
  251. {
  252. Debug.Log("Failed to load AssetBundle!");
  253. return;
  254. }
  255. var prefab = ab.LoadAsset<GameObject>(ab.LoadAllAssets<GameObject>()[0].name);
  256. m_ModelObj = Instantiate(prefab, transform);
  257. ab.Unload(false);
  258. ManipulationHandler manipulation = gameObject.AddComponent<ManipulationHandler>();
  259. manipulation.enabled = false;
  260. BoundingBox boundingBox = gameObject.AddComponent<BoundingBox>();
  261. boundingBox.enabled = false;
  262. }
  263. /// <summary>
  264. /// 解压
  265. /// </summary>
  266. /// <param name="zipFilePath">压缩文件路径</param>
  267. /// <param name="extractPath">解压路径</param>
  268. public bool ExtractZipFile(string zipFilePath)
  269. {
  270. bool isAB=false;
  271. if(!zipFilePath.Contains(".zip"))
  272. {
  273. return false;
  274. }
  275. Debug.Log("ExtractZipFile===>1");
  276. using (ZipArchive archive = ZipFile.OpenRead(zipFilePath))
  277. {
  278. byte[] ghbbytes = null;
  279. Debug.Log("ExtractZipFile===>2");
  280. foreach (ZipArchiveEntry entry in archive.Entries)
  281. {
  282. Debug.Log("ExtractZipFile==FullName=>2" + entry.FullName);
  283. if (entry.FullName.Contains(".ghb") || !entry.FullName.Contains("."))
  284. {
  285. isAB = true;
  286. if (entry.Name != "")
  287. {
  288. entry.ExtractToFile(Application.persistentDataPath+"/"+ entry.FullName,true);
  289. FileInfo finfo = new FileInfo(Application.persistentDataPath + "/" + entry.FullName);
  290. byte[] bytes= readbytes(finfo.OpenRead());
  291. if (!entry.FullName.Contains(".bytes"))
  292. {
  293. ghbbytes = bytes;
  294. }
  295. }
  296. }
  297. else if(entry.FullName.Contains(".mp3"))
  298. {
  299. if (entry.Name != ""&&File.Exists(Application.persistentDataPath + "/" + entry.FullName))
  300. {
  301. entry.ExtractToFile(Application.persistentDataPath + "/" + entry.FullName, true);
  302. FileInfo finfo = new FileInfo(Application.persistentDataPath + "/" + entry.FullName);
  303. byte[] bytes = readbytes(finfo.OpenRead());
  304. float[] fs = bytesToFloat(bytes);
  305. AudioClip clip = AudioClip.Create(entry.FullName, fs.Length, 1, 16000, false);
  306. clip.SetData(fs, 0);
  307. if(!this.gameObject.GetComponent<AudioSource>())
  308. {
  309. this.gameObject.AddComponent<AudioSource>();
  310. }
  311. this.gameObject.GetComponent<AudioSource>().clip = clip;
  312. this.gameObject.GetComponent<AudioSource>().Play();
  313. }
  314. return true;
  315. }
  316. }
  317. if(isAB)
  318. {
  319. Debug.Log("ExtractZipFile===>3");
  320. if (ghbbytes!=null)
  321. {
  322. Debug.Log("ExtractZipFile===>5");
  323. AssetBundle ab = AssetBundle.LoadFromMemory(ghbbytes);
  324. var prefab = ab.LoadAsset<GameObject>(ab.LoadAllAssets<GameObject>()[0].name);
  325. m_ModelObj = Instantiate(prefab, transform);
  326. ab.Unload(false);
  327. ManipulationHandler manipulation = gameObject.AddComponent<ManipulationHandler>();
  328. manipulation.enabled = false;
  329. BoundingBox boundingBox = gameObject.AddComponent<BoundingBox>();
  330. boundingBox.enabled = false;
  331. }
  332. }
  333. return isAB;
  334. }
  335. }
  336. public static float[] bytesToFloat(byte[] byteArray)//byte[]数组转化为AudioClip可读取的float[]类型
  337. {
  338. float[] sounddata = new float[byteArray.Length / 2];
  339. for (int i = 0; i < sounddata.Length; i++)
  340. {
  341. sounddata[i] = bytesToFloat(byteArray[i * 2], byteArray[i * 2 + 1]);
  342. }
  343. return sounddata;
  344. }
  345. static float bytesToFloat(byte firstByte, byte secondByte)
  346. {
  347. // convert two bytes to one short (little endian)
  348. //小端和大端顺序要调整
  349. short s;
  350. if (BitConverter.IsLittleEndian)
  351. s = (short)((secondByte << 8) | firstByte);
  352. else
  353. s = (short)((firstByte << 8) | secondByte);
  354. // convert to range from -1 to (just below) 1
  355. return s / 32768.0F;
  356. }
  357. public byte[] readbytes(Stream stream)
  358. {
  359. using (Stream fs = stream)
  360. {
  361. byte[] bytes = new byte[fs.Length];
  362. fs.Read(bytes, 0, bytes.Length);
  363. fs.Close();
  364. return bytes;
  365. }
  366. }
  367. public void TriLibModel()
  368. {
  369. if(m_ModelObj)
  370. {
  371. return;
  372. }
  373. Debug.Log("模型加载完成TriLibModel" + Data.localLoadPath);
  374. if (false)//ExtractZipFile(Data.localLoadPath)
  375. {
  376. }
  377. else
  378. {
  379. Debug.Log("模型加载完成TriLibModel" + Data.localLoadPath);
  380. try
  381. {
  382. TriLibModelLoad.Load(Data.localLoadPath, (AssetLoaderContext ac) => {
  383. Debug.Log("模型加载完成");
  384. }, (AssetLoaderContext ac) => {
  385. Debug.Log("载材质加完成");
  386. Bounds bounds = GetAllBounds.GetRendererBounds(ac.RootGameObject);
  387. GameObject obj = new GameObject("Test");
  388. obj.transform.position = bounds.center;
  389. obj.transform.SetParent(ac.RootGameObject.transform);
  390. float bizhi = 0.4f / bounds.size.x;
  391. ac.RootGameObject.transform.localScale = Vector3.one * bizhi;
  392. ac.RootGameObject.transform.SetParent(this.transform.parent);
  393. Vector3 v3local = (Vector3.zero - obj.transform.position) ;
  394. ac.RootGameObject.transform.SetParent(this.transform);
  395. ac.RootGameObject.transform.localPosition = v3local;
  396. ac.RootGameObject.transform.localScale = ac.RootGameObject.transform.localScale * this.transform.localScale.x;
  397. ac.RootGameObject.transform.localEulerAngles = Vector3.zero;
  398. ac.RootGameObject.SetActive(true);
  399. // ac.RootGameObject.transform.position = Camera.main.transform.forward;
  400. m_ModelObj = Instantiate(ac.RootGameObject, transform);
  401. ManipulationHandler manipulation = gameObject.AddComponent<ManipulationHandler>();
  402. manipulation.enabled = false;
  403. BoundingBox boundingBox = gameObject.AddComponent<BoundingBox>();
  404. boundingBox.enabled = false;
  405. ac.RootGameObject.SetActive(false);
  406. if (m_ModelObj && m_ModelObj.GetComponent<Animation>())
  407. {
  408. Debug.Log("Animation===>1" + m_ModelObj.name);
  409. Animation _animation = m_ModelObj.GetComponent<Animation>();
  410. List<AnimationClip> _animations = _animation.GetAllAnimationClips();
  411. m_ModelObj.GetComponent<Animation>().Play(_animations[0].name, PlayMode.StopAll);
  412. }
  413. if (this.gameObject.GetComponent<BoxCollider>())
  414. {
  415. this.gameObject.GetComponent<BoxCollider>().size = Vector3.one * 0.4f;
  416. }
  417. }, (AssetLoaderContext ac, float f) => {
  418. Debug.Log("加载中==》" + f);
  419. }, (IContextualizedError error) => {
  420. Debug.Log("加载失败" + error);
  421. });
  422. }
  423. catch
  424. {
  425. Debug.Log("加载失败" + Data.localLoadPath);
  426. }
  427. }
  428. }
  429. public override void HideCollider()
  430. {
  431. base.HideCollider();
  432. }
  433. }