StoryMgr.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. using LuaInterface;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using UnityEngine.Playables;
  7. using UnityEngine.UI;
  8. public enum StoryCMType
  9. {
  10. Model,
  11. Left,
  12. Right,
  13. }
  14. public class SimpleStoryModule
  15. {
  16. public List<IPlayableAssetDeal> storyPAs;
  17. public int endTime;
  18. public Action<SimpleStoryModule> OverEvent;
  19. public bool isOver;
  20. }
  21. public delegate void OnCurTimelineOver();
  22. public class StoryMgr : SingletonMono<StoryMgr>
  23. {
  24. private Camera LeftCM;
  25. private Camera RightCM;
  26. private Camera VideoCM;
  27. private TimelineMap curTLMap;
  28. private GameObject UIRoot;
  29. private GameObject LeftRTGo;
  30. private GameObject RightRTGo;
  31. private Text talkText;
  32. private Toggle toggleBtn;
  33. public string ModelLayerName = "Model";
  34. public string StoryLayerName = "Story";
  35. public string DefaultLayerName = "Default";
  36. private const string dlgCfgName = "DigContentCfg";
  37. private const string storyCfgName = "StoryCfg";
  38. bool autoDialogue = true;
  39. public bool AutoDialogue
  40. {
  41. set { autoDialogue = value; }
  42. get { return autoDialogue; }
  43. }
  44. bool isPause = false;
  45. public bool IsPause
  46. {
  47. set { isPause = value; }
  48. get { return isPause; }
  49. }
  50. int curTime;
  51. List<SimpleStoryModule> storyList;
  52. private GameObject storyRoot;
  53. public GameObject StoryRoot
  54. {
  55. get { return storyRoot; }
  56. }
  57. int rtWidth = 512;
  58. int rtHeight = 512;
  59. RenderTextureDescriptor rtDesc;
  60. private GameObject storyCMRoot;
  61. private GameObject modelCMGo;
  62. private Camera modelCM;
  63. private RawImage modelRI;
  64. private RenderTexture modelRT;
  65. private GameObject leftCMGo;
  66. private Camera leftCM;
  67. private RawImage leftRI;
  68. private RenderTexture leftRT;
  69. private GameObject rightCMGo;
  70. private Camera rightCM;
  71. private RenderTexture rightRT;
  72. private RawImage rightRI;
  73. [NoToLua]
  74. public override void InitMgr()
  75. {
  76. storyCMRoot = GameObject.Find("StoryCemara");
  77. if (storyCMRoot == null)
  78. {
  79. storyCMRoot = new GameObject("StoryCemara");
  80. InitStoryCMRoot();
  81. }
  82. else
  83. {
  84. modelCMGo = storyCMRoot.transform.Find("ModelCMGo").gameObject;
  85. modelCM = modelCMGo.GetComponent<Camera>();
  86. leftCMGo = storyCMRoot.transform.Find("LeftCMGo").gameObject;
  87. leftCM = leftCMGo.GetComponent<Camera>();
  88. rightCMGo = storyCMRoot.transform.Find("RightCMGo").gameObject;
  89. rightCM = rightCMGo.GetComponent<Camera>();
  90. }
  91. DontDestroyOnLoad(storyCMRoot);
  92. modelCMGo.SetActive(false);
  93. leftCMGo.SetActive(false);
  94. rightCMGo.SetActive(false);
  95. storyList = new List<SimpleStoryModule>();
  96. rtDesc = new RenderTextureDescriptor(rtWidth, rtHeight, RenderTextureFormat.ARGB32, 16);
  97. }
  98. [NoToLua]
  99. public void InitStoryUIRoot()
  100. {
  101. if (storyRoot == null)
  102. {
  103. storyRoot = UIMgr.Instance.UIRootTrans.Find("StoryUIRoot").gameObject;
  104. LeftRTGo = storyRoot.transform.Find("Root/LeftRT").gameObject;
  105. RightRTGo = storyRoot.transform.Find("Root/RightRT").gameObject;
  106. talkText = storyRoot.transform.Find("DialogBg/Text").GetComponent<Text>();
  107. toggleBtn = storyRoot.transform.Find("Toggle").GetComponent<Toggle>();
  108. leftRI = LeftRTGo.GetComponent<RawImage>();
  109. rightRI = RightRTGo.GetComponent<RawImage>();
  110. }
  111. storyRoot.SetActive(false);
  112. }
  113. [NoToLua]
  114. void InitStoryCMRoot()
  115. {
  116. modelCMGo = new GameObject("ModelCMGo");
  117. modelCMGo.transform.SetParent(storyCMRoot.transform);
  118. modelCM = modelCMGo.AddComponent<Camera>();
  119. modelCM.orthographic = true;
  120. modelCM.orthographicSize = 2f;
  121. modelCM.clearFlags = CameraClearFlags.SolidColor;
  122. modelCM.cullingMask = LayerMask.GetMask(ModelLayerName);
  123. leftCMGo = new GameObject("LeftCMGo");
  124. leftCMGo.transform.SetParent(storyCMRoot.transform);
  125. leftCM = leftCMGo.AddComponent<Camera>();
  126. leftCM.orthographic = true;
  127. leftCM.orthographicSize = 1.5f;
  128. leftCM.clearFlags = CameraClearFlags.SolidColor;
  129. leftCM.cullingMask = LayerMask.GetMask(StoryLayerName);
  130. rightCMGo = new GameObject("RightCMGo");
  131. rightCMGo.transform.SetParent(storyCMRoot.transform);
  132. rightCM = rightCMGo.AddComponent<Camera>();
  133. rightCM.orthographic = true;
  134. rightCM.orthographicSize = 1.5f;
  135. rightCM.clearFlags = CameraClearFlags.SolidColor;
  136. rightCM.cullingMask = LayerMask.GetMask(StoryLayerName);
  137. }
  138. public void SetModelRawImage(RawImage ri)
  139. {
  140. modelRI = ri;
  141. }
  142. [NoToLua]
  143. public void ResetSrotyCM(Transform target, RawImage ri, GameObject CMGo, Camera CM, RenderTexture rt, string layerName, StoryCMType type)
  144. {
  145. if (!CMGo.activeSelf)
  146. return;
  147. CMGo.SetActive(false);
  148. ChangeLayer(target, layerName);
  149. RenderTexture.ReleaseTemporary(rt);
  150. ri.texture = null;
  151. CM.targetTexture = null;
  152. CMGo.transform.position = Vector3.zero;
  153. if (type == StoryCMType.Left)
  154. {
  155. LeftRTGo.SetActive(false);
  156. }
  157. else if (type == StoryCMType.Right)
  158. {
  159. RightRTGo.SetActive(false);
  160. }
  161. }
  162. public void ResetSrotyCM(Transform target, StoryCMType type, string layerName)
  163. {
  164. switch (type)
  165. {
  166. case StoryCMType.Model:
  167. ResetSrotyCM(target, modelRI, modelCMGo, modelCM, modelRT, layerName, type);
  168. modelRI = null;
  169. break;
  170. case StoryCMType.Left:
  171. ResetSrotyCM(target, leftRI, leftCMGo, leftCM, leftRT, layerName, type);
  172. break;
  173. case StoryCMType.Right:
  174. ResetSrotyCM(target, rightRI, rightCMGo, rightCM, rightRT, layerName, type);
  175. break;
  176. default:
  177. break;
  178. }
  179. }
  180. [NoToLua]
  181. public void DisplaySrotyCM(RawImage ri, Transform target, GameObject CMGo, Camera CM, RenderTexture rt, string layerName, StoryCMType type)
  182. {
  183. if (type != StoryCMType.Model)
  184. {
  185. if (CMGo.activeSelf)
  186. return;
  187. }
  188. if (rt == null)
  189. rt = RenderTexture.GetTemporary(rtDesc);
  190. ChangeLayer(target, layerName);
  191. target.rotation = Quaternion.Euler(0, 0, 0);
  192. CMGo.SetActive(true);
  193. ri.texture = rt;
  194. CM.targetTexture = rt;
  195. Transform LookPoint = target.Find("look_point");
  196. if (LookPoint == null)
  197. {
  198. LookPoint = new GameObject("look_point").transform;
  199. LookPoint.SetParent(target);
  200. LookPoint.localPosition = new Vector3(0,1f,2.5f);
  201. LookPoint.rotation = Quaternion.Euler(0, 180, 0);
  202. }
  203. CMGo.transform.position = LookPoint.position;
  204. CMGo.transform.rotation = LookPoint.rotation;
  205. if (type == StoryCMType.Left)
  206. {
  207. LeftRTGo.SetActive(true);
  208. }
  209. else if(type == StoryCMType.Right)
  210. {
  211. RightRTGo.SetActive(true);
  212. }
  213. }
  214. public void DisplaySrotyCM(Transform target, StoryCMType type)
  215. {
  216. switch (type)
  217. {
  218. case StoryCMType.Model:
  219. DisplaySrotyCM(modelRI, target, modelCMGo, modelCM, modelRT, ModelLayerName, type);
  220. break;
  221. case StoryCMType.Left:
  222. DisplaySrotyCM(leftRI, target, leftCMGo, leftCM, leftRT, StoryLayerName, type);
  223. break;
  224. case StoryCMType.Right:
  225. DisplaySrotyCM(rightRI, target, rightCMGo, rightCM, rightRT, StoryLayerName, type);
  226. break;
  227. default:
  228. break;
  229. }
  230. }
  231. [NoToLua]
  232. public void StartStory(int id)
  233. {
  234. InitStoryUIRoot();
  235. if (storyRoot == null)
  236. {
  237. DebugHelper.LogError("StoryRoot isnt exist,please check!!!");
  238. return;
  239. }
  240. Dictionary<string, string> data = ConfigMgr.Instance.getLine(id, storyCfgName);
  241. if (data == null)
  242. {
  243. DebugHelper.LogError(id + " StoryData isnt exist,please check!!!");
  244. return;
  245. }
  246. if (data["type"].CompareTo("0") == 0)
  247. {
  248. //simple story
  249. PlaySimpleStory(data);
  250. }
  251. else
  252. {
  253. PlayComplexStory();
  254. }
  255. storyRoot.SetActive(true);
  256. }
  257. [NoToLua]
  258. public void DialogueEndPauseStatus()
  259. {
  260. if (!autoDialogue)
  261. isPause = true;
  262. }
  263. [NoToLua]
  264. private void Update()
  265. {
  266. if (storyList == null) return;
  267. if (storyList.Count == 0)
  268. return;
  269. if (isPause && !autoDialogue)
  270. {
  271. if (Input.GetMouseButtonUp(0))
  272. {
  273. isPause = false;
  274. }
  275. return;
  276. }
  277. curTime += 1;
  278. SimpleStoryModule curStory = storyList[0];
  279. if (curStory.isOver) return;
  280. for (int i = 0; i < curStory.storyPAs.Count;++i)
  281. {
  282. if (isPause && !autoDialogue)
  283. {
  284. return;
  285. }
  286. curStory.storyPAs[i].DealWithSimpleMode(curTime);
  287. }
  288. if (curTime >= curStory.endTime)
  289. {
  290. curStory.OverEvent(curStory);
  291. }
  292. }
  293. [NoToLua]
  294. void SimpleStoryOver(SimpleStoryModule module)
  295. {
  296. Debug.Log("sstory over");
  297. module.isOver = true;
  298. storyList.Remove(module);
  299. curTime = 0;
  300. if (storyList.Count == 0)
  301. {
  302. //total story is Over
  303. storyRoot.SetActive(false);
  304. }
  305. }
  306. [NoToLua]
  307. IPlayableAssetDeal AssembleActivitionPA(Dictionary<string, string> data)
  308. {
  309. ScriptPlayableAssetActivation scriptPlayableAssetActivation = new ScriptPlayableAssetActivation();
  310. scriptPlayableAssetActivation.masterId = (int)Double.Parse(data["npcId"]);
  311. scriptPlayableAssetActivation.location = (StoryLocation)(int)Double.Parse(data["slot"]);
  312. scriptPlayableAssetActivation.startTime = (int)Double.Parse(data["startTime"]);
  313. scriptPlayableAssetActivation.endTime = (int)Double.Parse(data["endTime"]);
  314. scriptPlayableAssetActivation.mgr = this;
  315. scriptPlayableAssetActivation.master = scriptPlayableAssetActivation.masterId > 0 ? ActorMgr.Instance.GetPreviewActorById(1, scriptPlayableAssetActivation.masterId) : ActorMgr.Instance.GetPreviewActorById(0, scriptPlayableAssetActivation.masterId);
  316. return scriptPlayableAssetActivation;
  317. }
  318. [NoToLua]
  319. IPlayableAssetDeal AssembleAnimationPA(Dictionary<string, string> data)
  320. {
  321. ScriptPlayableAssetAnimation scriptPlayableAssetAnimation = new ScriptPlayableAssetAnimation();
  322. scriptPlayableAssetAnimation.masterId = (int)Double.Parse(data["npcId"]);
  323. scriptPlayableAssetAnimation.location = (StoryLocation)(int)Double.Parse(data["slot"]);
  324. scriptPlayableAssetAnimation.animationName = data["aniName"].ToString();
  325. scriptPlayableAssetAnimation.startTime = (int)Double.Parse(data["startTime"]);
  326. scriptPlayableAssetAnimation.endTime = (int)Double.Parse(data["endTime"]);
  327. scriptPlayableAssetAnimation.mgr = this;
  328. GameObject master = scriptPlayableAssetAnimation.masterId > 0 ? ActorMgr.Instance.GetPreviewActorById(1, scriptPlayableAssetAnimation.masterId) : ActorMgr.Instance.GetPreviewActorById(0, scriptPlayableAssetAnimation.masterId);
  329. if (master != null)
  330. {
  331. scriptPlayableAssetAnimation.animator = master.GetComponent<Animator>();
  332. }
  333. return scriptPlayableAssetAnimation;
  334. }
  335. [NoToLua]
  336. IPlayableAssetDeal AssembleAudioPA(Dictionary<string, string> data)
  337. {
  338. ScriptPlayableAssetAudio scriptPlayableAssetAudio = new ScriptPlayableAssetAudio();
  339. scriptPlayableAssetAudio.audioName = data["audioName"].ToString();
  340. scriptPlayableAssetAudio.audioPath = data["audioPath"].ToString();
  341. scriptPlayableAssetAudio.startTime = (int)Double.Parse(data["startTime"]);
  342. scriptPlayableAssetAudio.endTime = (int)Double.Parse(data["endTime"]);
  343. scriptPlayableAssetAudio.mgr = this;
  344. return scriptPlayableAssetAudio;
  345. }
  346. [NoToLua]
  347. IPlayableAssetDeal AssembleStoryDialoguePA(Dictionary<string, string> data)
  348. {
  349. ScriptPlayableAssetStoryDialogue scriptPlayableAssetStory = new ScriptPlayableAssetStoryDialogue();
  350. scriptPlayableAssetStory.dlgId = (int)Double.Parse(data["dlgId"]);
  351. scriptPlayableAssetStory.startTime = (int)Double.Parse(data["startTime"]);
  352. scriptPlayableAssetStory.endTime = (int)Double.Parse(data["endTime"]);
  353. scriptPlayableAssetStory.mgr = this;
  354. scriptPlayableAssetStory.toggleBtn = toggleBtn;
  355. scriptPlayableAssetStory.talkText = talkText;
  356. return scriptPlayableAssetStory;
  357. }
  358. [NoToLua]
  359. public void ResetDialogueText()
  360. {
  361. talkText.text = "";
  362. }
  363. [NoToLua]
  364. public void PlayDialogueText(int dlgId)
  365. {
  366. talkText.text = ConfigMgr.Instance.getValue(dlgId, "content", dlgCfgName);
  367. }
  368. [NoToLua]
  369. IPlayableAssetDeal AssembleStoryPlayableAsset(int id, out int endTime)
  370. {
  371. Dictionary<string, string> data = ConfigMgr.Instance.getLine(id, "SStoryContentCfg");
  372. endTime = (int)Double.Parse(data["endTime"]);
  373. int aniType = (int)Double.Parse(data["aniType"]);
  374. IPlayableAssetDeal pa = null;
  375. switch(aniType)
  376. {
  377. case 0:
  378. //显示
  379. pa = AssembleActivitionPA(data);
  380. break;
  381. case 1:
  382. //动画
  383. pa = AssembleAnimationPA(data);
  384. break;
  385. case 2:
  386. //音效
  387. pa = AssembleAudioPA(data);
  388. break;
  389. case 3:
  390. //对话
  391. pa = AssembleStoryDialoguePA(data);
  392. break;
  393. default:
  394. break;
  395. }
  396. return pa;
  397. }
  398. [NoToLua]
  399. void PlaySimpleStory(Dictionary<string, string> data)
  400. {
  401. SimpleStoryModule sStoryModule = new SimpleStoryModule();
  402. sStoryModule.storyPAs = new List<IPlayableAssetDeal>();
  403. sStoryModule.endTime = 0;
  404. int endTime = 0;
  405. string[] storyIds = data["storyId"].Split(';');
  406. foreach (var id in storyIds)
  407. {
  408. IPlayableAssetDeal pa = AssembleStoryPlayableAsset((int)Double.Parse(id), out endTime); ;
  409. if (pa != null)
  410. {
  411. sStoryModule.storyPAs.Add(pa);
  412. }
  413. if (endTime > sStoryModule.endTime)
  414. {
  415. sStoryModule.endTime = endTime;
  416. }
  417. }
  418. sStoryModule.OverEvent = SimpleStoryOver;
  419. storyList.Add(sStoryModule);
  420. }
  421. [NoToLua]
  422. void PlayComplexStory()
  423. {
  424. TimelineManager.Instance.AddTimeline(curTLMap.asset);
  425. TimelineManager.Instance.MPlayableDirector.extrapolationMode = UnityEngine.Playables.DirectorWrapMode.Hold;
  426. foreach (var binding in curTLMap.bindingDic)
  427. {
  428. InitTLBindings(binding);
  429. }
  430. foreach (var track in curTLMap.clipDic)
  431. {
  432. InitTLClips(track);
  433. }
  434. TimelineManager.Instance.Play();
  435. }
  436. [NoToLua]
  437. void InitTLBindings(PlayableBindingDic binding)
  438. {
  439. if (binding.typeName.CompareTo("UnityEngine.GameObject") == 0)
  440. {
  441. GameObject obj = null;
  442. if (binding.objInfo.CompareTo("LeftRT") == 0)
  443. {
  444. obj = LeftRTGo;
  445. }
  446. else if (binding.objInfo.CompareTo("RightRT") == 0)
  447. {
  448. obj = RightRTGo;
  449. }
  450. else
  451. {
  452. /*obj = ModelMgr.Instance.GetModelByName(binding.objInfo);
  453. if (obj == null)
  454. {
  455. Debug.Log(binding.objInfo + " isnt exist in scene");
  456. return;
  457. }*/
  458. }
  459. TimelineManager.Instance.SetBinding(binding.trackName, obj);
  460. }
  461. else if (binding.typeName.CompareTo("UnityEngine.Animator") == 0)
  462. {
  463. /*GameObject obj = ModelMgr.Instance.GetModelByName(binding.objInfo);
  464. if (obj == null)
  465. {
  466. Debug.Log(binding.objInfo + " isnt exist in scene");
  467. return;
  468. }
  469. Animator animator = obj.GetComponent<Animator>();
  470. TimelineManager.Instance.SetBinding(binding.trackName, animator);*/
  471. }
  472. }
  473. [NoToLua]
  474. void InitTLClips(PlayableClipDic track)
  475. {
  476. for (int i = 0; i < track.clipNames.Count; ++i)
  477. {
  478. if (track.clipNames[i].CompareTo("ScriptPlayableAssetStoryDialogue") == 0)
  479. {
  480. var asset = TimelineManager.Instance.GetClip<ScriptPlayableAssetStoryDialogue>(track.trackName, track.clipNames[i]);
  481. asset.talkText = talkText;
  482. asset.toggleBtn = toggleBtn;
  483. asset.mgr = this;
  484. }
  485. }
  486. }
  487. [NoToLua]
  488. public void SetStoryCMAndRT(int actorId, StoryLocation location)
  489. {
  490. /*GameObject obj = ModelMgr.Instance.GetModelById(actorId);
  491. if (obj == null)
  492. {
  493. Debug.Log(actorId + " isnt exist in scene");
  494. return;
  495. }
  496. ChangeLayer(obj.transform, StoryLayerName);
  497. Transform point = obj.transform.Find("story_point");
  498. if (location == StoryLocation.Left)
  499. {
  500. LeftCM.transform.position = point.position;
  501. LeftCM.transform.rotation = point.rotation;
  502. }
  503. else
  504. {
  505. RightCM.transform.position = point.position;
  506. RightCM.transform.rotation = point.rotation;
  507. }*/
  508. }
  509. [NoToLua]
  510. public void BindParticle2Place(ParticleSystem particle, int actorId, string pointName, ParticleTLType location)
  511. {
  512. Transform point = null;
  513. if (location == ParticleTLType.NpcBody)
  514. {
  515. /*GameObject obj = ModelMgr.Instance.GetModelById(actorId);
  516. if (obj == null)
  517. {
  518. Debug.Log(actorId + " isnt exist in scene");
  519. return;
  520. }
  521. point = obj.transform.Find(pointName);
  522. if (point == null)
  523. {
  524. Debug.Log(actorId + " there is no point named " + pointName);
  525. return;
  526. }
  527. particle.transform.SetParent(point);
  528. particle.transform.localPosition = Vector3.zero;*/
  529. }
  530. else
  531. {
  532. /*Transform obj = ModelMgr.Instance.actorRoot.transform.Find(pointName);
  533. if (obj == null)
  534. {
  535. Debug.Log(pointName + " isnt exist in scene");
  536. return;
  537. }
  538. particle.transform.SetParent(point);
  539. particle.transform.localPosition = Vector3.zero;*/
  540. }
  541. }
  542. [NoToLua]
  543. public void ChangeLayer(Transform trans, string targetLayer)
  544. {
  545. if (LayerMask.NameToLayer(targetLayer) == -1)
  546. {
  547. Debug.Log("Layer中不存在,请手动添加LayerName");
  548. return;
  549. }
  550.         //遍历更改所有子物体layer
  551.         trans.gameObject.layer = LayerMask.NameToLayer(targetLayer);
  552. foreach (Transform child in trans)
  553. {
  554. ChangeLayer(child, targetLayer);
  555. }
  556. }
  557. }