EffectControlHelper.cs 75 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using DG.Tweening;
  4. using System.Collections.Generic;
  5. using System.Collections;
  6. #if UNITY_EDITOR
  7. using UnityEditor;
  8. [CustomEditor(typeof(EffectControlHelper))]
  9. public class EffectControlHelperEditor : Editor
  10. {
  11. static Keyframe k0 = new Keyframe(0, 0, 1, 1);
  12. static Keyframe k1 = new Keyframe(1, 1, 1, 1);
  13. EffectControlHelper helper;
  14. SerializedProperty tweenProperties;
  15. GUIContent content = new GUIContent();
  16. int gridID = 0;
  17. AnimationCurve copyCurve;
  18. Gradient copyGradient;
  19. private void OnEnable()
  20. {
  21. helper = target as EffectControlHelper;
  22. tweenProperties = serializedObject.FindProperty("tweens");
  23. Undo.undoRedoPerformed += OnUndoRedo;
  24. Resort();
  25. }
  26. private void Resort()
  27. {
  28. int sequenceID = 0;
  29. for (int i = 0; i < tweenProperties.arraySize; i++)
  30. {
  31. var tween = tweenProperties.GetArrayElementAtIndex(i);
  32. SerializedProperty controlType = tween.FindPropertyRelative("controlType");
  33. if ((EffectControlHelper.ControlType)controlType.enumValueIndex ==
  34. EffectControlHelper.ControlType.SequenceTex)
  35. {
  36. tween.FindPropertyRelative("key").intValue = sequenceID++;
  37. }
  38. }
  39. }
  40. void OnUndoRedo()
  41. {
  42. serializedObject.Update();
  43. Repaint();
  44. }
  45. void OnDisable()
  46. {
  47. Undo.undoRedoPerformed -= OnUndoRedo;
  48. }
  49. public override void OnInspectorGUI()
  50. {
  51. serializedObject.Update();
  52. AddTween();
  53. SetProperty("总延迟", serializedObject.FindProperty("delay"));
  54. RepeatSetting();
  55. Resort();
  56. gridID = GUILayout.SelectionGrid(gridID, GetTweenNames(), 2);
  57. if (gridID >= 0 && gridID < helper.tweens.Count)
  58. {
  59. EditorGUILayout.BeginVertical("helpbox");
  60. {
  61. ShowListControl(ref gridID);
  62. if (gridID >= 0 && gridID < helper.tweens.Count)
  63. ShowAndSetTween(gridID);
  64. }
  65. EditorGUILayout.EndVertical();
  66. }
  67. if (GUILayout.Button("测试播放"))
  68. {
  69. if (!Application.isPlaying)
  70. {
  71. EditorApplication.isPlaying = true;
  72. }
  73. else
  74. {
  75. helper.RePlay();
  76. }
  77. }
  78. SampleAnimation();
  79. }
  80. void AddTween()
  81. {
  82. SetField((v) =>
  83. {
  84. tweenProperties.GetArrayElementAtIndex(++tweenProperties.arraySize - 1).FindPropertyRelative("body").objectReferenceValue = v;
  85. InitTween(tweenProperties.arraySize - 1, 0);
  86. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  87. gridID = tweenProperties.arraySize - 1;
  88. }, () => EditorGUILayout.ObjectField("拖入需要控制的变换节点", null, typeof(Transform), true), "Set Controller");
  89. SetField((v) =>
  90. {
  91. tweenProperties.GetArrayElementAtIndex(++tweenProperties.arraySize - 1).FindPropertyRelative("body").objectReferenceValue = v;
  92. InitTween(tweenProperties.arraySize - 1, 3);
  93. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  94. gridID = tweenProperties.arraySize - 1;
  95. }, () => EditorGUILayout.ObjectField("拖入需要控制的材质节点", null, typeof(Renderer), true), "Set Controller");
  96. SetField((v) =>
  97. {
  98. tweenProperties.GetArrayElementAtIndex(++tweenProperties.arraySize - 1).FindPropertyRelative("body").objectReferenceValue = v;
  99. InitTween(tweenProperties.arraySize - 1, 3);
  100. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  101. gridID = tweenProperties.arraySize - 1;
  102. }, () => EditorGUILayout.ObjectField("拖入需要控制的UI网格节点", null, typeof(UIMeshRenderer), true), "Set Controller");
  103. SetField((v) =>
  104. {
  105. tweenProperties.GetArrayElementAtIndex(++tweenProperties.arraySize - 1).FindPropertyRelative("body").objectReferenceValue = v;
  106. InitTween(tweenProperties.arraySize - 1, 3);
  107. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  108. gridID = tweenProperties.arraySize - 1;
  109. }, () => EditorGUILayout.ObjectField("拖入需要控制的图形节点", null, typeof(MaskableGraphic), true), "Set Controller");
  110. SetField((v) =>
  111. {
  112. tweenProperties.GetArrayElementAtIndex(++tweenProperties.arraySize - 1).FindPropertyRelative("body").objectReferenceValue = v;
  113. InitTween(tweenProperties.arraySize - 1, 5);
  114. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  115. gridID = tweenProperties.arraySize - 1;
  116. }, () => EditorGUILayout.ObjectField("拖入需要控制显示的节点", null, typeof(GameObject), true), "Set Controller");
  117. SetField((v) =>
  118. {
  119. tweenProperties.GetArrayElementAtIndex(++tweenProperties.arraySize - 1).FindPropertyRelative("body").objectReferenceValue = v;
  120. InitTween(tweenProperties.arraySize - 1, 8);
  121. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  122. gridID = tweenProperties.arraySize - 1;
  123. }, () => EditorGUILayout.ObjectField("拖入需要控制的投影节点", null, typeof(ProjectorPlane), true), "Set Controller");
  124. }
  125. void RepeatSetting()
  126. {
  127. #region 简易复生
  128. SerializedProperty repeatTimes = serializedObject.FindProperty("repeatTimes");
  129. SetField((v) =>
  130. {
  131. repeatTimes.arraySize = Mathf.Max(0, v);
  132. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  133. }, () => EditorGUILayout.DelayedIntField("简易重复", repeatTimes.arraySize), "Set Count");
  134. if (repeatTimes.arraySize > 0)
  135. {
  136. EditorGUILayout.BeginVertical("helpBox");
  137. {
  138. for (int i = 0; i < repeatTimes.arraySize; i++)
  139. {
  140. SetField((v) =>
  141. {
  142. repeatTimes.GetArrayElementAtIndex(i).floatValue = Mathf.Max(0, v);
  143. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  144. }, () => EditorGUILayout.FloatField(string.Format(" 延迟[{0}]", i), repeatTimes.GetArrayElementAtIndex(i).floatValue), "Set Time");
  145. }
  146. if (repeatTimes.arraySize > 0)
  147. {
  148. SetProperty("依次偏移", serializedObject.FindProperty("offset"));
  149. SetProperty("依次偏转", serializedObject.FindProperty("angleOff"));
  150. SetProperty("依次缩放", serializedObject.FindProperty("scale"));
  151. SetProperty("存在时间", serializedObject.FindProperty("instanceExistTime"));
  152. }
  153. }
  154. EditorGUILayout.EndVertical();
  155. }
  156. #endregion
  157. #region 自定义复生
  158. SerializedProperty avatars = serializedObject.FindProperty("avatars");
  159. SerializedProperty avatar;
  160. SetField((v) =>
  161. {
  162. int oldSize = avatars.arraySize;
  163. avatars.arraySize = Mathf.Max(0, v);
  164. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  165. for (int i = oldSize; i < avatars.arraySize; i++)
  166. {
  167. avatar = avatars.GetArrayElementAtIndex(i);
  168. avatar.FindPropertyRelative("scale").vector3Value = Vector3.one;
  169. avatar.FindPropertyRelative("duration").floatValue = 1;
  170. }
  171. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  172. }, () => EditorGUILayout.DelayedIntField("自定义重复", avatars.arraySize), "Set Count");
  173. for (int i = 0; i < avatars.arraySize; i++)
  174. {
  175. avatar = avatars.GetArrayElementAtIndex(i);
  176. EditorGUILayout.BeginVertical("helpbox");
  177. {
  178. SetProperty("延迟", avatar.FindPropertyRelative("delay"));
  179. SetProperty("位置", avatar.FindPropertyRelative("position"));
  180. SetProperty("角度", avatar.FindPropertyRelative("rotation"));
  181. SetProperty("比例", avatar.FindPropertyRelative("scale"));
  182. SetProperty("存在时间", avatar.FindPropertyRelative("duration"));
  183. }
  184. EditorGUILayout.EndVertical();
  185. }
  186. #endregion
  187. }
  188. void ShowListControl(ref int i)
  189. {
  190. EditorGUILayout.BeginHorizontal();
  191. {
  192. EffectControlHelper.TweenGroup tween = helper.tweens[i];
  193. SetField((v) => tween.body = v, () => EditorGUILayout.ObjectField(tween.body, tween.body.GetType(), true), "Change Body");
  194. if (GUILayout.Button("复制", GUILayout.Width(40)))
  195. {
  196. if (i >= 0)
  197. {
  198. Undo.RecordObject(helper, "Copy");
  199. EffectControlHelper.TweenGroup clone = new EffectControlHelper.TweenGroup(helper.tweens[i]);
  200. helper.tweens.Add(clone);
  201. EditorUtility.SetDirty(helper);
  202. serializedObject.Update();
  203. }
  204. }
  205. if (GUILayout.Button("上移", GUILayout.Width(40)))
  206. {
  207. if (i > 0)
  208. {
  209. Undo.RecordObject(helper, "Move Up");
  210. tweenProperties.MoveArrayElement(i, i - 1);
  211. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  212. EditorUtility.SetDirty(helper);
  213. }
  214. }
  215. if (GUILayout.Button("下移", GUILayout.Width(40)))
  216. {
  217. if (i < tweenProperties.arraySize - 1)
  218. {
  219. Undo.RecordObject(helper, "Move Down");
  220. tweenProperties.MoveArrayElement(i, i + 1);
  221. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  222. EditorUtility.SetDirty(helper);
  223. }
  224. }
  225. if (GUILayout.Button("删除", GUILayout.Width(40)))
  226. {
  227. Undo.RecordObject(helper, "Remove");
  228. tweenProperties.DeleteArrayElementAtIndex(i--);
  229. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  230. EditorUtility.SetDirty(helper);
  231. }
  232. }
  233. EditorGUILayout.EndHorizontal();
  234. }
  235. void ShowAndSetTween(int i)
  236. {
  237. SerializedProperty tween = tweenProperties.GetArrayElementAtIndex(i);
  238. SerializedProperty controlType = tween.FindPropertyRelative("controlType");
  239. SetField((v) =>
  240. {
  241. if (helper.tweens[i].body is Renderer || helper.tweens[i].body is UIMeshRenderer || helper.tweens[i].body is MaskableGraphic)
  242. {
  243. if (v != EffectControlHelper.ControlType.TintColor
  244. && v != EffectControlHelper.ControlType.UV
  245. && v != EffectControlHelper.ControlType.ShaderValue
  246. && v != EffectControlHelper.ControlType.SequenceTex)
  247. v = EffectControlHelper.ControlType.TintColor;
  248. }
  249. else if (helper.tweens[i].body is Transform)
  250. {
  251. if (v != EffectControlHelper.ControlType.Position
  252. && v != EffectControlHelper.ControlType.Rotation
  253. && v != EffectControlHelper.ControlType.Scale)
  254. v = EffectControlHelper.ControlType.Position;
  255. }
  256. else if (helper.tweens[i].body is GameObject)
  257. v = EffectControlHelper.ControlType.Visible;
  258. else if (helper.tweens[i].body is ProjectorPlane)
  259. v = EffectControlHelper.ControlType.ProjectorPlane;
  260. controlType.intValue = (int)v;
  261. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  262. }, () =>
  263. (EffectControlHelper.ControlType)EditorGUILayout.EnumPopup("控制方式", (EffectControlHelper.ControlType)controlType.enumValueIndex), "Set ControlType");
  264. switch ((EffectControlHelper.ControlType)controlType.enumValueIndex)
  265. {
  266. case EffectControlHelper.ControlType.Visible:
  267. {
  268. #region 显示
  269. SetProperty("延迟(不再使用)", tween.FindPropertyRelative("delay"));
  270. SetProperty("可见(不再使用)", tween.FindPropertyRelative("visible"));
  271. SerializedProperty visibles = tween.FindPropertyRelative("visibles");
  272. SetField((v) =>
  273. {
  274. visibles.arraySize = Mathf.Max(0, v);
  275. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  276. }, () => EditorGUILayout.IntField("可视组", visibles.arraySize), "Set Size");
  277. for (int s = 0; s < visibles.arraySize; s++)
  278. {
  279. EditorGUILayout.BeginHorizontal();
  280. {
  281. SerializedProperty visible = visibles.GetArrayElementAtIndex(s);
  282. SetField((v) =>
  283. {
  284. visible.FindPropertyRelative("delay").floatValue = Mathf.Max(0, v);
  285. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  286. }, () => EditorGUILayout.DelayedFloatField("时间", visible.FindPropertyRelative("delay").floatValue), "Set Delay");
  287. SetField((v) =>
  288. {
  289. visible.FindPropertyRelative("visible").boolValue = v;
  290. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  291. }, () => EditorGUILayout.ToggleLeft("可见", visible.FindPropertyRelative("visible").boolValue, GUILayout.Width(60)), "Set Visible");
  292. }
  293. EditorGUILayout.EndHorizontal();
  294. }
  295. #endregion
  296. break;
  297. }
  298. case EffectControlHelper.ControlType.Position:
  299. case EffectControlHelper.ControlType.Rotation:
  300. case EffectControlHelper.ControlType.Scale:
  301. {
  302. #region 变换动画
  303. SetProperty("延迟", tween.FindPropertyRelative("delay"));
  304. SetProperty("持续时间", tween.FindPropertyRelative("duration"));
  305. SetProperty("循环(-1=无限循环)", tween.FindPropertyRelative("loop"));
  306. SetProperty("循环方式", tween.FindPropertyRelative("loopType"));
  307. SerializedProperty vectorCtrl = tween.FindPropertyRelative("vectorCtrl");
  308. SetProperty("开始于", vectorCtrl.FindPropertyRelative("from"));
  309. SetProperty("结束于", vectorCtrl.FindPropertyRelative("to"));
  310. SetProperty("使用绝对旋转方式", tween.FindPropertyRelative("useWorldRot"));
  311. SetProperty("使用缓动代替曲线", tween.FindPropertyRelative("useEase"));
  312. if (tween.FindPropertyRelative("useEase").boolValue)
  313. SetProperty("缓动类型", tween.FindPropertyRelative("ease"));
  314. else
  315. {
  316. SerializedProperty curves = tween.FindPropertyRelative("curves");
  317. if (curves.arraySize < 3)
  318. {
  319. int oldSize = curves.arraySize;
  320. curves.arraySize = 3;
  321. for (int c = oldSize; c < curves.arraySize; c++)
  322. curves.GetArrayElementAtIndex(c).animationCurveValue = new AnimationCurve(k0, k1);
  323. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  324. EditorUtility.SetDirty(helper);
  325. }
  326. SetCurve("X曲线", curves.GetArrayElementAtIndex(0));
  327. SetCurve("Y曲线", curves.GetArrayElementAtIndex(1));
  328. SetCurve("Z曲线", curves.GetArrayElementAtIndex(2));
  329. }
  330. #endregion
  331. break;
  332. }
  333. case EffectControlHelper.ControlType.TintColor:
  334. {
  335. #region 颜色动画
  336. SetProperty("延迟", tween.FindPropertyRelative("delay"));
  337. SetProperty("持续时间", tween.FindPropertyRelative("duration"));
  338. SetProperty("循环(-1=无限循环)", tween.FindPropertyRelative("loop"));
  339. SetProperty("循环方式", tween.FindPropertyRelative("loopType"));
  340. SerializedProperty colorCtrl = tween.FindPropertyRelative("colorCtrl");
  341. if (tween.FindPropertyRelative("body").objectReferenceValue is Renderer)
  342. {
  343. Renderer renderer = tween.FindPropertyRelative("body").objectReferenceValue as Renderer;
  344. SelectProperty("颜色属性名", colorCtrl.FindPropertyRelative("colorName"),
  345. GetShaderProperties(renderer.sharedMaterial, ShaderUtil.ShaderPropertyType.Color));
  346. }
  347. SetGradient("颜色变化", helper.tweens[i].colorCtrl.gradient, colorCtrl.FindPropertyRelative("gradient"));
  348. #endregion
  349. break;
  350. }
  351. case EffectControlHelper.ControlType.UV:
  352. {
  353. #region UV动画
  354. SetProperty("延迟", tween.FindPropertyRelative("delay"));
  355. SetProperty("持续时间", tween.FindPropertyRelative("duration"));
  356. SetProperty("循环(-1=无限循环)", tween.FindPropertyRelative("loop"));
  357. SetProperty("循环方式", tween.FindPropertyRelative("loopType"));
  358. SerializedProperty uvCtrl = tween.FindPropertyRelative("uvCtrl");
  359. if (tween.FindPropertyRelative("body").objectReferenceValue is Renderer)
  360. {
  361. Renderer renderer = tween.FindPropertyRelative("body").objectReferenceValue as Renderer;
  362. if (renderer.sharedMaterial)
  363. SelectProperty("UV属性名", uvCtrl.FindPropertyRelative("propertyName"),
  364. GetShaderProperties(renderer.sharedMaterial, ShaderUtil.ShaderPropertyType.Vector, ShaderUtil.ShaderPropertyType.TexEnv));
  365. }
  366. else if (tween.FindPropertyRelative("body").objectReferenceValue is UIMeshRenderer)
  367. {
  368. UIMeshRenderer renderer = tween.FindPropertyRelative("body").objectReferenceValue as UIMeshRenderer;
  369. if (renderer.material)
  370. SelectProperty("UV属性名", uvCtrl.FindPropertyRelative("propertyName"),
  371. GetShaderProperties(renderer.material, ShaderUtil.ShaderPropertyType.Vector, ShaderUtil.ShaderPropertyType.TexEnv));
  372. }
  373. else if (tween.FindPropertyRelative("body").objectReferenceValue is MaskableGraphic)
  374. {
  375. MaskableGraphic renderer = tween.FindPropertyRelative("body").objectReferenceValue as MaskableGraphic;
  376. if (renderer.material)
  377. SelectProperty("UV属性名", uvCtrl.FindPropertyRelative("propertyName"),
  378. GetShaderProperties(renderer.material, ShaderUtil.ShaderPropertyType.Vector));
  379. }
  380. SerializedProperty uvInfoFrom = uvCtrl.FindPropertyRelative("from");
  381. SerializedProperty uvInfoTo = uvCtrl.FindPropertyRelative("to");
  382. SetField((v) =>
  383. {
  384. uvInfoFrom.vector4Value = new Vector4(v.x, v.y, uvInfoFrom.vector4Value.z, uvInfoFrom.vector4Value.w);
  385. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  386. }, () => EditorGUILayout.Vector2Field("Tiling From", new Vector2(uvInfoFrom.vector4Value.x, uvInfoFrom.vector4Value.y)), "Set UV Tiling");
  387. SetField((v) =>
  388. {
  389. uvInfoTo.vector4Value = new Vector4(v.x, v.y, uvInfoTo.vector4Value.z, uvInfoTo.vector4Value.w);
  390. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  391. }, () => EditorGUILayout.Vector2Field("Tiling To", new Vector2(uvInfoTo.vector4Value.x, uvInfoTo.vector4Value.y)), "Set UV Tiling");
  392. SetField((v) =>
  393. {
  394. uvInfoFrom.vector4Value = new Vector4(uvInfoFrom.vector4Value.x, uvInfoFrom.vector4Value.y, v.x, v.y);
  395. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  396. }, () => EditorGUILayout.Vector2Field("Offset From", new Vector2(uvInfoFrom.vector4Value.z, uvInfoFrom.vector4Value.w)), "Set UV Offset");
  397. SetField((v) =>
  398. {
  399. uvInfoTo.vector4Value = new Vector4(uvInfoTo.vector4Value.x, uvInfoTo.vector4Value.y, v.x, v.y);
  400. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  401. }, () => EditorGUILayout.Vector2Field("Offset To", new Vector2(uvInfoTo.vector4Value.z, uvInfoTo.vector4Value.w)), "Set UV Offset");
  402. SetProperty("使用缓动代替曲线", tween.FindPropertyRelative("useEase"));
  403. if (tween.FindPropertyRelative("useEase").boolValue)
  404. SetProperty("缓动类型", tween.FindPropertyRelative("ease"));
  405. else
  406. {
  407. SerializedProperty curves = tween.FindPropertyRelative("curves");
  408. if (curves.arraySize < 4)
  409. {
  410. int oldSize = curves.arraySize;
  411. curves.arraySize = 4;
  412. for (int c = oldSize; c < curves.arraySize; c++)
  413. curves.GetArrayElementAtIndex(c).animationCurveValue = new AnimationCurve(k0, k1);
  414. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  415. EditorUtility.SetDirty(helper);
  416. }
  417. SetCurve("U Tiling Curve", curves.GetArrayElementAtIndex(0));
  418. SetCurve("V Tiling Curve", curves.GetArrayElementAtIndex(1));
  419. SetCurve("U Offset Curve", curves.GetArrayElementAtIndex(2));
  420. SetCurve("V Offset Curve", curves.GetArrayElementAtIndex(3));
  421. }
  422. #endregion
  423. break;
  424. }
  425. case EffectControlHelper.ControlType.SequenceTex:
  426. {
  427. #region 序列动画
  428. SetProperty("延迟", tween.FindPropertyRelative("delay"));
  429. SetProperty("持续时间", tween.FindPropertyRelative("duration"));
  430. SetProperty("循环(-1=无限循环)", tween.FindPropertyRelative("loop"));
  431. SetProperty("key值(不可有重复,从0开始的整数)", tween.FindPropertyRelative("key"));
  432. SerializedProperty uvCtrl = tween.FindPropertyRelative("uvCtrl");
  433. if (tween.FindPropertyRelative("body").objectReferenceValue is Renderer)
  434. {
  435. Renderer renderer = tween.FindPropertyRelative("body").objectReferenceValue as Renderer;
  436. if (renderer.sharedMaterial)
  437. SelectProperty("序列纹理属性名", uvCtrl.FindPropertyRelative("propertyName"),
  438. GetShaderProperties(renderer.sharedMaterial, ShaderUtil.ShaderPropertyType.TexEnv));
  439. }
  440. else if (tween.FindPropertyRelative("body").objectReferenceValue is UIMeshRenderer)
  441. {
  442. UIMeshRenderer renderer = tween.FindPropertyRelative("body").objectReferenceValue as UIMeshRenderer;
  443. if (renderer.material)
  444. SelectProperty("序列纹理UV", uvCtrl.FindPropertyRelative("propertyName"),
  445. GetShaderProperties(renderer.material, ShaderUtil.ShaderPropertyType.Vector));
  446. }
  447. else if (tween.FindPropertyRelative("body").objectReferenceValue is MaskableGraphic)
  448. {
  449. MaskableGraphic renderer = tween.FindPropertyRelative("body").objectReferenceValue as MaskableGraphic;
  450. if (renderer.material)
  451. SelectProperty("序列纹理UV", uvCtrl.FindPropertyRelative("propertyName"),
  452. GetShaderProperties(renderer.material, ShaderUtil.ShaderPropertyType.Vector));
  453. }
  454. SerializedProperty uvInfoFrom = uvCtrl.FindPropertyRelative("from");
  455. SerializedProperty uvInfoTo = uvCtrl.FindPropertyRelative("to");
  456. //X,Y = 列数,行数
  457. SetField((v) =>
  458. {
  459. v.x = v.x == 0 ? v.x = 1 : v.x;
  460. v.y = v.y == 0 ? v.y = 1 : v.y;
  461. uvInfoFrom.vector4Value = new Vector4(1 / v.x, 1 / v.y, 0, 1 - 1 / v.y);
  462. uvInfoTo.vector4Value = new Vector4(1 / v.x, 1 / v.y, 1 - 1 / v.x, 0);
  463. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  464. }, () =>
  465. {
  466. int xCount = (int)(1 / uvInfoFrom.vector4Value.x + 0.5f);
  467. int yCount = (int)(1 / uvInfoFrom.vector4Value.y + 0.5f);
  468. return EditorGUILayout.Vector2Field("U Count | V Count", new Vector2(xCount, yCount));
  469. }, "Set Col And Row");
  470. #endregion
  471. break;
  472. }
  473. case EffectControlHelper.ControlType.ShaderValue:
  474. {
  475. #region 值变化
  476. SetProperty("延迟", tween.FindPropertyRelative("delay"));
  477. SetProperty("持续时间", tween.FindPropertyRelative("duration"));
  478. SetProperty("循环(-1=无限循环)", tween.FindPropertyRelative("loop"));
  479. SetProperty("循环方式", tween.FindPropertyRelative("loopType"));
  480. SerializedProperty floatCtrol = tween.FindPropertyRelative("floatCtrl");
  481. if (tween.FindPropertyRelative("body").objectReferenceValue is Renderer)
  482. {
  483. Renderer renderer = tween.FindPropertyRelative("body").objectReferenceValue as Renderer;
  484. if (renderer.sharedMaterial)
  485. SelectProperty("值属性名", floatCtrol.FindPropertyRelative("propertyName"),
  486. GetShaderProperties(renderer.sharedMaterial, ShaderUtil.ShaderPropertyType.Float, ShaderUtil.ShaderPropertyType.Range));
  487. }
  488. else if (tween.FindPropertyRelative("body").objectReferenceValue is UIMeshRenderer)
  489. {
  490. UIMeshRenderer renderer = tween.FindPropertyRelative("body").objectReferenceValue as UIMeshRenderer;
  491. if (renderer.material)
  492. SelectProperty("值属性名", floatCtrol.FindPropertyRelative("propertyName"),
  493. GetShaderProperties(renderer.material, ShaderUtil.ShaderPropertyType.Float, ShaderUtil.ShaderPropertyType.Range));
  494. }
  495. else if(tween.FindPropertyRelative("body").objectReferenceValue is MaskableGraphic)
  496. {
  497. MaskableGraphic renderer = tween.FindPropertyRelative("body").objectReferenceValue as MaskableGraphic;
  498. if (renderer.material)
  499. SelectProperty("值属性名", floatCtrol.FindPropertyRelative("propertyName"),
  500. GetShaderProperties(renderer.material, ShaderUtil.ShaderPropertyType.Float, ShaderUtil.ShaderPropertyType.Range));
  501. }
  502. SetProperty("开始于", floatCtrol.FindPropertyRelative("from"));
  503. SetProperty("结束于", floatCtrol.FindPropertyRelative("to"));
  504. SetProperty("使用缓动代替曲线", tween.FindPropertyRelative("useEase"));
  505. if (tween.FindPropertyRelative("useEase").boolValue)
  506. SetProperty("缓动类型", tween.FindPropertyRelative("ease"));
  507. else
  508. {
  509. SerializedProperty curves = tween.FindPropertyRelative("curves");
  510. if (curves.arraySize < 1)
  511. {
  512. curves.arraySize = 1;
  513. curves.GetArrayElementAtIndex(0).animationCurveValue = new AnimationCurve(k0, k1);
  514. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  515. EditorUtility.SetDirty(helper);
  516. }
  517. SetCurve("曲线", curves.GetArrayElementAtIndex(0));
  518. }
  519. #endregion
  520. break;
  521. }
  522. case EffectControlHelper.ControlType.ProjectorPlane:
  523. {
  524. #region 投影面
  525. SetProperty("延迟", tween.FindPropertyRelative("delay"));
  526. SetProperty("持续时间", tween.FindPropertyRelative("duration"));
  527. EditorGUILayout.LabelField("", "持续时间为0时,仅创建不更新,为-1时,每帧更新直到本体消亡,大于0时保持每帧更新", "Helpbox");
  528. #endregion
  529. break;
  530. }
  531. }
  532. }
  533. void InitTween(int i, int controlType)
  534. {
  535. SerializedProperty tween = tweenProperties.GetArrayElementAtIndex(tweenProperties.arraySize - 1);
  536. tween.FindPropertyRelative("controlType").intValue = controlType;
  537. tween.FindPropertyRelative("duration").floatValue = 1f;
  538. tween.FindPropertyRelative("loop").intValue = 1;
  539. SerializedProperty colorCtrl = tween.FindPropertyRelative("colorCtrl");
  540. colorCtrl.FindPropertyRelative("colorName").stringValue = "_TintColor";
  541. SerializedProperty unCtrl = tween.FindPropertyRelative("uvCtrl");
  542. unCtrl.FindPropertyRelative("propertyName").stringValue = "_UV";
  543. unCtrl.FindPropertyRelative("from").vector4Value = new Vector4(1, 1, 0, 0);
  544. unCtrl.FindPropertyRelative("to").vector4Value = new Vector4(1, 1, 0, 0);
  545. SerializedProperty curves = tween.FindPropertyRelative("curves");
  546. switch (controlType)
  547. {
  548. case 0:
  549. case 1:
  550. case 2:
  551. {
  552. curves.arraySize = 3;
  553. for (int c = 0; c < 3; c++)
  554. curves.GetArrayElementAtIndex(c).animationCurveValue = new AnimationCurve(k0, k1);
  555. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  556. }
  557. break;
  558. case 3:
  559. {
  560. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  561. helper.tweens[i].colorCtrl.gradient = new Gradient();
  562. helper.tweens[i].colorCtrl.gradient.SetKeys(
  563. new GradientColorKey[2] { new GradientColorKey(Color.white, 0), new GradientColorKey(Color.white, 1) },
  564. new GradientAlphaKey[2] { new GradientAlphaKey(1, 0), new GradientAlphaKey(1, 1) });
  565. EditorUtility.SetDirty(helper);
  566. serializedObject.Update();
  567. }
  568. break;
  569. case 4:
  570. {
  571. curves.arraySize = 4;
  572. for (int c = 0; c < 4; c++)
  573. curves.GetArrayElementAtIndex(c).animationCurveValue = new AnimationCurve(k0, k1);
  574. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  575. }
  576. break;
  577. }
  578. }
  579. List<string> GetShaderProperties(Material material, params ShaderUtil.ShaderPropertyType[] type)
  580. {
  581. Shader shader = material.shader;
  582. List<string> properties = new List<string>();
  583. int count = ShaderUtil.GetPropertyCount(shader);
  584. for (int i = 0; i < count; i++)
  585. {
  586. ShaderUtil.ShaderPropertyType propertyType = ShaderUtil.GetPropertyType(shader, i);
  587. for (int j = 0; j < type.Length; j++)
  588. if (propertyType == type[j])
  589. properties.Add(ShaderUtil.GetPropertyName(shader, i));
  590. }
  591. return properties;
  592. }
  593. string[] GetTweenNames()
  594. {
  595. List<string> names = new List<string>();
  596. for (int i = 0; i < helper.tweens.Count; i++)
  597. {
  598. if (!helper.tweens[i].body)
  599. {
  600. helper.tweens.RemoveAt(i--);
  601. EditorUtility.SetDirty(helper);
  602. serializedObject.Update();
  603. continue;
  604. }
  605. names.Add(string.Format("{0}<{1}>", helper.tweens[i].body.name, helper.tweens[i].controlType.ToString()));
  606. }
  607. return names.ToArray();
  608. }
  609. void SetField<T>(System.Action<T> value, System.Func<T> func, string undoTip = null)
  610. {
  611. EditorGUI.BeginChangeCheck();
  612. T result = func();
  613. if (EditorGUI.EndChangeCheck())
  614. {
  615. Undo.RecordObject(helper, undoTip == null ? "Field Change" : undoTip);
  616. value(result);
  617. EditorUtility.SetDirty(helper);
  618. }
  619. }
  620. void SetProperty(string label, SerializedProperty property, string undoTip = null)
  621. {
  622. EditorGUI.BeginChangeCheck();
  623. content.text = label == null ? "" : label;
  624. EditorGUILayout.PropertyField(property, content, true);
  625. if (EditorGUI.EndChangeCheck())
  626. {
  627. Undo.RecordObject(helper, undoTip == null ? "Property Change" : undoTip);
  628. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  629. EditorUtility.SetDirty(helper);
  630. }
  631. }
  632. void SelectProperty(string label, SerializedProperty nameProperty, List<string> filterProperties)
  633. {
  634. EditorGUILayout.BeginHorizontal();
  635. {
  636. SetProperty(label, nameProperty);
  637. SetField((v) =>
  638. {
  639. nameProperty.stringValue = v;
  640. serializedObject.ApplyModifiedPropertiesWithoutUndo();
  641. }, () =>
  642. {
  643. int d = filterProperties.FindIndex(n => n.Equals(nameProperty.stringValue));
  644. int p = EditorGUILayout.Popup(d, filterProperties.ToArray(), GUILayout.Width(80));
  645. if (p != d) return filterProperties[p];
  646. return nameProperty.stringValue;
  647. });
  648. }
  649. EditorGUILayout.EndHorizontal();
  650. }
  651. void SetCurve(string label, SerializedProperty curve)
  652. {
  653. EditorGUILayout.BeginHorizontal();
  654. {
  655. SetProperty(label, curve);
  656. GUI.color = copyCurve == null ? Color.white : Color.yellow;
  657. if (GUILayout.Button(copyCurve == null ? "复制曲线" : "粘贴曲线", GUILayout.Width(54)))
  658. {
  659. if (copyCurve == null)
  660. {
  661. copyCurve = curve.animationCurveValue;
  662. }
  663. else
  664. {
  665. curve.animationCurveValue = new AnimationCurve(copyCurve.keys);
  666. copyCurve = null;
  667. serializedObject.ApplyModifiedProperties();
  668. EditorUtility.SetDirty(helper);
  669. }
  670. }
  671. GUI.color = Color.white;
  672. }
  673. EditorGUILayout.EndHorizontal();
  674. }
  675. void SetGradient(string label, Gradient gradient, SerializedProperty gradProperty)
  676. {
  677. EditorGUILayout.BeginHorizontal();
  678. {
  679. SetProperty(label, gradProperty);
  680. GUI.color = copyGradient == null ? Color.white : Color.yellow;
  681. if (GUILayout.Button(copyGradient != null ? "粘贴" : "复制", GUILayout.Width(54)))
  682. {
  683. if (copyGradient == null)
  684. {
  685. copyGradient = new Gradient();
  686. copyGradient.SetKeys(gradient.colorKeys, gradient.alphaKeys);
  687. }
  688. else
  689. {
  690. Undo.RecordObject(helper, "Copy");
  691. gradient.SetKeys(copyGradient.colorKeys, copyGradient.alphaKeys);
  692. EditorUtility.SetDirty(helper);
  693. serializedObject.Update();
  694. copyGradient = null;
  695. Repaint();
  696. }
  697. }
  698. GUI.color = Color.white;
  699. }
  700. EditorGUILayout.EndHorizontal();
  701. }
  702. void SampleAnimation()
  703. {
  704. if (string.IsNullOrEmpty(helper.animationPath))
  705. {
  706. string relativePath = AssetDatabase.GetAssetPath(PrefabUtility.GetPrefabParent(helper));
  707. helper.animationPath = string.IsNullOrEmpty(relativePath) ? helper.animationPath : relativePath.Split('.')[0];
  708. }
  709. SetField((v) => helper.animationPath = v, () => EditorGUILayout.DelayedTextField("采样动画路径", helper.animationPath), "Set Bake Path");
  710. if (GUILayout.Button("采样到动画"))
  711. {
  712. if (!Application.isPlaying)
  713. return;
  714. string relativePath = helper.animationPath;
  715. if (System.IO.Directory.Exists(relativePath.Substring(0, relativePath.LastIndexOf('/'))))
  716. helper.BakeToClip((c) =>
  717. {
  718. AnimationClip clip;
  719. if (clip = (AnimationClip)AssetDatabase.LoadAssetAtPath(relativePath + ".anim", typeof(AnimationClip)))
  720. {
  721. EditorUtility.CopySerialized(c, clip);
  722. EditorUtility.SetDirty(clip);
  723. }
  724. else
  725. AssetDatabase.CreateAsset(c, relativePath + ".anim");
  726. });
  727. }
  728. }
  729. }
  730. #endif
  731. public class EffectControlHelper : MonoBehaviour
  732. {
  733. public Vector3 worldRot = Vector3.zero;
  734. public enum ControlType
  735. {
  736. Position = 0,
  737. Rotation = 1,
  738. Scale = 2,
  739. TintColor = 3,
  740. UV = 4,
  741. Visible = 5,
  742. ShaderValue = 6,
  743. SequenceTex = 7,
  744. ProjectorPlane = 8
  745. }
  746. [System.Serializable]
  747. public class TweenGroup
  748. {
  749. public Object body;
  750. public ControlType controlType;
  751. public float delay;
  752. public float duration;
  753. public int loop;
  754. public int key;
  755. public LoopType loopType;
  756. public Vector3Control vectorCtrl;
  757. public ColorControl colorCtrl;
  758. public UVControl uvCtrl;
  759. public FloatControl floatCtrl;
  760. public bool useEase;
  761. public bool useWorldRot;
  762. public Vector3 worldRot = Vector3.zero;
  763. public AnimationCurve[] curves;
  764. public Ease ease;
  765. public bool visible;
  766. public VisableGroup[] visibles;
  767. public TweenGroup() { }
  768. public TweenGroup(TweenGroup source)
  769. {
  770. body = source.body;
  771. controlType = source.controlType;
  772. delay = source.delay;
  773. duration = source.duration;
  774. loop = source.loop;
  775. key = source.key;
  776. loopType = source.loopType;
  777. vectorCtrl = new Vector3Control();
  778. vectorCtrl.from = source.vectorCtrl.from;
  779. vectorCtrl.to = source.vectorCtrl.to;
  780. colorCtrl = new ColorControl();
  781. colorCtrl.colorName = source.colorCtrl.colorName;
  782. colorCtrl.gradient = new Gradient();
  783. colorCtrl.gradient.SetKeys(source.colorCtrl.gradient.colorKeys, source.colorCtrl.gradient.alphaKeys);
  784. uvCtrl = new UVControl();
  785. uvCtrl.propertyName = source.uvCtrl.propertyName;
  786. uvCtrl.from = source.uvCtrl.from;
  787. uvCtrl.to = source.uvCtrl.to;
  788. floatCtrl = new FloatControl();
  789. floatCtrl.propertyName = source.floatCtrl.propertyName;
  790. floatCtrl.from = source.floatCtrl.from;
  791. floatCtrl.to = source.floatCtrl.to;
  792. useEase = source.useEase;
  793. curves = new AnimationCurve[source.curves.Length];
  794. for (int i = 0; i < curves.Length; i++)
  795. curves[i] = new AnimationCurve(source.curves[i].keys);
  796. ease = source.ease;
  797. visible = source.visible;
  798. }
  799. public TweenGroup(Object body)
  800. {
  801. this.body = body;
  802. if (body is Transform)
  803. controlType = ControlType.Position;
  804. else if (body is Renderer || body is MaskableGraphic || body is UIMeshRenderer)
  805. controlType = ControlType.TintColor;
  806. else
  807. controlType = ControlType.Visible;
  808. }
  809. public void SetValue(float t)
  810. {
  811. if (body is Transform)
  812. {
  813. Vector3 v;
  814. Evalute(out v, t);
  815. switch (controlType)
  816. {
  817. case ControlType.Position:
  818. (body as Transform).localPosition = v;
  819. break;
  820. case ControlType.Rotation:
  821. if (useWorldRot)
  822. (body as Transform).eulerAngles = v + worldRot;
  823. else
  824. (body as Transform).localEulerAngles = v;
  825. break;
  826. case ControlType.Scale:
  827. (body as Transform).localScale = v;
  828. break;
  829. }
  830. }
  831. else if (body is Renderer)
  832. {
  833. Renderer r = body as Renderer;
  834. if (r.material)
  835. {
  836. switch (controlType)
  837. {
  838. case ControlType.TintColor:
  839. if (colorCtrl.gradient != null)
  840. r.material.SetColor(colorCtrl.colorName, colorCtrl.gradient.Evaluate(t));
  841. break;
  842. case ControlType.UV:
  843. {
  844. Vector4 v;
  845. Evalute(out v, t);
  846. r.material.SetVector(uvCtrl.propertyName, v);
  847. }
  848. break;
  849. case ControlType.ShaderValue:
  850. {
  851. float v;
  852. Evalute(out v, t);
  853. r.material.SetFloat(floatCtrl.propertyName, v);
  854. }
  855. break;
  856. }
  857. }
  858. }
  859. else if (body is MaskableGraphic)
  860. {
  861. MaskableGraphic i = body as MaskableGraphic;
  862. switch (controlType)
  863. {
  864. case ControlType.TintColor:
  865. if (colorCtrl.gradient != null)
  866. i.color = colorCtrl.gradient.Evaluate(t);
  867. break;
  868. case ControlType.UV:
  869. {
  870. Vector4 v;
  871. Evalute(out v, t);
  872. if (i.material)
  873. i.material.SetVector(uvCtrl.propertyName, v);
  874. else if (i is RawImage)
  875. (i as RawImage).uvRect = new Rect(v.z, v.w, v.x, v.y);
  876. }
  877. break;
  878. case ControlType.ShaderValue:
  879. {
  880. if (i.material)
  881. {
  882. float v;
  883. Evalute(out v, t);
  884. i.material.SetFloat(floatCtrl.propertyName, v);
  885. }
  886. }
  887. break;
  888. }
  889. }
  890. else if (body is UIMeshRenderer)
  891. {
  892. UIMeshRenderer r = body as UIMeshRenderer;
  893. switch (controlType)
  894. {
  895. case ControlType.TintColor:
  896. if (colorCtrl.gradient != null)
  897. r.SetColor(colorCtrl.gradient.Evaluate(t));
  898. break;
  899. case ControlType.UV:
  900. {
  901. Vector4 cur;
  902. Evalute(out cur, t);
  903. r.SetUV(uvCtrl.propertyName, cur);
  904. }
  905. break;
  906. case ControlType.ShaderValue:
  907. {
  908. float cur;
  909. Evalute(out cur, t);
  910. r.SetValue(floatCtrl.propertyName, cur);
  911. }
  912. break;
  913. }
  914. }
  915. }
  916. public void SetValue(Vector4 v)
  917. {
  918. if (controlType != ControlType.SequenceTex)
  919. return;
  920. if (body is Renderer)
  921. {
  922. Renderer r = body as Renderer;
  923. if (r.material)
  924. {
  925. r.material.SetTextureScale(uvCtrl.propertyName, new Vector2(v.x, v.y));
  926. r.material.SetTextureOffset(uvCtrl.propertyName, new Vector2(v.z, v.w));
  927. }
  928. }
  929. else if (body is MaskableGraphic)
  930. {
  931. MaskableGraphic i = body as MaskableGraphic;
  932. if (i.material)
  933. i.material.SetVector(uvCtrl.propertyName, v);
  934. else if (i is RawImage)
  935. (i as RawImage).uvRect = new Rect(v.z, v.w, v.x, v.y);
  936. }
  937. else if (body is UIMeshRenderer)
  938. {
  939. (body as UIMeshRenderer).SetUV(uvCtrl.propertyName, v);
  940. }
  941. }
  942. void Evalute(out Vector3 v, float t)
  943. {
  944. if (useEase)
  945. v = Vector3.LerpUnclamped(vectorCtrl.from, vectorCtrl.to, t);
  946. else
  947. {
  948. v.x = Mathf.LerpUnclamped(vectorCtrl.from.x, vectorCtrl.to.x, curves[0].Evaluate(t));
  949. v.y = Mathf.LerpUnclamped(vectorCtrl.from.y, vectorCtrl.to.y, curves[1].Evaluate(t));
  950. v.z = Mathf.LerpUnclamped(vectorCtrl.from.z, vectorCtrl.to.z, curves[2].Evaluate(t));
  951. }
  952. }
  953. void Evalute(out Vector4 v, float t)
  954. {
  955. if (useEase)
  956. v = Vector4.LerpUnclamped(uvCtrl.from, uvCtrl.to, t);
  957. else
  958. {
  959. v.x = Mathf.LerpUnclamped(uvCtrl.from.x, uvCtrl.to.x, curves[0].Evaluate(t));
  960. v.y = Mathf.LerpUnclamped(uvCtrl.from.y, uvCtrl.to.y, curves[1].Evaluate(t));
  961. v.z = Mathf.LerpUnclamped(uvCtrl.from.z, uvCtrl.to.z, curves[2].Evaluate(t));
  962. v.w = Mathf.LerpUnclamped(uvCtrl.from.w, uvCtrl.to.w, curves[3].Evaluate(t));
  963. }
  964. }
  965. void Evalute(out float v, float t)
  966. {
  967. if (useEase)
  968. v = Mathf.LerpUnclamped(floatCtrl.from, floatCtrl.to, t);
  969. else
  970. v = Mathf.LerpUnclamped(floatCtrl.from, floatCtrl.to, curves[0].Evaluate(t));
  971. }
  972. public void HideColor()
  973. {
  974. if (controlType != ControlType.TintColor)
  975. return;
  976. if (body is Renderer)
  977. {
  978. Renderer r = body as Renderer;
  979. if (r.material)
  980. r.material.SetColor(colorCtrl.colorName, new Color(0, 0, 0, 0));
  981. }
  982. else if (body is MaskableGraphic)
  983. {
  984. MaskableGraphic r = body as MaskableGraphic;
  985. if (r.material)
  986. r.material.SetColor(colorCtrl.colorName, new Color(0, 0, 0, 0));
  987. }
  988. else if (body is UIMeshRenderer)
  989. {
  990. //UIMeshRenderer r = body as UIMeshRenderer;
  991. //if (r.material)
  992. // r.material.SetColor(colorCtrl.colorName, new Color(0, 0, 0, 0));
  993. }
  994. }
  995. }
  996. [System.Serializable]
  997. public class Vector3Control
  998. {
  999. public Vector3 from;
  1000. public Vector3 to;
  1001. public string followHandler;
  1002. }
  1003. [System.Serializable]
  1004. public class ColorControl
  1005. {
  1006. public string colorName;
  1007. public Gradient gradient;
  1008. }
  1009. [System.Serializable]
  1010. public class UVControl
  1011. {
  1012. public string propertyName;
  1013. public Vector4 from;
  1014. public Vector4 to;
  1015. }
  1016. [System.Serializable]
  1017. public class FloatControl
  1018. {
  1019. public string propertyName;
  1020. public float from;
  1021. public float to;
  1022. }
  1023. [System.Serializable]
  1024. public struct VisableGroup
  1025. {
  1026. public float delay;
  1027. public bool visible;
  1028. }
  1029. [System.Serializable]
  1030. public class Avatar
  1031. {
  1032. public float delay;
  1033. public Vector3 position;
  1034. public Vector3 rotation;
  1035. public Vector3 scale = Vector3.one;
  1036. public float duration = 1;
  1037. }
  1038. public float delay;
  1039. public float[] repeatTimes;
  1040. public Vector3 offset;
  1041. public Vector3 angleOff;
  1042. public Vector3 scale = Vector3.one;
  1043. public float instanceExistTime = 1;
  1044. public Avatar[] avatars;
  1045. public string animationPath;
  1046. private bool isBase = true;
  1047. public bool IsBase
  1048. {
  1049. get { return isBase; }
  1050. set { isBase = value; }
  1051. }
  1052. public bool isOriginal = true;
  1053. public List<TweenGroup> tweens = new List<TweenGroup>();
  1054. private List<Tweener> tweeners = new List<Tweener>();
  1055. private Dictionary<Transform, Vector3> posOrgState;
  1056. private Dictionary<Transform, Vector3> rotOrgState;
  1057. private Dictionary<Transform, Vector3> sclOrgState;
  1058. private Dictionary<GameObject, bool> goOrgState;
  1059. private Vector3 orgPos = Vector3.zero;
  1060. private Vector3 orgRot = Vector3.zero;
  1061. private Vector3 orgScl = Vector3.one;
  1062. IEnumerator WaitOneFrame(System.Action ac)
  1063. {
  1064. yield return 1;
  1065. ac();
  1066. }
  1067. private void OnEnable()
  1068. {
  1069. StartCoroutine(WaitOneFrame(RePlay));
  1070. }
  1071. private static int Compare(TweenGroup a, TweenGroup b)
  1072. {
  1073. if (a.delay == b.delay)
  1074. {
  1075. return 0;
  1076. }
  1077. if (a.delay > b.delay)
  1078. {
  1079. return 1;
  1080. }
  1081. else
  1082. {
  1083. return -1;
  1084. }
  1085. }
  1086. private void OnDisable()
  1087. {
  1088. for (int i = 0; i < tweeners.Count; i++)
  1089. {
  1090. tweeners[i].Kill();
  1091. }
  1092. tweeners.Clear();
  1093. }
  1094. public void RePlay()
  1095. {
  1096. ResetOriginalState();
  1097. if (IsBase)
  1098. {
  1099. orgPos = transform.localPosition;
  1100. orgRot = transform.localEulerAngles;
  1101. orgScl = transform.localScale;
  1102. tweens.Sort(Compare);
  1103. }
  1104. Delay(delay, Play);
  1105. }
  1106. System.Collections.IEnumerator StartPlay()
  1107. {
  1108. if (delay > 0)
  1109. {
  1110. yield return new WaitForSeconds(delay);
  1111. }
  1112. }
  1113. private void Play()
  1114. {
  1115. for (int i = 0; i < tweens.Count; i++)
  1116. {
  1117. tweens[i].worldRot = worldRot;
  1118. if (!tweens[i].body)
  1119. continue;
  1120. switch (tweens[i].controlType)
  1121. {
  1122. case ControlType.Position:
  1123. {
  1124. if (tweens[i].vectorCtrl == null)
  1125. continue;
  1126. Transform tr = tweens[i].body as Transform;
  1127. if (posOrgState == null)
  1128. posOrgState = new Dictionary<Transform, Vector3>();
  1129. if (!posOrgState.ContainsKey(tr))
  1130. posOrgState.Add(tr, tr.localPosition);
  1131. DoValue(tweens[i]);
  1132. break;
  1133. }
  1134. case ControlType.Rotation:
  1135. {
  1136. if (tweens[i].vectorCtrl == null)
  1137. continue;
  1138. Transform tr = tweens[i].body as Transform;
  1139. if (rotOrgState == null)
  1140. rotOrgState = new Dictionary<Transform, Vector3>();
  1141. if (!rotOrgState.ContainsKey(tr))
  1142. rotOrgState.Add(tr, tr.localEulerAngles);
  1143. DoValue(tweens[i]);
  1144. break;
  1145. }
  1146. case ControlType.Scale:
  1147. {
  1148. if (tweens[i].vectorCtrl == null)
  1149. continue;
  1150. Transform tr = tweens[i].body as Transform;
  1151. if (sclOrgState == null)
  1152. sclOrgState = new Dictionary<Transform, Vector3>();
  1153. if (!sclOrgState.ContainsKey(tr))
  1154. sclOrgState.Add(tr, tr.localScale);
  1155. DoValue(tweens[i]);
  1156. break;
  1157. }
  1158. case ControlType.TintColor:
  1159. {
  1160. if (tweens[i].colorCtrl == null)
  1161. continue;
  1162. DoColor(tweens[i]);
  1163. break;
  1164. }
  1165. case ControlType.UV:
  1166. {
  1167. if (tweens[i].uvCtrl == null)
  1168. continue;
  1169. DoValue(tweens[i]);
  1170. break;
  1171. }
  1172. case ControlType.SequenceTex:
  1173. {
  1174. if (tweens[i].uvCtrl == null)
  1175. continue;
  1176. DoTexSequence(tweens[i]);
  1177. break;
  1178. }
  1179. case ControlType.ShaderValue:
  1180. {
  1181. if (tweens[i].floatCtrl == null)
  1182. continue;
  1183. DoValue(tweens[i]);
  1184. break;
  1185. }
  1186. case ControlType.Visible:
  1187. {
  1188. if (tweens[i].visibles == null)
  1189. continue;
  1190. GameObject go = tweens[i].body as GameObject;
  1191. if (goOrgState == null)
  1192. goOrgState = new Dictionary<GameObject, bool>();
  1193. if (!goOrgState.ContainsKey(go))
  1194. goOrgState.Add(go, go.activeSelf);
  1195. DoVisible(tweens[i]);
  1196. break;
  1197. }
  1198. case ControlType.ProjectorPlane:
  1199. {
  1200. if (tweens[i].visibles == null)
  1201. continue;
  1202. DoProjector(tweens[i]);
  1203. break;
  1204. }
  1205. }
  1206. }
  1207. if (IsBase)
  1208. {
  1209. SpawnRepeatSimple();
  1210. SpawnAvatar();
  1211. }
  1212. }
  1213. #region 控制变化
  1214. private void DoValue(TweenGroup tg)
  1215. {
  1216. tweeners.Add(DOTween.To(tg.SetValue, 0f, 1f, tg.duration)
  1217. .SetDelay(tg.delay)
  1218. .SetEase(tg.useEase ? tg.ease : Ease.Linear)
  1219. .SetLoops(tg.loop, tg.loopType));
  1220. }
  1221. private void DoColor(TweenGroup tg)
  1222. {
  1223. tweeners.Add(DOTween.To(tg.SetValue, 0f, 1f, tg.duration)
  1224. .SetDelay(tg.delay)
  1225. .SetEase(Ease.Linear)
  1226. .SetLoops(tg.loop, tg.loopType)
  1227. .OnKill(tg.HideColor));
  1228. }
  1229. private void DoTexSequence(TweenGroup tg)
  1230. {
  1231. int xCount = (int)(1 / tg.uvCtrl.from.x + 0.5f);
  1232. int totalCount = xCount * (int)(1 / tg.uvCtrl.from.y + 0.5f);
  1233. if (xCount != 0 && totalCount != 0)
  1234. {
  1235. //tg.SetValue(new Vector4(tg.uvCtrl.from.x, tg.uvCtrl.from.y, 0, 1 - tg.uvCtrl.from.y));
  1236. //Delay(tg.delay, delegate { DoTexSequence(tg, xCount, totalCount, tg.duration / totalCount, 1, tg.loop, tg.key); });
  1237. //DoTexSequence(tg, xCount, totalCount, tg.duration / totalCount, 1, tg.loop, tg.key);
  1238. tg.SetValue(new Vector4(tg.uvCtrl.from.x, tg.uvCtrl.from.y, 0, 1 - tg.uvCtrl.from.y));
  1239. tweeners.Add(DOTween.To(EmptySet, 0, tg.delay, tg.delay).SetEase(Ease.Linear).SetId(tg.key).OnComplete(delegate
  1240. {
  1241. DoTexSequence(tg, xCount, totalCount, tg.duration / totalCount, 1, tg.loop, tg.key);
  1242. }));
  1243. }
  1244. }
  1245. private void DoTexSequence(TweenGroup tg, int xCount, int totalCount, float intervalTime, int focus, int loop = -1, int seqKey = 0)
  1246. {
  1247. if (focus == totalCount && loop > 0)
  1248. loop--;
  1249. if (loop != 0)
  1250. {
  1251. focus %= totalCount;
  1252. tg.SetValue(new Vector4(tg.uvCtrl.from.x, tg.uvCtrl.from.y, focus % xCount * tg.uvCtrl.from.x, 1 - (1 + focus / xCount) * tg.uvCtrl.from.y));
  1253. if (intervalTime > 0)
  1254. {
  1255. var tw = GetTweenerFromKey(seqKey);
  1256. if (tw == null)
  1257. {
  1258. tweeners.Add(DOTween.To(EmptySet, 0, intervalTime, intervalTime).SetEase(Ease.Linear).SetId(seqKey).OnComplete(delegate
  1259. {
  1260. DoTexSequence(tg, xCount, totalCount, intervalTime, ++focus, loop, seqKey);
  1261. }));
  1262. }
  1263. else
  1264. {
  1265. tw.OnComplete(delegate
  1266. {
  1267. DoTexSequence(tg, xCount, totalCount, intervalTime, ++focus, loop, seqKey);
  1268. });
  1269. tw.Restart();
  1270. }
  1271. }
  1272. else
  1273. {
  1274. DoTexSequence(tg, xCount, totalCount, intervalTime, ++focus, loop, seqKey);
  1275. }
  1276. }
  1277. }
  1278. private Tweener GetTweenerFromKey(int key)
  1279. {
  1280. Tweener tw = null;
  1281. if (tweeners == null || tweeners.Count < 1) return tw;
  1282. for (int i = 0; i < tweeners.Count; i++)
  1283. {
  1284. if (tweeners[i].id != null && (tweeners[i].id is int) && (int)tweeners[i].id == key)
  1285. {
  1286. tw = tweeners[i];
  1287. break;
  1288. }
  1289. }
  1290. return tw;
  1291. }
  1292. private void DoVisible(TweenGroup tg)
  1293. {
  1294. GameObject go = tg.body as GameObject;
  1295. for (int i = 0; i < tg.visibles.Length; i++)
  1296. {
  1297. VisableGroup vg = tg.visibles[i];
  1298. Delay(vg.delay, delegate
  1299. {
  1300. if (vg.visible)
  1301. {
  1302. ParticleSystem[] pss = go.GetComponentsInChildren<ParticleSystem>(true);
  1303. for (int p = 0; p < pss.Length; p++)
  1304. pss[p].Clear();
  1305. TrailRenderer[] trs = go.GetComponentsInChildren<TrailRenderer>(true);
  1306. for (int l = 0; l < trs.Length; l++)
  1307. trs[l].Clear();
  1308. }
  1309. go.SetActive(vg.visible);
  1310. });
  1311. }
  1312. }
  1313. private void DoProjector(TweenGroup tg)
  1314. {
  1315. ProjectorPlane pp = tg.body as ProjectorPlane;
  1316. Delay(tg.delay, delegate
  1317. {
  1318. if (tg.duration == 0)
  1319. pp.Projector();
  1320. else if (tg.duration == -1)
  1321. tweeners.Add(DOTween.To(delegate (float t) { pp.Projector(); }, 0, 1, 1).SetLoops(-1));
  1322. else
  1323. tweeners.Add(DOTween.To(delegate (float t) { pp.Projector(); }, 0, 1, tg.duration));
  1324. });
  1325. }
  1326. #endregion
  1327. #region 控制复生
  1328. private void SpawnRepeatSimple()
  1329. {
  1330. if (repeatTimes != null)
  1331. for (int i = 0; i < repeatTimes.Length; i++)
  1332. SpawnRepeatSimple(repeatTimes[i], i + 1);
  1333. }
  1334. private void SpawnRepeatSimple(float delay, int index)
  1335. {
  1336. Delay(Mathf.Max(0.01f, delay), delegate
  1337. {
  1338. if (!IsBase)
  1339. return;
  1340. GameObject ins = Instantiate(this.gameObject);
  1341. ins.transform.SetParent(transform.parent);
  1342. ins.transform.localScale = new Vector3()
  1343. {
  1344. x = orgScl.x * Mathf.Pow(scale.x, index),
  1345. y = orgScl.y * Mathf.Pow(scale.y, index),
  1346. z = orgScl.z * Mathf.Pow(scale.z, index)
  1347. };
  1348. ins.transform.localPosition = orgPos + offset * index;
  1349. ins.transform.localEulerAngles = orgRot + angleOff * index;
  1350. EffectControlHelper ech = ins.GetComponent<EffectControlHelper>();
  1351. ech.IsBase = false;
  1352. Delay(ech.delay + instanceExistTime, delegate { Destroy(ins); }, delegate { Destroy(ins); });
  1353. });
  1354. }
  1355. private void SpawnAvatar()
  1356. {
  1357. if (avatars != null)
  1358. for (int i = 0; i < avatars.Length; i++)
  1359. SpawnAvatar(avatars[i]);
  1360. }
  1361. private void SpawnAvatar(Avatar avatar)
  1362. {
  1363. Delay(Mathf.Max(0.01f, avatar.delay), delegate
  1364. {
  1365. if (!IsBase)
  1366. return;
  1367. GameObject ins = Instantiate(this.gameObject);
  1368. ins.transform.SetParent(transform.parent);
  1369. ins.transform.localPosition = avatar.position;
  1370. ins.transform.localEulerAngles = avatar.rotation;
  1371. ins.transform.localScale = avatar.scale;
  1372. EffectControlHelper ech = ins.GetComponent<EffectControlHelper>();
  1373. ech.IsBase = false;
  1374. ech.worldRot = avatar.rotation;
  1375. Delay(ech.delay + avatar.duration, delegate { Destroy(ins); }, delegate { Destroy(ins); });
  1376. });
  1377. }
  1378. #endregion
  1379. private static void EmptySet(float v)
  1380. {
  1381. }
  1382. private void Delay(float time, TweenCallback onComplete, TweenCallback onKill = null)
  1383. {
  1384. if (time > 0)
  1385. tweeners.Add(
  1386. DOTween.To(EmptySet, 0, time, time)
  1387. .SetEase(Ease.Linear)
  1388. .OnComplete(onComplete)
  1389. .OnKill(onKill));
  1390. else onComplete();
  1391. }
  1392. public void ResetOriginalState()
  1393. {
  1394. if (posOrgState != null)
  1395. {
  1396. var iter = posOrgState.GetEnumerator();
  1397. while (iter.MoveNext())
  1398. {
  1399. if (iter.Current.Key != null)
  1400. {
  1401. iter.Current.Key.localPosition = iter.Current.Value;
  1402. }
  1403. }
  1404. iter.Dispose();
  1405. }
  1406. if (rotOrgState != null)
  1407. {
  1408. var iter = rotOrgState.GetEnumerator();
  1409. while (iter.MoveNext())
  1410. {
  1411. if (iter.Current.Key != null)
  1412. {
  1413. iter.Current.Key.localEulerAngles = iter.Current.Value;
  1414. }
  1415. }
  1416. iter.Dispose();
  1417. }
  1418. if (sclOrgState != null)
  1419. {
  1420. var iter = sclOrgState.GetEnumerator();
  1421. while (iter.MoveNext())
  1422. {
  1423. if (iter.Current.Key != null)
  1424. {
  1425. iter.Current.Key.localScale = iter.Current.Value;
  1426. }
  1427. }
  1428. iter.Dispose();
  1429. }
  1430. if (goOrgState != null)
  1431. {
  1432. var iter = goOrgState.GetEnumerator();
  1433. while (iter.MoveNext())
  1434. {
  1435. if (iter.Current.Key != null)
  1436. {
  1437. iter.Current.Key.SetActive(iter.Current.Value);
  1438. }
  1439. }
  1440. iter.Dispose();
  1441. }
  1442. }
  1443. public void BakeToClip(System.Action<AnimationClip> clipCallback)
  1444. {
  1445. AnimationClip clip = new AnimationClip();
  1446. clip.frameRate = 30;
  1447. List<TweenGroup> longTimeTweens = new List<TweenGroup>(tweens);
  1448. longTimeTweens.Sort((a, b) => (b.delay + b.duration).CompareTo(a.delay + a.duration));
  1449. float waitTime = longTimeTweens[0].delay + longTimeTweens[0].duration;
  1450. OnDisable();
  1451. OnEnable();
  1452. Delay(delay, () =>
  1453. {
  1454. for (int i = 0; i < tweens.Count; i++)
  1455. {
  1456. TweenGroup tween = tweens[i];
  1457. switch (tween.controlType)
  1458. {
  1459. case ControlType.Position:
  1460. {
  1461. Transform tr = tween.body as Transform;
  1462. string relativePath = GetRelativePath(tr);
  1463. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localPosition.x,
  1464. (cx) => clip.SetCurve(relativePath, typeof(Transform), "localPosition.x", cx));
  1465. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localPosition.y,
  1466. (cy) => clip.SetCurve(relativePath, typeof(Transform), "localPosition.y", cy));
  1467. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localPosition.z,
  1468. (cz) => clip.SetCurve(relativePath, typeof(Transform), "localPosition.z", cz));
  1469. break;
  1470. }
  1471. case ControlType.Rotation:
  1472. {
  1473. Transform tr = tween.body as Transform;
  1474. string relativePath = GetRelativePath(tr);
  1475. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localEulerAngles.x,
  1476. (cx) => clip.SetCurve(relativePath, typeof(Transform), "localEulerAngles.x", cx));
  1477. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localEulerAngles.y,
  1478. (cy) => clip.SetCurve(relativePath, typeof(Transform), "localEulerAngles.y", cy));
  1479. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localEulerAngles.z,
  1480. (cz) => clip.SetCurve(relativePath, typeof(Transform), "localEulerAngles.z", cz));
  1481. break;
  1482. }
  1483. case ControlType.Scale:
  1484. {
  1485. Transform tr = tween.body as Transform;
  1486. string relativePath = GetRelativePath(tr);
  1487. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localScale.x,
  1488. (cx) => clip.SetCurve(relativePath, typeof(Transform), "localScale.x", cx));
  1489. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localScale.y,
  1490. (cy) => clip.SetCurve(relativePath, typeof(Transform), "localScale.y", cy));
  1491. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration, () => tr.localScale.z,
  1492. (cz) => clip.SetCurve(relativePath, typeof(Transform), "localScale.z", cz));
  1493. break;
  1494. }
  1495. case ControlType.TintColor:
  1496. {
  1497. if (tween.body is Renderer)
  1498. {
  1499. Renderer rd = tween.body as Renderer;
  1500. string relativePath = GetRelativePath(rd.transform);
  1501. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1502. () => rd.material.GetColor(tween.colorCtrl.colorName).r,
  1503. (cr) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.colorCtrl.colorName + ".r", cr));
  1504. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1505. () => rd.material.GetColor(tween.colorCtrl.colorName).g,
  1506. (cg) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.colorCtrl.colorName + ".g", cg));
  1507. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1508. () => rd.material.GetColor(tween.colorCtrl.colorName).b,
  1509. (cb) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.colorCtrl.colorName + ".b", cb));
  1510. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1511. () => rd.material.GetColor(tween.colorCtrl.colorName).a,
  1512. (ca) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.colorCtrl.colorName + ".a", ca));
  1513. }
  1514. break;
  1515. }
  1516. case ControlType.UV:
  1517. {
  1518. if (tween.body is Renderer)
  1519. {
  1520. Renderer rd = tween.body as Renderer;
  1521. string relativePath = GetRelativePath(rd.transform);
  1522. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1523. () => rd.material.GetColor(tween.uvCtrl.propertyName).r,
  1524. (cx) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.uvCtrl.propertyName + ".x", cx));
  1525. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1526. () => rd.material.GetColor(tween.uvCtrl.propertyName).g,
  1527. (cy) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.uvCtrl.propertyName + ".y", cy));
  1528. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1529. () => rd.material.GetColor(tween.uvCtrl.propertyName).b,
  1530. (cz) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.uvCtrl.propertyName + ".z", cz));
  1531. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1532. () => rd.material.GetColor(tween.uvCtrl.propertyName).a,
  1533. (cw) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.uvCtrl.propertyName + ".w", cw));
  1534. }
  1535. break;
  1536. }
  1537. case ControlType.SequenceTex:
  1538. {
  1539. if (tween.body is Renderer)
  1540. {
  1541. Renderer rd = tween.body as Renderer;
  1542. string relativePath = GetRelativePath(rd.transform);
  1543. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1544. () => rd.material.GetTextureScale(tween.uvCtrl.propertyName).x,
  1545. (cx) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.uvCtrl.propertyName + "_ST.x", cx), true);
  1546. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1547. () => rd.material.GetTextureScale(tween.uvCtrl.propertyName).y,
  1548. (cy) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.uvCtrl.propertyName + "_ST.y", cy), true);
  1549. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1550. () => rd.material.GetTextureOffset(tween.uvCtrl.propertyName).x,
  1551. (cz) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.uvCtrl.propertyName + "_ST.z", cz), true);
  1552. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1553. () => rd.material.GetTextureOffset(tween.uvCtrl.propertyName).y,
  1554. (cw) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.uvCtrl.propertyName + "_ST.w", cw), true);
  1555. }
  1556. break;
  1557. }
  1558. case ControlType.ShaderValue:
  1559. {
  1560. Renderer rd = tween.body as Renderer;
  1561. string relativePath = GetRelativePath(rd.transform);
  1562. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1563. () => rd.material.GetFloat(tween.floatCtrl.propertyName),
  1564. (cv) => clip.SetCurve(relativePath, typeof(Renderer), "material." + tween.floatCtrl.propertyName, cv));
  1565. break;
  1566. }
  1567. case ControlType.Visible:
  1568. {
  1569. GameObject go = tween.body as GameObject;
  1570. string relativePath = GetRelativePath(go.transform);
  1571. RecordCurve(tween, new AnimationCurve(), tween.delay + tween.duration,
  1572. () => go.activeSelf ? 1 : 0,
  1573. (cv) => clip.SetCurve(relativePath, typeof(GameObject), "m_IsActive", cv), true);
  1574. break;
  1575. }
  1576. }
  1577. }
  1578. Delay(waitTime + 1, () => clipCallback(clip));
  1579. });
  1580. }
  1581. private string GetRelativePath(Transform tr)
  1582. {
  1583. string relativePath = "";
  1584. if (tr != transform)
  1585. {
  1586. relativePath = tr.name;
  1587. while (tr.parent != transform)
  1588. {
  1589. tr = tr.parent;
  1590. relativePath = string.Format("{0}/{1}", tr.name, relativePath);
  1591. }
  1592. }
  1593. return relativePath;
  1594. }
  1595. private void RecordCurve(TweenGroup tween, AnimationCurve curve, float duration, System.Func<float> value, System.Action<AnimationCurve> result, bool constant = false)
  1596. {
  1597. int frame = (int)(duration * 30 + 0.5f);
  1598. for (int count = 0; count <= frame; count++)
  1599. {
  1600. float time = Mathf.Lerp(0, duration, (float)count / frame);
  1601. Delay(time, () =>
  1602. {
  1603. Keyframe key = new Keyframe(time, value());
  1604. key.tangentMode = constant ? 103 : 34;//103 is Constant , 34 is Auto
  1605. if (curve.keys.Length > 1)
  1606. {
  1607. key.inTangent = constant ? float.PositiveInfinity : (value() - curve.keys[curve.keys.Length - 1].value) / (time - curve.keys[curve.keys.Length - 1].time);
  1608. key.outTangent = constant ? float.PositiveInfinity : (value() - curve.keys[curve.keys.Length - 1].value) / (time - curve.keys[curve.keys.Length - 1].time);
  1609. }
  1610. curve.AddKey(key);
  1611. });
  1612. }
  1613. Delay(duration + 0.5f, () => result(curve));
  1614. }
  1615. }