TemplateModel.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  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. }
  36. private IEnumerator LoadModel()
  37. {
  38. yield return new WaitForSeconds(0.01f);
  39. if (GameManager.Instance.IsRuning && m_ModelObj == null)
  40. {
  41. //Debug.Log(Data.name);
  42. Debug.Log("DGJ ==>> "+Data.localLoadPath);
  43. var ab = AssetBundle.LoadFromFileAsync(Data.localLoadPath);
  44. yield return ab;
  45. if (ab == null)
  46. {
  47. Debug.Log("Failed to load AssetBundle!");
  48. }
  49. else
  50. {
  51. var allab = ab.assetBundle.LoadAllAssetsAsync<GameObject>();
  52. yield return allab;
  53. var prefab = ab.assetBundle.LoadAssetAsync<GameObject>((allab.allAssets[0] as GameObject).name);
  54. yield return prefab;
  55. switch (prefab.asset.name)
  56. {
  57. case "GHZ_OOBE_230721":
  58. var objload = Resources.LoadAsync<GameObject>("GongYe");
  59. yield return objload;
  60. GameObject obj = null;
  61. if (objload.asset is GameObject)
  62. {
  63. obj = objload.asset as GameObject;
  64. }
  65. if (obj == null)
  66. {
  67. Debug.LogError(" GHZ_OOBE_230721 物体加载失败,请查看是否导入相关Packages ");
  68. obj = new GameObject();
  69. }
  70. m_ModelObj = GameObject.Instantiate(obj,transform);
  71. m_ModelObj.name = "GongYe";
  72. if (GameObject.Find("AudioManager") ==null)
  73. {
  74. GameObject audio = Resources.Load<GameObject>("AudioManager");
  75. if(audio ==null)
  76. {
  77. Debug.LogError(" GHZ_OOBE_230721 Packages内AudioManager组件丢失");
  78. audio = new GameObject();
  79. }
  80. GameObject Audio = GameObject.Instantiate(audio, transform);
  81. Audio.name = "AudioManager";
  82. }
  83. break;
  84. case "GHZ_XXXXXX_230721":
  85. break;
  86. default:
  87. m_ModelObj = Instantiate(prefab.asset as GameObject, transform);
  88. break;
  89. }
  90. //if (ab.LoadAllAssets<GameObject>()[0].name == "MRVideo")
  91. //m_ModelObj.AddComponent<MovieScreen>();
  92. gameObject.AddComponent<ManipulationHandler>();
  93. gameObject.AddComponent<BoundingBox>();
  94. gameObject.AddComponent<Patch_ModelController>();
  95. yield return new WaitForSeconds(0.3f);
  96. ab.assetBundle.Unload(false);
  97. HideCollider();
  98. }
  99. //var obj = DownloadManager.Instance.GetAbObj(Util.MD5Encrypt(Data.downloadPath));
  100. //if (obj != null)
  101. //{
  102. // m_ModelObj = Instantiate(obj, transform);
  103. // m_ModelObj.transform.localPosition = Vector3.zero;
  104. // m_ModelObj.gameObject.SetActive(true);
  105. //}
  106. }
  107. }
  108. public void LoadModel(AssetBundle ab)
  109. {
  110. GameManager.Instance.StartCoroutine(LoadABModel(ab));
  111. //LoadABModel(ab);
  112. }
  113. private IEnumerator LoadABModel(AssetBundle ab)
  114. {
  115. if (ab == null)
  116. {
  117. Debug.Log("Failed to load AssetBundle!");
  118. }
  119. else
  120. {
  121. var allab = ab.LoadAllAssetsAsync<GameObject>();
  122. yield return allab;
  123. var prefab = ab.LoadAssetAsync<GameObject>((allab.allAssets[0] as GameObject).name);
  124. switch (prefab.asset.name)
  125. {
  126. case "GHZ_OOBE_230721":
  127. var objload = Resources.LoadAsync<GameObject>("GongYe");
  128. yield return objload;
  129. GameObject obj = null;
  130. if (objload.asset is GameObject)
  131. {
  132. obj = objload.asset as GameObject;
  133. }
  134. m_ModelObj = GameObject.Instantiate(obj, transform);
  135. m_ModelObj.name = "GongYe";
  136. if (GameObject.Find("AudioManager") == null)
  137. {
  138. GameObject audio = Resources.Load<GameObject>("AudioManager");
  139. if (audio == null)
  140. {
  141. Debug.LogError(" GHZ_OOBE_230721 Packages内AudioManager组件丢失");
  142. audio = new GameObject();
  143. }
  144. GameObject Audio = GameObject.Instantiate(audio, null);
  145. Audio.name = "AudioManager";
  146. }
  147. break;
  148. case "GHZ_XXXXXX_230721":
  149. break;
  150. default:
  151. m_ModelObj = Instantiate(prefab.asset as GameObject, transform);
  152. break;
  153. }
  154. //if (ab.LoadAllAssets<GameObject>()[0].name == "MRVideo")
  155. //m_ModelObj.AddComponent<MovieScreen>();
  156. gameObject.AddComponent<ManipulationHandler>();
  157. gameObject.AddComponent<BoundingBox>();
  158. // yield return new WaitForSeconds(0.3f);
  159. ab.Unload(false);
  160. HideCollider();
  161. ModelItem.isLoad = false;
  162. }
  163. }
  164. protected override void OnAwake()
  165. {
  166. base.OnAwake();
  167. }
  168. public override void SetData(MaterialObjValue value, int updateTime)
  169. {
  170. base.SetData(value, updateTime);
  171. //if (gameObject.GetComponent<Collider>() != null)
  172. //{
  173. // Destroy(gameObject.GetComponent<Collider>());
  174. //}
  175. //下载列表中加入数据
  176. if (!GameManager.Instance.IsRuning|| Data == null)
  177. {
  178. // DownloadManager.Instance.AddDownloadData(Data);
  179. DownLoadMaterial data = new DownLoadMaterial();
  180. this.Data = data;
  181. data.downLoadPath = value.DownloadPath;
  182. data.localLoadPath = Application.persistentDataPath + "/Material/" + Path.GetFileName(value.DownloadPath);
  183. data.updataTime = GameManager.Instance.m_SceneValue.updateTime;
  184. data.type = "3";
  185. MsgHandler.AddListener(value.DownloadPath, HandleMsg);
  186. DownloadResManager.Instance.DownLoad(data);
  187. Debug.Log(" SetData " + updateTime);
  188. }
  189. else
  190. {
  191. if (IsAB())
  192. LoadABModel();
  193. else
  194. TriLibModel();
  195. //AssetBundle ab = AssetBundle.LoadFromFile(Data.localLoadPath);
  196. //if (ab == null)
  197. //{
  198. // Debug.Log("Failed to load AssetBundle!");
  199. // return;
  200. //}
  201. //var prefab = ab.LoadAsset<GameObject>(ab.LoadAllAssets<GameObject>()[0].name);
  202. //m_ModelObj = Instantiate(prefab, transform);
  203. //ab.Unload(false);
  204. //gameObject.AddComponent<ManipulationHandler>();
  205. //gameObject.AddComponent<BoundingBox>();
  206. //var obj = DownloadManager.Instance.GetAbObj(Util.MD5Encrypt(Data.downloadPath));
  207. //if (obj != null)
  208. //{
  209. // m_ModelObj = Instantiate(obj, transform);
  210. // m_ModelObj.transform.localPosition = Vector3.zero;
  211. // m_ModelObj.gameObject.SetActive(true);
  212. //}
  213. }
  214. }
  215. private void HandleMsg(Msg msg)
  216. {
  217. Debug.Log("DGJ TemplateModel ");
  218. if(msg.Value!=null)
  219. {
  220. if (IsAB())
  221. LoadABModel();
  222. else
  223. TriLibModel();
  224. }
  225. else
  226. {
  227. InstantiateCommand Command = new InstantiateCommand(
  228. InstantiateSystem.Instance.BlueObject.WarningPopUp,
  229. InstantiateSystem.Instance.BlueObject.NetErrorText);
  230. CommandSystem.Instance.Send(Command);
  231. Debug.LogError(" 模型下载失败 ");
  232. }
  233. }
  234. private bool IsAB()
  235. {
  236. bool finish = false;
  237. string fileName = Path.GetFileName(Data.localLoadPath);
  238. Debug.Log("HJJ fileName===>"+ fileName);
  239. if(fileName.Contains(".ghb") ||!fileName.Contains("."))
  240. {
  241. finish = true;
  242. }
  243. return finish;
  244. }
  245. private void LoadABModel()
  246. {
  247. AssetBundle ab = AssetBundle.LoadFromFile(Data.localLoadPath);
  248. if (ab == null)
  249. {
  250. Debug.Log("Failed to load AssetBundle!");
  251. return;
  252. }
  253. var prefab = ab.LoadAsset<GameObject>(ab.LoadAllAssets<GameObject>()[0].name);
  254. m_ModelObj = Instantiate(prefab, transform);
  255. ab.Unload(false);
  256. ManipulationHandler manipulation = gameObject.AddComponent<ManipulationHandler>();
  257. manipulation.enabled = false;
  258. BoundingBox boundingBox = gameObject.AddComponent<BoundingBox>();
  259. boundingBox.enabled = false;
  260. }
  261. /// <summary>
  262. /// 解压
  263. /// </summary>
  264. /// <param name="zipFilePath">压缩文件路径</param>
  265. /// <param name="extractPath">解压路径</param>
  266. public bool ExtractZipFile(string zipFilePath)
  267. {
  268. bool isAB=false;
  269. if(!zipFilePath.Contains(".zip"))
  270. {
  271. return false;
  272. }
  273. Debug.Log("ExtractZipFile===>1");
  274. using (ZipArchive archive = ZipFile.OpenRead(zipFilePath))
  275. {
  276. byte[] ghbbytes = null;
  277. byte[] csbytes = null;
  278. Debug.Log("ExtractZipFile===>2");
  279. foreach (ZipArchiveEntry entry in archive.Entries)
  280. {
  281. Debug.Log("ExtractZipFile==FullName=>2" + entry.FullName);
  282. if (entry.FullName.Contains(".ghb") || !entry.FullName.Contains(".")|| entry.FullName.Contains(".bytes"))
  283. {
  284. isAB = true;
  285. if (entry.Name != "")
  286. {
  287. entry.ExtractToFile(Application.persistentDataPath+"/"+ entry.FullName,true);
  288. FileInfo finfo = new FileInfo(Application.persistentDataPath + "/" + entry.FullName);
  289. byte[] bytes= readbytes(finfo.OpenRead());
  290. if (!entry.FullName.Contains(".bytes"))
  291. {
  292. ghbbytes = bytes;
  293. }
  294. else
  295. {
  296. csbytes = bytes;
  297. }
  298. }
  299. }
  300. }
  301. if(isAB)
  302. {
  303. Debug.Log("ExtractZipFile===>3");
  304. if (csbytes != null)
  305. {
  306. Debug.Log("ExtractZipFile===>4");
  307. Assembly.Load(csbytes);
  308. }
  309. if (ghbbytes!=null)
  310. {
  311. Debug.Log("ExtractZipFile===>5");
  312. AssetBundle ab = AssetBundle.LoadFromMemory(ghbbytes);
  313. var prefab = ab.LoadAsset<GameObject>(ab.LoadAllAssets<GameObject>()[0].name);
  314. m_ModelObj = Instantiate(prefab, transform);
  315. ab.Unload(false);
  316. ManipulationHandler manipulation = gameObject.AddComponent<ManipulationHandler>();
  317. manipulation.enabled = false;
  318. BoundingBox boundingBox = gameObject.AddComponent<BoundingBox>();
  319. boundingBox.enabled = false;
  320. }
  321. }
  322. return isAB;
  323. }
  324. }
  325. public byte[] readbytes(Stream stream)
  326. {
  327. using (Stream fs = stream)
  328. {
  329. byte[] bytes = new byte[fs.Length];
  330. fs.Read(bytes, 0, bytes.Length);
  331. fs.Close();
  332. return bytes;
  333. }
  334. }
  335. public void TriLibModel()
  336. {
  337. Debug.Log("模型加载完成TriLibModel" + Data.localLoadPath);
  338. if (false)//ExtractZipFile(Data.localLoadPath)
  339. {
  340. }
  341. else
  342. {
  343. Debug.Log("模型加载完成TriLibModel" + Data.localLoadPath);
  344. TriLibModelLoad.Load(Data.localLoadPath, (AssetLoaderContext ac) => {
  345. Debug.Log("模型加载完成");
  346. }, (AssetLoaderContext ac) => {
  347. Debug.Log("载材质加完成");
  348. Bounds bounds = GetAllBounds.GetRendererBounds(ac.RootGameObject);
  349. GameObject obj = new GameObject("Test");
  350. obj.transform.position = bounds.center;
  351. obj.transform.SetParent(ac.RootGameObject.transform);
  352. float bizhi = 0.4f / bounds.size.x;
  353. ac.RootGameObject.transform.localScale = Vector3.one * bizhi;
  354. ac.RootGameObject.transform.SetParent(this.transform);
  355. ac.RootGameObject.transform.localPosition = Vector3.zero - obj.transform.position ;
  356. ac.RootGameObject.SetActive(true);
  357. // ac.RootGameObject.transform.position = Camera.main.transform.forward;
  358. m_ModelObj = Instantiate(ac.RootGameObject, transform);
  359. ManipulationHandler manipulation = gameObject.AddComponent<ManipulationHandler>();
  360. manipulation.enabled = false;
  361. BoundingBox boundingBox = gameObject.AddComponent<BoundingBox>();
  362. boundingBox.enabled = false;
  363. ac.RootGameObject.SetActive(false);
  364. if (m_ModelObj && m_ModelObj.GetComponent<Animation>())
  365. {
  366. Debug.Log("Animation===>1" + m_ModelObj.name);
  367. Animation _animation = m_ModelObj.GetComponent<Animation>();
  368. List<AnimationClip> _animations = _animation.GetAllAnimationClips();
  369. m_ModelObj.GetComponent<Animation>().Play(_animations[0].name, PlayMode.StopAll);
  370. }
  371. }, (AssetLoaderContext ac, float f) => {
  372. Debug.Log("加载中==》" + f);
  373. }, (IContextualizedError error) => {
  374. Debug.Log("加载失败" + error);
  375. });
  376. }
  377. }
  378. public override void HideCollider()
  379. {
  380. base.HideCollider();
  381. }
  382. }