ModelList.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. using SC.XR.Unity.Module_InputSystem;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using UnityEngine;
  6. using XRTool.Util;
  7. public class ModelList: System.ICloneable
  8. {
  9. public int id { get; set; }
  10. public bool select { get; set; }
  11. public string name { get; set; }
  12. public int type { get; set; }
  13. public string describe { get; set; }
  14. public List<ModelItem> materialList { get; set; }
  15. public int updateTime { get; set; }
  16. public string typesetting { get; set; }
  17. public bool autoplay { get; set; }
  18. public ObjectTransform objectTransform { get; set; }
  19. public Transform materalLibrary;
  20. public SpotsItem spotsItem;
  21. private GameObject _model;
  22. //组合模型数据
  23. public GameObject Model
  24. {
  25. get
  26. {
  27. if (_model == null)
  28. {
  29. init(false);
  30. }
  31. return _model;
  32. }
  33. }
  34. public void init(bool isAdd)
  35. {
  36. if (_model==null)
  37. {
  38. _model = new GameObject(name);
  39. _model.transform.parent = materalLibrary;
  40. InitObjectTransform();
  41. initModelObj();
  42. }
  43. if (!isAdd&& spotsItem!=null)
  44. {
  45. //_model = new GameObject("进入场景----" + name);
  46. _model.transform.parent = spotsItem.SpotsObj.transform;
  47. //InitObjectTransform();
  48. initModelObj();
  49. }
  50. _model.SetActive(isAdd);
  51. //for (int i = 0; i < materialList.Count; i++)
  52. //{
  53. // materialList[i].init();
  54. //}
  55. if (isAdd)
  56. {
  57. for (int i = 0; i < materialList.Count; i++)
  58. {
  59. materialList[i].init();
  60. }
  61. _model.transform.parent = spotsItem.SpotsObj.transform;
  62. if (getInfoPos() != Vector3.zero)
  63. {
  64. _model.transform.localPosition = getInfoPos();
  65. }
  66. if (getInfoEul() != Vector3.zero)
  67. {
  68. _model.transform.localEulerAngles = getInfoPos();
  69. }
  70. }
  71. }
  72. //public void Init()
  73. //{
  74. // _model = new GameObject(name);
  75. // gameObject.SetActive(false);
  76. // InitObjectTransform();
  77. // _model.transform.parent = materalLibrary;
  78. // _model.transform.localPosition = getInfoPos();
  79. // _model.transform.localEulerAngles = getInfoEul();
  80. //}
  81. Vector3 getInfoPos()
  82. {
  83. if(objectTransform==null)
  84. {
  85. return Vector3.zero;
  86. }
  87. //return Vector3.zero;
  88. if (objectTransform.nowPos == Vector3.zero)
  89. return objectTransform.startPos;
  90. else
  91. return objectTransform.nowPos;
  92. }
  93. Vector3 getInfoEul()
  94. {
  95. if (objectTransform == null)
  96. {
  97. return Vector3.zero;
  98. }
  99. if (objectTransform.nowRot == Vector3.zero)
  100. return objectTransform.startRot;
  101. else
  102. return objectTransform.nowRot;
  103. // return Vector3.zero;
  104. }
  105. Vector3 getInfoScale()
  106. {
  107. if (objectTransform.nowScale == Vector3.zero)
  108. return objectTransform.startScale;
  109. else
  110. return objectTransform.nowScale;
  111. }
  112. private void InitObjectTransform()
  113. {
  114. if(objectTransform==null)
  115. {
  116. objectTransform = new ObjectTransform();
  117. objectTransform.startPos = Vector3.zero;
  118. objectTransform.nowPos = Vector3.zero;
  119. objectTransform.startRot = Vector3.zero;
  120. objectTransform.nowRot = Vector3.zero;
  121. objectTransform.startScale = Vector3.one;
  122. objectTransform.nowScale = Vector3.zero;
  123. }
  124. // 处理组合素材
  125. switch (type)
  126. {
  127. case (int)MaterialType.None:
  128. break;
  129. case (int)MaterialType.Image:
  130. case (int)MaterialType.Video:
  131. case (int)MaterialType.Model:
  132. case (int)MaterialType.Text:
  133. case (int)MaterialType.LocaImage:
  134. GameManager.Instance.StartCoroutine( CreateSuCaiObj(this, Model));
  135. break;
  136. case (int)MaterialType.Image_Video_Text:
  137. GameManager.Instance.StartCoroutine(CreateImage_Video_Text(this, Model));
  138. break;
  139. case (int)MaterialType.Model_Text:
  140. GameManager.Instance.StartCoroutine(CreateModel_Text(this, Model));
  141. break;
  142. default:
  143. break;
  144. }
  145. }
  146. /// <summary>
  147. /// 创建 1图片 2视频 3模型 4文字
  148. /// </summary>
  149. /// <param name="type">素材类型</param>
  150. /// <param name="material">素材数据</param>
  151. /// <param name="spoit">景点</param>
  152. /// <returns></returns>
  153. private IEnumerator CreateSuCaiObj(ModelList material, GameObject spoit)
  154. {
  155. List<ObjectValue> objects = new List<ObjectValue>();
  156. List<ModelItem> objs = material.materialList;
  157. for (int i = 0; i < objs.Count; i++)
  158. {
  159. var mat = objs[i];
  160. GameObject go = null;
  161. switch (mat.type)
  162. {
  163. case (int)MaterialType.None:
  164. break;
  165. case (int)MaterialType.Image:
  166. var pImage = ResMgr.Instance.LoadAsync<GameObject>("Template/Prefab/Image");
  167. yield return pImage;
  168. go = GameObject.Instantiate(pImage.asset as GameObject, spoit.transform);
  169. go.SetActive(true);
  170. go.AddComponent<TemplateImage>();
  171. //var imageitem = go.AddComponent<TemplateImage>();
  172. //imageitem.SetData(mat, material.updateTime);
  173. break;
  174. case (int)MaterialType.Video:
  175. var pVideo = ResMgr.Instance.LoadAsync<GameObject>("Template/Prefab/Video");
  176. yield return pVideo;
  177. go = GameObject.Instantiate(pVideo.asset as GameObject, spoit.transform);
  178. go.SetActive(true);
  179. TemplateVideo video = go.AddComponent<TemplateVideo>();
  180. video.localSavePath = Application.persistentDataPath + "/Material/" + Path.GetFileName(objs[i].DownloadPath);
  181. video.autoplay = material.autoplay;
  182. //var videoitem = go.AddComponent<TemplateVideo>();
  183. //videoitem.SetData(mat, material.updateTime);
  184. break;
  185. case (int)MaterialType.Model:
  186. var pModel = ResMgr.Instance.LoadAsync<GameObject>("Template/Prefab/Model");
  187. yield return pModel;
  188. go = GameObject.Instantiate(pModel.asset as GameObject, spoit.transform);
  189. go.SetActive(true);
  190. go.AddComponent<TemplateModel>();
  191. //var modelitem = go.AddComponent<TemplateModel>();
  192. //modelitem.SetData(mat, (int)Time.deltaTime);
  193. //Debug.Log(modelitem.Data.localSavePath);
  194. break;
  195. case (int)MaterialType.Text:
  196. var pText = ResMgr.Instance.LoadAsync<GameObject>("Template/Prefab/Text");
  197. yield return pText;
  198. go = GameObject.Instantiate(pText.asset as GameObject, spoit.transform);
  199. go.SetActive(true);
  200. go.AddComponent<TemplateText>();
  201. //var textitem = go.AddComponent<TemplateText>();
  202. //textitem.SetData(mat, material.updateTime);
  203. break;
  204. case (int)MaterialType.LocaImage:
  205. var pLocaImage = ResMgr.Instance.LoadAsync<GameObject>("Template/Prefab/Image");
  206. yield return pLocaImage;
  207. go = GameObject.Instantiate(pLocaImage.asset as GameObject, spoit.transform);
  208. go.SetActive(true);
  209. go.AddComponent<TemplateImage>();
  210. //var locaImageitem = go.AddComponent<TemplateImage>();
  211. //locaImageitem.SetLocaImageData(mat);
  212. break;
  213. default:
  214. break;
  215. }
  216. if (go != null)
  217. {
  218. go.name = string.IsNullOrWhiteSpace(mat.name) ? spoit.name + "-" + i.ToString() : mat.name;
  219. mat.name = go.name;
  220. go.AddComponent<EditorEventHandler>().Type = (MaterialType)(mat.type);
  221. if (material.select)
  222. {
  223. go.transform.localPosition = mat.objectTransform.nowPos;
  224. go.transform.localEulerAngles = mat.objectTransform.nowRot;
  225. go.transform.localScale = mat.objectTransform.nowScale;
  226. }
  227. else
  228. {
  229. go.transform.localEulerAngles = Vector3.zero;
  230. go.transform.localScale = new Vector3(1, 1, 1);
  231. if (mat.type != (int)MaterialType.Text)
  232. {
  233. go.transform.localPosition = Vector3.zero;
  234. }
  235. else
  236. {
  237. //Set text position
  238. if (mat.textPosition == "top")
  239. {
  240. go.transform.localPosition = new Vector3(0, 0.3f, 0);
  241. }
  242. else if (mat.textPosition == "bottom")
  243. {
  244. go.transform.localPosition = new Vector3(0, -0.3f, 0);
  245. }
  246. }
  247. mat.objectTransform.SetStartValue(go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale);
  248. }
  249. mat.prefabModel = go;
  250. }
  251. }
  252. }
  253. /// <summary>
  254. /// 创建 6模型+文字
  255. /// </summary>
  256. /// <param name="material"></param>
  257. /// <param name="spoit"></param>
  258. /// <returns></returns>
  259. private IEnumerator CreateModel_Text(ModelList material, GameObject spoit)
  260. {
  261. List<ObjectValue> objects = new List<ObjectValue>();
  262. List<ModelItem> objs = material.materialList;
  263. for (int i = 0; i < objs.Count; i++)
  264. {
  265. var mat = objs[i];
  266. GameObject go = null;
  267. switch (mat.type)
  268. {
  269. case (int)MaterialType.None:
  270. break;
  271. case (int)MaterialType.Model:
  272. var pModel = ResMgr.Instance.LoadAsync<GameObject>("Template/Prefab/Model");
  273. yield return pModel;
  274. go = GameObject.Instantiate(pModel.asset as GameObject, spoit.transform);
  275. go.SetActive(true);
  276. go.AddComponent<TemplateModel>();
  277. //var modelitem = go.AddComponent<TemplateModel>();
  278. //modelitem.SetData(mat, material.updateTime);
  279. break;
  280. case (int)MaterialType.Text:
  281. var pText = ResMgr.Instance.LoadAsync<GameObject>("Template/Prefab/Text");
  282. yield return pText;
  283. go = GameObject.Instantiate(pText.asset as GameObject, spoit.transform);
  284. go.SetActive(true);
  285. go.AddComponent<TemplateText>();
  286. //var textitem = go.AddComponent<TemplateText>();
  287. //textitem.SetData(mat, material.updateTime);
  288. break;
  289. default:
  290. break;
  291. }
  292. if (go != null)
  293. {
  294. go.name = string.IsNullOrWhiteSpace(mat.name) ? spoit.name + "-" + i.ToString() : mat.name;
  295. go.AddComponent<EditorEventHandler>().Type = (MaterialType)(mat.type);
  296. if (material.select)
  297. {
  298. go.transform.localPosition = mat.objectTransform.nowPos;
  299. go.transform.localEulerAngles = mat.objectTransform.nowRot;
  300. go.transform.localScale = mat.objectTransform.nowScale;
  301. }
  302. else
  303. {
  304. go.transform.localEulerAngles = Vector3.zero;
  305. go.transform.localScale = new Vector3(1, 1, 1);
  306. if (mat.type != (int)MaterialType.Text)
  307. {
  308. go.transform.localPosition = Vector3.zero;
  309. }
  310. else
  311. {
  312. //Set text position
  313. if (mat.textPosition == "top")
  314. {
  315. go.transform.localPosition = new Vector3(0, 0.3f, 0);
  316. }
  317. else if (mat.textPosition == "bottom")
  318. {
  319. go.transform.localPosition = new Vector3(0, -0.3f, 0);
  320. }
  321. else if (mat.textPosition == "left")
  322. {
  323. go.transform.localPosition = new Vector3(-0.3f, 0, 0);
  324. }
  325. else if (mat.textPosition == "right")
  326. {
  327. go.transform.localPosition = new Vector3(0.3f, 0f, 0);
  328. }
  329. }
  330. mat.objectTransform.SetStartValue(go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale);
  331. }
  332. ObjectValue objectValue = CreateMatObjectValue(i, material.id, go, mat);
  333. objects.Add(objectValue);
  334. mat.prefabModel = go;
  335. }
  336. }
  337. }
  338. /// <summary>
  339. /// 创建 5图片+文字/视频+文字
  340. /// </summary>
  341. private IEnumerator CreateImage_Video_Text(ModelList material, GameObject spoit)
  342. {
  343. yield return GameManager.Instance.StartCoroutine(SRTitleLayout.CalLayout(material, spoit));
  344. /*
  345. List<ObjectValue> objects = new List<ObjectValue>();
  346. //switch (material.typesetting)
  347. //{
  348. // case "1":
  349. // SRTitleLayout.CalLayout(material, spoit);
  350. // break;
  351. // case "2":
  352. // SRSectorLayout.CalLayout(material, spoit);
  353. // break;
  354. // case "3":
  355. // DRTitleLayout.CalLayout(material, spoit);
  356. // break;
  357. // case "4":
  358. // DRFanLayout.CalLayout(material, spoit);
  359. // break;
  360. // case "5":
  361. // SRTitleLayout.CalLayout(material, spoit);
  362. // break;
  363. // case "自定义":
  364. // break;
  365. // default:
  366. // break;
  367. //}
  368. switch (material.typesetting)
  369. {
  370. case "1":
  371. yield return GameManager.Instance.StartCoroutine(SRTitleLayout.CalLayout(material, spoit));
  372. break;
  373. case "2":
  374. yield return GameManager.Instance.StartCoroutine(SRTitleLayout.CalLayout(material, spoit));
  375. break;
  376. case "3":
  377. yield return GameManager.Instance.StartCoroutine(SRTitleLayout.CalLayout(material, spoit));
  378. break;
  379. case "4":
  380. yield return GameManager.Instance.StartCoroutine(SRSectorLayout.CalLayout(material, spoit));
  381. break;
  382. case "5":
  383. yield return GameManager.Instance.StartCoroutine(DRTitleLayout.CalLayout(material, spoit));
  384. break;
  385. case "6":
  386. yield return GameManager.Instance.StartCoroutine(DRTitleLayout.CalLayout(material, spoit));
  387. break;
  388. case "7":
  389. yield return GameManager.Instance.StartCoroutine(DRTitleLayout.CalLayout(material, spoit));
  390. break;
  391. case "8":
  392. yield return GameManager.Instance.StartCoroutine(DRFanLayout.CalLayout(material, spoit));
  393. break;
  394. default:
  395. break;
  396. }
  397. */
  398. }
  399. /// <summary>
  400. /// 创建物体ObjectValue,并赋值位置信息
  401. /// </summary>
  402. /// <param name="id"></param>
  403. /// <param name="parentid"></param>
  404. /// <param name="go"></param>
  405. /// <param name="mat"></param>
  406. /// <returns></returns>
  407. private ObjectValue CreateMatObjectValue(int id, int parentid, GameObject go, ModelItem mat)
  408. {
  409. go.name = string.IsNullOrWhiteSpace(mat.name) ? go.name : mat.name;
  410. go.AddComponent<EditorEventHandler>().Type = (MaterialType)(mat.type);
  411. //为物体位置信息赋值
  412. if (mat.objectTransform != null)
  413. {
  414. go.transform.localPosition = mat.objectTransform.nowPos;
  415. go.transform.localEulerAngles = mat.objectTransform.nowRot;
  416. go.transform.localScale = mat.objectTransform.nowScale;
  417. }
  418. else
  419. {
  420. go.transform.localPosition = Vector3.zero;
  421. go.transform.localEulerAngles = Vector3.zero;
  422. go.transform.localScale = new Vector3(1, 1, 1);
  423. }
  424. ObjectValue objectValue = new ObjectValue(id, parentid, mat.name, go, go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale);
  425. return objectValue;
  426. }
  427. public object Clone()
  428. {
  429. ModelList clonedObject = (ModelList)this.MemberwiseClone();
  430. return clonedObject;
  431. }
  432. public void initModelObj()
  433. {
  434. if (getInfoPos() != Vector3.zero)
  435. {
  436. _model.transform.localPosition = getInfoPos();
  437. }
  438. if (getInfoEul() != Vector3.zero)
  439. {
  440. _model.transform.localEulerAngles = getInfoPos();
  441. }
  442. // _model.transform.localPosition = getInfoPos();
  443. // _model.transform.localEulerAngles = getInfoEul();
  444. }
  445. }