static public void DrawVector3(DoTweenNode node) { EditorGUILayout.BeginHorizontal(); node.fVector3 = EditorGUILayout.Vector3Field("开始值", node.fVector3); node.valFlagF = (DoTweenValFlag)EditorGUILayout.EnumMaskField(node.valFlagF, GUILayout.Width(60)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); node.tVector3 = EditorGUILayout.Vector3Field("结束值", node.tVector3); node.valFlagT = (DoTweenValFlag)EditorGUILayout.EnumMaskField(node.valFlagT, GUILayout.Width(60)); EditorGUILayout.EndHorizontal(); }
public void Play() { for (int i = 0; i < mTweeners.Count; ++i) { Tweener node = mTweeners[i]; if (node.IsActive()) { node.Kill(); } } mTweeners.Clear(); for (int j = 0; j < nodes.Count; ++j) { DoTweenNode node = nodes[j]; Tweener tweener = null; node.parent = gameObject; if (node.type == DoTweenType.Position) { Vector3 tVector3; if ((node.valFlagF & DoTweenValFlag.MySelf) == 0) { if (node.isLocal) { transform.localPosition = node.fVector3; } else { transform.position = node.fVector3; } } if ((node.valFlagT & DoTweenValFlag.MySelf) > 0) { if (node.isLocal) { tVector3 = transform.localPosition; } else { tVector3 = transform.position; } } else { tVector3 = node.tVector3; } if (node.isLocal) { tweener = DOTween.To( () => transform.localPosition, position => { transform.localPosition = position; }, tVector3, node.duration); } else { tweener = DOTween.To( () => transform.position, position => { transform.position = position; }, tVector3, node.duration); } } else if (node.type == DoTweenType.Scale) { transform.localScale = node.fVector3; tweener = transform.DOScale(node.tVector3, node.duration); } else if (node.type == DoTweenType.Rotation) { Vector3 tVector3; if ((node.valFlagF & DoTweenValFlag.MySelf) == 0) { if (node.isLocal) { transform.localRotation = Quaternion.Euler(node.fVector3); } else { transform.rotation = Quaternion.Euler(node.fVector3); } } if ((node.valFlagT & DoTweenValFlag.MySelf) > 0) { if (node.isLocal) { tVector3 = transform.localRotation.eulerAngles; } else { tVector3 = transform.rotation.eulerAngles; } } else { tVector3 = node.tVector3; } if (node.isLocal) { tweener = DOTween.To( () => transform.localRotation.eulerAngles, angle => { transform.localRotation = Quaternion.Euler(angle); }, tVector3, node.duration); } else { tweener = DOTween.To( () => transform.rotation.eulerAngles, angle => { transform.rotation = Quaternion.Euler(angle); }, tVector3, node.duration); } } else if (node.type == DoTweenType.Color) { Graphic graphic = GetComponent <Graphic>(); if (graphic != null) { graphic.color = node.fColor; tweener = graphic.DOColor(node.tColor, node.duration); } } else if (node.type == DoTweenType.Alpha) { Graphic[] comps = null; if (node.isInfluenceChild) { comps = GetComponentsInChildren <Graphic>(true); } else { comps = GetComponents <Graphic>(); } for (int i = 0; i < comps.Length; i++) { Color color = comps[i].color; color.a = node.fFloat; comps[i].color = color; } if (comps != null) { tweener = DOTween.To(alpha => { for (int i = 0; i < comps.Length; i++) { Color color = comps[i].color; color.a = alpha; comps[i].color = color; } }, node.fFloat, node.tFloat, node.duration); } } else if (node.type == DoTweenType.Material) { Graphic graphic = GetComponent <Graphic>(); if (graphic != null) { graphic.material = new Material(Shader.Find("Kadu/UI/Bloom")); graphic.material.SetColor("_Color", Color.white); tweener = DOTween.To(value => { graphic.material.SetFloat("_Strength", value); }, node.fFloat, node.tFloat, node.duration); } } if (tweener != null) { mTweeners.Add(tweener); // 循环 tweener.SetLoops(node.loops, node.loopType); // 延迟 tweener.SetDelay(node.delay); //设置这个Tween不受Time.scale影响 tweener.SetUpdate(node.isIndependentUpdate); //设置移动类型 tweener.SetEase(node.ease); // 自动删除 tweener.SetAutoKill(); // 完成回调 tweener.OnComplete(node.OnComplete); } } }
public override void OnInspectorGUI() { base.OnInspectorGUI(); GUILayout.BeginHorizontal(); GUILayout.Space(Screen.width - 80); if (GUILayout.Button("添加动画", GUILayout.Width(60))) { if (mTarget.nodes == null) { mTarget.nodes = new List <DoTweenNode>(); } mTarget.nodes.Add(new DoTweenNode()); } GUILayout.EndHorizontal(); if (mTarget.nodes != null) { for (int i = 0; i < mTarget.nodes.Count; ++i) { DoTweenNode node = mTarget.nodes[i]; bool isOpen = DoTweenTool.DrawHeader("anim", "anim" + i.ToString(), false, false); if (isOpen) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(Screen.width - 60); if (GUILayout.Button("x", GUILayout.Width(40))) { mTarget.nodes.RemoveAt(i); EditorGUILayout.EndHorizontal(); break; } EditorGUILayout.EndHorizontal(); GUI.changed = false; node.type = (DoTweenType)EditorGUILayout.EnumPopup("类型", node.type); node.ease = (DG.Tweening.Ease)EditorGUILayout.EnumPopup("插值类型", node.ease); node.loopType = (DG.Tweening.LoopType)EditorGUILayout.EnumPopup("循环类型", node.loopType); node.loops = EditorGUILayout.IntField("循环的次数", node.loops); node.isIndependentUpdate = EditorGUILayout.Toggle("不受时间暂停影响", node.isIndependentUpdate); node.delay = EditorGUILayout.FloatField("延迟", node.delay); node.duration = EditorGUILayout.FloatField("时间", node.duration); node.completer = (GameObject)EditorGUILayout.ObjectField("完成回调者", node.completer, typeof(GameObject), true); node.completeFun = EditorGUILayout.TextField(" 回调函数", node.completeFun); switch (node.type) { case DoTweenType.Position: { node.isLocal = EditorGUILayout.Toggle("局部坐标", node.isLocal); DoTweenTool.DrawVector3(node); break; } case DoTweenType.Scale: { DoTweenTool.DrawVector3(node); break; } case DoTweenType.Rotation: { node.isLocal = EditorGUILayout.Toggle("局部坐标", node.isLocal); DoTweenTool.DrawVector3(node); break; } case DoTweenType.Color: { DoTweenTool.DrawColor(node); break; } case DoTweenType.Alpha: { node.isInfluenceChild = EditorGUILayout.Toggle("影响子节点", node.isInfluenceChild); DoTweenTool.DrawFloat(node); break; } case DoTweenType.Material: { DoTweenTool.DrawFloat(node); break; } } if (GUI.changed) { EditorUtility.SetDirty(mTarget); } } } } }
//static public void DrawVector3(DoTweenNode node) //{ // node.fPositon = EditorGUILayout.Vector3Field("开始值", node.fPositon); // node.tPositon = EditorGUILayout.Vector3Field("结束值", node.tPositon); //} static public void DrawColor(DoTweenNode node) { node.fColor = EditorGUILayout.ColorField("开始值", node.fColor); node.tColor = EditorGUILayout.ColorField("结束值", node.tColor); }
static public void DrawFloat(DoTweenNode node) { node.fFloat = EditorGUILayout.FloatField("开始值", node.fFloat); node.tFloat = EditorGUILayout.FloatField("结束值", node.tFloat); }