434 lines
14 KiB
C#
434 lines
14 KiB
C#
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
using DG.Tweening;
|
|||
|
using System;
|
|||
|
using UnityEngine.UI;
|
|||
|
using Sirenix.OdinInspector;
|
|||
|
|
|||
|
public enum ChangeType
|
|||
|
{
|
|||
|
Move,
|
|||
|
LocalMove,
|
|||
|
EulerAngles,
|
|||
|
LocalEulerAngles,
|
|||
|
Scale,
|
|||
|
Shake,
|
|||
|
Fade,
|
|||
|
Color,
|
|||
|
FadeChild,
|
|||
|
}
|
|||
|
|
|||
|
public enum SequeueType
|
|||
|
{
|
|||
|
Append, //在上一个tween之后播
|
|||
|
Insert //跟上一个tween一起播
|
|||
|
}
|
|||
|
|
|||
|
[Serializable]
|
|||
|
public class ChangeTween
|
|||
|
{
|
|||
|
public Vector3 initV3;
|
|||
|
public float initFloat;
|
|||
|
public bool isInit = true; //为true则在最开始设置,作为初始值,否则在动画序列播放前设置
|
|||
|
public Vector3 changeV3;
|
|||
|
public float changeFloat;
|
|||
|
public float duration;
|
|||
|
public float delay;
|
|||
|
public Ease curveType = Ease.Linear;
|
|||
|
public ChangeType changeType = ChangeType.Move;
|
|||
|
public SequeueType sequeueType = SequeueType.Append;
|
|||
|
public int loop;
|
|||
|
public LoopType loopType;
|
|||
|
public Transform targetObj;
|
|||
|
}
|
|||
|
|
|||
|
public class PlayFlyAnim : MonoBehaviour
|
|||
|
{
|
|||
|
public ChangeTween[] tweenSequeue;
|
|||
|
public bool isPlayAudio = true;//是否播放声音
|
|||
|
public bool isHaveCloseBtn = false;
|
|||
|
public bool isPlayOnOpen = true; //是否在打开时自动播放
|
|||
|
|
|||
|
private Sequence mySeque;
|
|||
|
private Action hideCallback;//隐藏回调
|
|||
|
private Action playAnimOverCallBack;
|
|||
|
private float org_z;
|
|||
|
private bool mousedown = true;
|
|||
|
private bool isrotate = false;
|
|||
|
|
|||
|
|
|||
|
public void PlayAnim(bool playVoice = true, Action _action = null)
|
|||
|
{
|
|||
|
if (mySeque != null)
|
|||
|
{
|
|||
|
mySeque.Kill();
|
|||
|
}
|
|||
|
if (transform == null || tweenSequeue == null) return;
|
|||
|
//AddOrRemoveMask(true);
|
|||
|
//rectTrans.anchoredPosition3D = initPos;
|
|||
|
mySeque = DOTween.Sequence();
|
|||
|
|
|||
|
Tween[] tweens;
|
|||
|
for(int i = 0; i < tweenSequeue.Length; i++)
|
|||
|
{
|
|||
|
Tween t = GetTween(transform, tweenSequeue[i], out tweens);
|
|||
|
if (t != null)
|
|||
|
{
|
|||
|
switch (tweenSequeue[i].sequeueType)
|
|||
|
{
|
|||
|
case SequeueType.Append:
|
|||
|
mySeque.Append(t);
|
|||
|
|
|||
|
break;
|
|||
|
case SequeueType.Insert:
|
|||
|
mySeque.Join(t);
|
|||
|
break;
|
|||
|
}
|
|||
|
if (tweens != null)
|
|||
|
{
|
|||
|
for(int j = 0; j < tweens.Length; j++)
|
|||
|
{
|
|||
|
mySeque.Join(tweens[j]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
playAnimOverCallBack = _action;
|
|||
|
if (playVoice && isPlayAudio)
|
|||
|
{
|
|||
|
//AudioManager.Instance.PlayVoice(AudioManager.Audio_Panel_Animation);
|
|||
|
}
|
|||
|
|
|||
|
mySeque.OnComplete(()=>
|
|||
|
{
|
|||
|
//AddOrRemoveMask(false);
|
|||
|
if (playAnimOverCallBack != null)
|
|||
|
{
|
|||
|
playAnimOverCallBack();
|
|||
|
}
|
|||
|
});
|
|||
|
mousedown = true;
|
|||
|
mySeque.SetAutoKill(false);
|
|||
|
}
|
|||
|
|
|||
|
//动画反播
|
|||
|
public void PlayHideAnim(Action _func=null)
|
|||
|
{
|
|||
|
if (transform == null || tweenSequeue == null) return;
|
|||
|
AddOrRemoveMask(true);
|
|||
|
mousedown = true;
|
|||
|
hideCallback = _func;
|
|||
|
|
|||
|
mySeque.OnStepComplete(() =>
|
|||
|
{
|
|||
|
AddOrRemoveMask(false);
|
|||
|
if (hideCallback != null)
|
|||
|
{
|
|||
|
hideCallback();
|
|||
|
}
|
|||
|
// mySeque.SetAutoKill();
|
|||
|
});
|
|||
|
mySeque.PlayBackwards();
|
|||
|
}
|
|||
|
|
|||
|
private static Tween GetTween(Transform transform, ChangeTween changeTween, out Tween[] tweens)
|
|||
|
{
|
|||
|
tweens = null;
|
|||
|
Tween t = null;
|
|||
|
Transform target = changeTween.targetObj == null ? transform : changeTween.targetObj;
|
|||
|
|
|||
|
switch (changeTween.changeType)
|
|||
|
{
|
|||
|
case ChangeType.Move:
|
|||
|
if(target is RectTransform)
|
|||
|
{
|
|||
|
RectTransform rectTransform = target as RectTransform;
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
rectTransform.anchoredPosition3D = changeTween.initV3;
|
|||
|
}
|
|||
|
t = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
rectTransform.anchoredPosition3D = changeTween.initV3;
|
|||
|
}
|
|||
|
return rectTransform.anchoredPosition3D;
|
|||
|
}, v3 => rectTransform.anchoredPosition = v3, changeTween.changeV3, changeTween.duration);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
target.position = changeTween.initV3;
|
|||
|
}
|
|||
|
t = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
target.position = changeTween.initV3;
|
|||
|
}
|
|||
|
return target.position;
|
|||
|
}, v3 => target.position = v3, changeTween.changeV3, changeTween.duration);
|
|||
|
}
|
|||
|
break;
|
|||
|
case ChangeType.LocalMove:
|
|||
|
if (target is RectTransform)
|
|||
|
{
|
|||
|
RectTransform rectTransform = target as RectTransform;
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
rectTransform.anchoredPosition3D = changeTween.initV3;
|
|||
|
}
|
|||
|
t = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
rectTransform.anchoredPosition3D = changeTween.initV3;
|
|||
|
}
|
|||
|
return rectTransform.anchoredPosition3D;
|
|||
|
}, v3 => rectTransform.anchoredPosition = v3, changeTween.changeV3, changeTween.duration);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
target.localPosition = changeTween.initV3;
|
|||
|
}
|
|||
|
t = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
target.localPosition = changeTween.initV3;
|
|||
|
}
|
|||
|
return target.localPosition;
|
|||
|
}, v3 => target.localPosition = v3, changeTween.changeV3, changeTween.duration);
|
|||
|
}
|
|||
|
break;
|
|||
|
case ChangeType.EulerAngles:
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
target.eulerAngles = changeTween.initV3;
|
|||
|
}
|
|||
|
t = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
target.eulerAngles = changeTween.initV3;
|
|||
|
}
|
|||
|
return target.eulerAngles;
|
|||
|
}, v3 => target.eulerAngles = v3, changeTween.changeV3, changeTween.duration);
|
|||
|
break;
|
|||
|
case ChangeType.LocalEulerAngles:
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
target.localEulerAngles = changeTween.initV3;
|
|||
|
}
|
|||
|
t = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
target.localEulerAngles = changeTween.initV3;
|
|||
|
}
|
|||
|
return target.localEulerAngles;
|
|||
|
}, v3 => target.localEulerAngles = v3, changeTween.changeV3, changeTween.duration);
|
|||
|
break;
|
|||
|
case ChangeType.Scale:
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
target.localScale = changeTween.initV3;
|
|||
|
}
|
|||
|
t = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
target.localScale = changeTween.initV3;
|
|||
|
}
|
|||
|
return target.localScale;
|
|||
|
}, v3 => target.localScale = v3, changeTween.changeV3, changeTween.duration);
|
|||
|
break;
|
|||
|
case ChangeType.Shake:
|
|||
|
if(target is RectTransform)
|
|||
|
{
|
|||
|
RectTransform rectTransform = target as RectTransform;
|
|||
|
t = rectTransform.DOShakeAnchorPos(changeTween.duration, changeTween.changeV3.x, (int)changeTween.changeV3.y, changeTween.changeV3.z);
|
|||
|
}
|
|||
|
break;
|
|||
|
case ChangeType.Fade:
|
|||
|
var image = target.GetComponent<MaskableGraphic>();
|
|||
|
if (image != null)
|
|||
|
{
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
Color oldColor = image.color;
|
|||
|
oldColor.a = changeTween.initFloat;
|
|||
|
image.color = oldColor;
|
|||
|
}
|
|||
|
t = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
Color oldColor = image.color;
|
|||
|
oldColor.a = changeTween.initFloat;
|
|||
|
image.color = oldColor;
|
|||
|
}
|
|||
|
return image.color.a;
|
|||
|
}, a => {
|
|||
|
Color oldColor = image.color;
|
|||
|
oldColor.a = a;
|
|||
|
image.color = oldColor;
|
|||
|
}, changeTween.changeFloat, changeTween.duration);
|
|||
|
}
|
|||
|
break;
|
|||
|
case ChangeType.Color:
|
|||
|
break;
|
|||
|
case ChangeType.FadeChild:
|
|||
|
var images = target.GetComponentsInChildren<MaskableGraphic>();
|
|||
|
if (images != null)
|
|||
|
{
|
|||
|
tweens = new Tween[images.Length];
|
|||
|
for (int i = 0; i < images.Length; i++)
|
|||
|
{
|
|||
|
var image1 = images[i];
|
|||
|
if (image1.transform != target)
|
|||
|
{
|
|||
|
if (changeTween.isInit)
|
|||
|
{
|
|||
|
Color oldColor = image1.color;
|
|||
|
oldColor.a = changeTween.initFloat;
|
|||
|
image1.color = oldColor;
|
|||
|
}
|
|||
|
tweens[i] = DOTween.To(() =>
|
|||
|
{
|
|||
|
if (!changeTween.isInit)
|
|||
|
{
|
|||
|
Color oldColor = image1.color;
|
|||
|
oldColor.a = changeTween.initFloat;
|
|||
|
image1.color = oldColor;
|
|||
|
}
|
|||
|
return image1.color.a;
|
|||
|
}, a => {
|
|||
|
Color oldColor = image1.color;
|
|||
|
oldColor.a = a;
|
|||
|
image1.color = oldColor;
|
|||
|
}, changeTween.changeFloat, changeTween.duration).SetEase(changeTween.curveType).SetDelay(changeTween.delay);
|
|||
|
if (changeTween.loop != 0)
|
|||
|
{
|
|||
|
tweens[i].SetLoops(changeTween.loop, changeTween.loopType);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
t = DOTween.To(() => 0, f => { }, 1, changeTween.duration);
|
|||
|
break;
|
|||
|
}
|
|||
|
if (t != null)
|
|||
|
{
|
|||
|
t.SetEase(changeTween.curveType);
|
|||
|
if (changeTween.delay > 0)
|
|||
|
{
|
|||
|
t.SetDelay(changeTween.delay);
|
|||
|
}
|
|||
|
if (changeTween.loop != 0)
|
|||
|
{
|
|||
|
t.SetLoops(changeTween.loop, changeTween.loopType);
|
|||
|
}
|
|||
|
}
|
|||
|
return t;
|
|||
|
}
|
|||
|
|
|||
|
[ButtonGroup("")]
|
|||
|
void EditorPlay()
|
|||
|
{
|
|||
|
PlayAnim();
|
|||
|
}
|
|||
|
|
|||
|
[ButtonGroup("")]
|
|||
|
void EditorPlayBack()
|
|||
|
{
|
|||
|
PlayHideAnim();
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 添加或者移除遮罩
|
|||
|
/// </summary>
|
|||
|
/// <param name="_add"></param>
|
|||
|
|
|||
|
public void AddOrRemoveMask(bool _add)
|
|||
|
{
|
|||
|
//if (_add)
|
|||
|
//{
|
|||
|
// if (animMask == null)
|
|||
|
// {
|
|||
|
// animMask = new UIMgr.AnimMaskTimeDel();
|
|||
|
// }
|
|||
|
// animMask.AddMask();
|
|||
|
//}
|
|||
|
//else
|
|||
|
//{
|
|||
|
// if (animMask != null)
|
|||
|
// {
|
|||
|
// animMask.RemoveMask();
|
|||
|
// }
|
|||
|
//}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 播放隐藏动画最后一帧
|
|||
|
/// </summary>
|
|||
|
public void Reset()
|
|||
|
{
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 播放动画最后一帧
|
|||
|
/// </summary>
|
|||
|
public void LastFrame()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void Start()
|
|||
|
{
|
|||
|
GameObject go = GameObject.Find("App");
|
|||
|
if(go == null) //非游戏环境时运行
|
|||
|
{
|
|||
|
PlayAnim();
|
|||
|
}
|
|||
|
//PlayAnim();
|
|||
|
//if (isHaveCloseBtn)
|
|||
|
//{
|
|||
|
//}
|
|||
|
}
|
|||
|
void FixedUpdate()
|
|||
|
{
|
|||
|
if (transform != null)
|
|||
|
{
|
|||
|
if (mousedown)
|
|||
|
{
|
|||
|
if ((transform.eulerAngles.z - org_z) < 260)
|
|||
|
{
|
|||
|
//objRotate.Rotate(0, 0, Time.deltaTime * 90 * 5, Space.World);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//isrotate = true; //已被旋转, 下次打开就回到原来位置.
|
|||
|
mousedown = false; //停止
|
|||
|
}
|
|||
|
//else
|
|||
|
//{
|
|||
|
// if (objRotate.transform.eulerAngles.z <= 360 && (objRotate.transform.eulerAngles.z - org_z) >= 0.001)
|
|||
|
// {
|
|||
|
// objRotate.transform.Rotate(0, 0, Time.fixedDeltaTime * 90 * 2, Space.World);//复位
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// isrotate = false; //旋转复原
|
|||
|
// mousedown = false; //关闭停止
|
|||
|
// }
|
|||
|
//}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|