ModelList.cs 16 KB

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