|
@@ -8,9 +8,12 @@
|
|
* AnimePlayer.cs 动画播放器-挂载类
|
|
* AnimePlayer.cs 动画播放器-挂载类
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
+using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine;
|
|
-using UnityEngine.UI;
|
|
+using UnityEngine.EventSystems;
|
|
|
|
+using UnityEngine.UIElements;
|
|
|
|
+using Image = UnityEngine.UI.Image;
|
|
|
|
|
|
namespace CrossgateToolkit
|
|
namespace CrossgateToolkit
|
|
{
|
|
{
|
|
@@ -22,9 +25,15 @@ namespace CrossgateToolkit
|
|
|
|
|
|
|
|
|
|
public delegate void AnimeAudioListener(int audioIndex);
|
|
public delegate void AnimeAudioListener(int audioIndex);
|
|
-
|
|
+
|
|
|
|
+ public enum MouseType
|
|
|
|
+ {
|
|
|
|
+ Enter,
|
|
|
|
+ Exit,
|
|
|
|
+ Click
|
|
|
|
+ }
|
|
|
|
|
|
- public delegate void MouseListener(AnimePlayer animePlayer);
|
|
+ public delegate void MouseListener(MouseType mouseType);
|
|
|
|
|
|
|
|
|
|
* 动画播放器,用于播放CG动画,支持多动画队列播放
|
|
* 动画播放器,用于播放CG动画,支持多动画队列播放
|
|
@@ -36,7 +45,7 @@ namespace CrossgateToolkit
|
|
* 目前已知的动作帧有:
|
|
* 目前已知的动作帧有:
|
|
* 击中 伤害结算
|
|
* 击中 伤害结算
|
|
*/
|
|
*/
|
|
- public class AnimePlayer : MonoBehaviour
|
|
+ public class AnimePlayer : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler,IPointerClickHandler
|
|
{
|
|
{
|
|
|
|
|
|
private class AnimeFrame
|
|
private class AnimeFrame
|
|
@@ -61,11 +70,14 @@ namespace CrossgateToolkit
|
|
public AnimeEffectListener onEffectListener;
|
|
public AnimeEffectListener onEffectListener;
|
|
public int CurrentFrame = 0;
|
|
public int CurrentFrame = 0;
|
|
public bool KeepFrame = false;
|
|
public bool KeepFrame = false;
|
|
|
|
+ public bool _effectOverCalled = false;
|
|
|
|
+ public bool _finishedCalled = false;
|
|
|
|
+ public bool _keepCallback = false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
private uint _currentSerial;
|
|
private uint _currentSerial;
|
|
- private AnimeOption _currentAnime;
|
|
+ private AnimeOption _currentAnime = null;
|
|
private AnimeFrame[] _frames;
|
|
private AnimeFrame[] _frames;
|
|
|
|
|
|
|
|
|
|
@@ -89,7 +101,7 @@ namespace CrossgateToolkit
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- private readonly List<AnimeOption> _animeQueue = new List<AnimeOption>();
|
|
+ private readonly List<AnimeOption> _animeQueue = new List<AnimeOption>(10);
|
|
|
|
|
|
|
|
|
|
private float _timer;
|
|
private float _timer;
|
|
@@ -99,7 +111,10 @@ namespace CrossgateToolkit
|
|
|
|
|
|
[SerializeField,Header("Image渲染")] public bool isRenderByImage = false;
|
|
[SerializeField,Header("Image渲染")] public bool isRenderByImage = false;
|
|
[SerializeField,Header("序列帧合批")] public bool isFrameBatch = false;
|
|
[SerializeField,Header("序列帧合批")] public bool isFrameBatch = false;
|
|
|
|
+ [SerializeField, Header("合批压缩")] public bool isBatchCompress;
|
|
[SerializeField,Header("线性过滤")] public bool isLinearFilter = false;
|
|
[SerializeField,Header("线性过滤")] public bool isLinearFilter = false;
|
|
|
|
+ [SerializeField,Header("PPU100模式")] public bool isPPU100 = false;
|
|
|
|
+
|
|
[Header("序列帧Texture")] public Texture2D frameTexture;
|
|
[Header("序列帧Texture")] public Texture2D frameTexture;
|
|
|
|
|
|
private SpriteRenderer _spriteRenderer;
|
|
private SpriteRenderer _spriteRenderer;
|
|
@@ -112,7 +127,10 @@ namespace CrossgateToolkit
|
|
set
|
|
set
|
|
{
|
|
{
|
|
_paletIndex = value;
|
|
_paletIndex = value;
|
|
- if (_currentAnime != null) _play(_currentAnime);
|
|
+ if (_currentAnime != null && value != _paletIndex)
|
|
|
|
+ {
|
|
|
|
+ _play();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -122,10 +140,8 @@ namespace CrossgateToolkit
|
|
|
|
|
|
|
|
|
|
public AnimeAudioListener onAudioListener;
|
|
public AnimeAudioListener onAudioListener;
|
|
-
|
|
+
|
|
- public MouseListener onMouseEnterListener;
|
|
+ public MouseListener onMouseListener;
|
|
-
|
|
|
|
- public MouseListener onMouseExitListener;
|
|
|
|
|
|
|
|
|
|
|
|
public Vector2 offset
|
|
public Vector2 offset
|
|
@@ -158,18 +174,18 @@ namespace CrossgateToolkit
|
|
_updateRenderMode();
|
|
_updateRenderMode();
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
+ private void OnDisable()
|
|
- private void OnMouseEnter()
|
|
|
|
{
|
|
{
|
|
- onMouseEnterListener?.Invoke(this);
|
|
+
|
|
|
|
+
|
|
|
|
+ Pause();
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
+ private void OnEnable()
|
|
- private void OnMouseExit()
|
|
|
|
{
|
|
{
|
|
- onMouseExitListener?.Invoke(this);
|
|
+ if(_currentAnime!=null) Resume();
|
|
}
|
|
}
|
|
-
|
|
+
|
|
|
|
|
|
public bool RenderByImage
|
|
public bool RenderByImage
|
|
{
|
|
{
|
|
@@ -228,6 +244,8 @@ namespace CrossgateToolkit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ public AnimeCallback OnCycleCallback;
|
|
|
|
|
|
|
|
|
|
private void _updateRenderMode()
|
|
private void _updateRenderMode()
|
|
@@ -257,49 +275,57 @@ namespace CrossgateToolkit
|
|
|
|
|
|
public AnimePlayer play(uint serial, Anime.DirectionType Direction = Anime.DirectionType.North,
|
|
public AnimePlayer play(uint serial, Anime.DirectionType Direction = Anime.DirectionType.North,
|
|
Anime.ActionType actionType = Anime.ActionType.Idle, Anime.PlayType playType = Anime.PlayType.Once,
|
|
Anime.ActionType actionType = Anime.ActionType.Idle, Anime.PlayType playType = Anime.PlayType.Once,
|
|
- float Speed = 1f,AnimeEffectListener onEffectListener = null,AnimeCallback onFinishCallback = null)
|
|
+ float Speed = 1f,AnimeEffectListener onEffectListener = null,AnimeCallback onFinishCallback = null,bool keepCallback = false)
|
|
{
|
|
{
|
|
- AnimeOption animeOption = CreateAnimeOption(serial, Direction, actionType, playType, Speed,onEffectListener, onFinishCallback);
|
|
+ AnimeOption animeOption = CreateAnimeOption(serial, Direction, actionType, playType, Speed,onEffectListener, onFinishCallback,keepCallback);
|
|
if (animeOption == null)
|
|
if (animeOption == null)
|
|
{
|
|
{
|
|
onFinishCallback?.Invoke(actionType);
|
|
onFinishCallback?.Invoke(actionType);
|
|
|
|
|
|
return this;
|
|
return this;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (_currentAnime!=null && _currentAnime._keepCallback && isPlayable)
|
|
|
|
+ {
|
|
|
|
+ Pause();
|
|
|
|
+ if(!_currentAnime._effectOverCalled) _currentAnime.onEffectListener?.Invoke(Anime.EffectType.HitOver);
|
|
|
|
+ if(!_currentAnime._finishedCalled) _currentAnime.onFinishCallback?.Invoke(_currentAnime.actionType);
|
|
|
|
+ }
|
|
|
|
|
|
_animeQueue.Clear();
|
|
_animeQueue.Clear();
|
|
_animeQueue.Add(animeOption);
|
|
_animeQueue.Add(animeOption);
|
|
- _play(animeOption);
|
|
+ _currentAnime = null;
|
|
|
|
+ _play();
|
|
|
|
|
|
|
|
|
|
return this;
|
|
return this;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- public AnimePlayer play(uint serial, Anime.PlayType playType, float speed = 1f,AnimeEffectListener onEffectListener = null,AnimeCallback onFinishCallback = null)
|
|
+ public AnimePlayer play(uint serial, Anime.PlayType playType, float speed = 1f,AnimeEffectListener onEffectListener = null,AnimeCallback onFinishCallback = null,bool keepCallback = false)
|
|
{
|
|
{
|
|
- return play(serial,Anime.DirectionType.North,Anime.ActionType.Idle,playType,speed,onEffectListener,onFinishCallback);
|
|
+ return play(serial,Anime.DirectionType.North,Anime.ActionType.Idle,playType,speed,onEffectListener,onFinishCallback,keepCallback);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- public AnimePlayer play(Anime.DirectionType directionType,Anime.ActionType actionType,Anime.PlayType playType,float Speed=1f,AnimeEffectListener onEffectListener=null,AnimeCallback onFinishCallback=null)
|
|
+ public AnimePlayer play(Anime.DirectionType directionType,Anime.ActionType actionType,Anime.PlayType playType,float Speed=1f,AnimeEffectListener onEffectListener=null,AnimeCallback onFinishCallback=null,bool keepCallback = false)
|
|
{
|
|
{
|
|
return play(_currentSerial, directionType, actionType, playType,
|
|
return play(_currentSerial, directionType, actionType, playType,
|
|
- Speed,onEffectListener, onFinishCallback);
|
|
+ Speed,onEffectListener, onFinishCallback,keepCallback);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- public AnimePlayer playOnce(Anime.DirectionType directionType,Anime.ActionType actionType,float Speed=1f,AnimeEffectListener onEffectListener=null,AnimeCallback onFinishCallback=null)
|
|
+ public AnimePlayer playOnce(Anime.DirectionType directionType,Anime.ActionType actionType,float Speed=1f,AnimeEffectListener onEffectListener=null,AnimeCallback onFinishCallback=null,bool keepCallback = false)
|
|
{
|
|
{
|
|
return play(_currentSerial, directionType, actionType, Anime.PlayType.Once,
|
|
return play(_currentSerial, directionType, actionType, Anime.PlayType.Once,
|
|
- Speed, onEffectListener,onFinishCallback);
|
|
+ Speed, onEffectListener,onFinishCallback,keepCallback);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- public AnimePlayer playLoop(Anime.DirectionType directionType,Anime.ActionType actionType,float Speed=1f,AnimeEffectListener onEffectListener=null,AnimeCallback onFinishCallback=null)
|
|
+ public AnimePlayer playLoop(Anime.DirectionType directionType,Anime.ActionType actionType,float Speed=1f,AnimeEffectListener onEffectListener=null,AnimeCallback onFinishCallback=null,bool keepCallback = false)
|
|
{
|
|
{
|
|
return play(_currentSerial, directionType, actionType, Anime.PlayType.Loop,
|
|
return play(_currentSerial, directionType, actionType, Anime.PlayType.Loop,
|
|
- Speed, onEffectListener,onFinishCallback);
|
|
+ Speed, onEffectListener,onFinishCallback,keepCallback);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -308,9 +334,15 @@ namespace CrossgateToolkit
|
|
if (directionType == _currentAnime.Direction || directionType == Anime.DirectionType.NULL) return;
|
|
if (directionType == _currentAnime.Direction || directionType == Anime.DirectionType.NULL) return;
|
|
|
|
|
|
|
|
|
|
|
|
+ AnimeOption animeOption = CreateAnimeOption(_currentAnime.AnimeSerial, directionType, _currentAnime.actionType,
|
|
|
|
+ _currentAnime.playType, _currentAnime.Speed);
|
|
_currentAnime = CreateAnimeOption(_currentAnime.AnimeSerial, directionType, _currentAnime.actionType,
|
|
_currentAnime = CreateAnimeOption(_currentAnime.AnimeSerial, directionType, _currentAnime.actionType,
|
|
_currentAnime.playType, _currentAnime.Speed);
|
|
_currentAnime.playType, _currentAnime.Speed);
|
|
- _play(_currentAnime);
|
|
+ if (animeOption == null) return;
|
|
|
|
+ _currentAnime = animeOption;
|
|
|
|
+ if(_animeQueue.Count>0) _animeQueue[0] = _currentAnime;
|
|
|
|
+ else _animeQueue.Add(_currentAnime);
|
|
|
|
+ _play();
|
|
}
|
|
}
|
|
public Anime.DirectionType DirectionType
|
|
public Anime.DirectionType DirectionType
|
|
{
|
|
{
|
|
@@ -323,6 +355,23 @@ namespace CrossgateToolkit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ public void Rotate(bool clockwise = true)
|
|
|
|
+ {
|
|
|
|
+ if (_currentAnime == null) return;
|
|
|
|
+ int direction = (int)_currentAnime.Direction;
|
|
|
|
+ if (clockwise)
|
|
|
|
+ {
|
|
|
|
+ direction += 1;
|
|
|
|
+ if(direction>7) direction = 0;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ direction -= 1;
|
|
|
|
+ if(direction<0) direction = 7;
|
|
|
|
+ }
|
|
|
|
+ changeDirection((Anime.DirectionType)direction);
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
public void changeActionType(Anime.ActionType actionType)
|
|
public void changeActionType(Anime.ActionType actionType)
|
|
@@ -330,9 +379,13 @@ namespace CrossgateToolkit
|
|
if (actionType == _currentAnime.actionType) return;
|
|
if (actionType == _currentAnime.actionType) return;
|
|
|
|
|
|
|
|
|
|
- _currentAnime = CreateAnimeOption(_currentAnime.AnimeSerial, _currentAnime.Direction,actionType,
|
|
+ AnimeOption animeOption = CreateAnimeOption(_currentAnime.AnimeSerial, _currentAnime.Direction,actionType,
|
|
_currentAnime.playType, _currentAnime.Speed);
|
|
_currentAnime.playType, _currentAnime.Speed);
|
|
- _play(_currentAnime);
|
|
+ if (animeOption == null) return;
|
|
|
|
+ _currentAnime = animeOption;
|
|
|
|
+ if(_animeQueue.Count>0) _animeQueue[0] = _currentAnime;
|
|
|
|
+ else _animeQueue.Add(_currentAnime);
|
|
|
|
+ _play();
|
|
}
|
|
}
|
|
public Anime.ActionType ActionType
|
|
public Anime.ActionType ActionType
|
|
{
|
|
{
|
|
@@ -347,18 +400,19 @@ namespace CrossgateToolkit
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- private void _play(AnimeOption animeOption)
|
|
+ private void _play()
|
|
{
|
|
{
|
|
isPlayable = false;
|
|
isPlayable = false;
|
|
_currentAnime = null;
|
|
_currentAnime = null;
|
|
-
|
|
+
|
|
|
|
+ AnimeOption animeOption = _animeQueue[0];
|
|
|
|
|
|
|
|
|
|
AnimeFrame[] frames = new AnimeFrame[animeOption.AnimeDetail.FrameCount];
|
|
AnimeFrame[] frames = new AnimeFrame[animeOption.AnimeDetail.FrameCount];
|
|
|
|
|
|
if (isFrameBatch)
|
|
if (isFrameBatch)
|
|
{
|
|
{
|
|
- Anime.BakeAnimeFrames(animeOption.AnimeDetail, _paletIndex, isLinearFilter);
|
|
+ Anime.BakeAnimeFrames(animeOption.AnimeDetail, _paletIndex, isLinearFilter, isBatchCompress);
|
|
|
|
|
|
for (int i = 0; i < animeOption.AnimeDetail.AnimeFrameInfos.Count; i++)
|
|
for (int i = 0; i < animeOption.AnimeDetail.AnimeFrameInfos.Count; i++)
|
|
{
|
|
{
|
|
@@ -368,7 +422,9 @@ namespace CrossgateToolkit
|
|
frames[i] = new AnimeFrame();
|
|
frames[i] = new AnimeFrame();
|
|
frames[i].Index = i;
|
|
frames[i].Index = i;
|
|
frames[i].GraphicInfo = animeOption.AnimeDetail.AnimeFrameInfos[i].GraphicInfo;
|
|
frames[i].GraphicInfo = animeOption.AnimeDetail.AnimeFrameInfos[i].GraphicInfo;
|
|
- frames[i].Sprite = animeOption.AnimeDetail.AnimeFrameInfos[i].AnimeSprites[_paletIndex][isLinearFilter];
|
|
+ GraphicDetail graphicDetail =
|
|
|
|
+ animeOption.AnimeDetail.AnimeFrameInfos[i].AnimeSprites[_paletIndex][isLinearFilter];
|
|
|
|
+ frames[i].Sprite = isPPU100 ? graphicDetail.SpritePPU100 : graphicDetail.Sprite;
|
|
frames[i].AnimeFrameInfo = animeOption.AnimeDetail.AnimeFrameInfos[i];
|
|
frames[i].AnimeFrameInfo = animeOption.AnimeDetail.AnimeFrameInfos[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -387,7 +443,7 @@ namespace CrossgateToolkit
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- int subPaletIndex = 0;
|
|
+ int subPaletIndex = -1;
|
|
if (animeOption.AnimeDetail.IsHighVersion) subPaletIndex = (int)animeOption.AnimeDetail.Serial;
|
|
if (animeOption.AnimeDetail.IsHighVersion) subPaletIndex = (int)animeOption.AnimeDetail.Serial;
|
|
GraphicDetail graphicData =
|
|
GraphicDetail graphicData =
|
|
GraphicData.GetGraphicDetail(graphicInfoData, _paletIndex, subPaletIndex, isLinearFilter);
|
|
GraphicData.GetGraphicDetail(graphicInfoData, _paletIndex, subPaletIndex, isLinearFilter);
|
|
@@ -402,7 +458,7 @@ namespace CrossgateToolkit
|
|
frames[i] = new AnimeFrame();
|
|
frames[i] = new AnimeFrame();
|
|
frames[i].Index = i;
|
|
frames[i].Index = i;
|
|
frames[i].GraphicInfo = graphicInfoData;
|
|
frames[i].GraphicInfo = graphicInfoData;
|
|
- frames[i].Sprite = graphicData.Sprite;
|
|
+ frames[i].Sprite = isPPU100 ? graphicData.SpritePPU100 : graphicData.Sprite;
|
|
frames[i].AnimeFrameInfo = animeFrameInfo;
|
|
frames[i].AnimeFrameInfo = animeFrameInfo;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -425,6 +481,15 @@ namespace CrossgateToolkit
|
|
_delay = delayTime*1000;
|
|
_delay = delayTime*1000;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ public void SetSpeed(float speed)
|
|
|
|
+ {
|
|
|
|
+ if (_currentAnime == null) return;
|
|
|
|
+ _currentAnime.Speed = speed;
|
|
|
|
+ _currentAnime.FrameRate =
|
|
|
|
+ _currentAnime.AnimeDetail.CycleTime * 1f / speed / _currentAnime.AnimeDetail.FrameCount;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
public void Stop()
|
|
public void Stop()
|
|
{
|
|
{
|
|
@@ -432,6 +497,11 @@ namespace CrossgateToolkit
|
|
_currentAnime = null;
|
|
_currentAnime = null;
|
|
_frames = null;
|
|
_frames = null;
|
|
gameObject.SetActive(false);
|
|
gameObject.SetActive(false);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if(_imageRenderer!=null) _imageRenderer.sprite = null;
|
|
|
|
+ if(_spriteRenderer!=null) _spriteRenderer.sprite = null;
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -439,6 +509,13 @@ namespace CrossgateToolkit
|
|
{
|
|
{
|
|
isPlayable = false;
|
|
isPlayable = false;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public void Play()
|
|
|
|
+ {
|
|
|
|
+ if(_currentAnime!=null) isPlayable = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
public void Resume()
|
|
public void Resume()
|
|
{
|
|
{
|
|
@@ -454,14 +531,41 @@ namespace CrossgateToolkit
|
|
|
|
|
|
|
|
|
|
private AnimeOption CreateAnimeOption(uint serial, Anime.DirectionType Direction, Anime.ActionType actionType,
|
|
private AnimeOption CreateAnimeOption(uint serial, Anime.DirectionType Direction, Anime.ActionType actionType,
|
|
- Anime.PlayType playType=Anime.PlayType.Once, float Speed = 1f,AnimeEffectListener onEffectListener = null, AnimeCallback onFinishCallback = null)
|
|
+ Anime.PlayType playType=Anime.PlayType.Once, float Speed = 1f,AnimeEffectListener onEffectListener = null, AnimeCallback onFinishCallback = null,bool keepCallback = false)
|
|
{
|
|
{
|
|
AnimeDetail animeDetail = Anime.GetAnimeDetail(serial, Direction, actionType);
|
|
AnimeDetail animeDetail = Anime.GetAnimeDetail(serial, Direction, actionType);
|
|
|
|
+
|
|
if (animeDetail == null)
|
|
if (animeDetail == null)
|
|
{
|
|
{
|
|
|
|
+
|
|
|
|
+ GraphicInfoData graphicInfoData = GraphicInfo.GetGraphicInfoData(serial);
|
|
|
|
+ if (graphicInfoData != null)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ GraphicDetail graphicDetail = GraphicData.GetGraphicDetail(graphicInfoData, _paletIndex, 0, isLinearFilter);
|
|
|
|
+ if (graphicDetail != null)
|
|
|
|
+ {
|
|
|
|
+ if (isRenderByImage)
|
|
|
|
+ {
|
|
|
|
+ _imageRenderer.sprite = isPPU100 ? graphicDetail.SpritePPU100 : graphicDetail.Sprite;
|
|
|
|
+ _imageRenderer.SetNativeSize();
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ _spriteRenderer.sprite = isPPU100 ? graphicDetail.SpritePPU100 : graphicDetail.Sprite;
|
|
|
|
+ }
|
|
|
|
+ _rectTransform.sizeDelta = new Vector2(graphicDetail.Sprite.rect.width, graphicDetail.Sprite.rect.height);
|
|
|
|
+ gameObject.SetActive(true);
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
|
|
- return null;
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
AnimeOption animeOption = new AnimeOption()
|
|
AnimeOption animeOption = new AnimeOption()
|
|
{
|
|
{
|
|
AnimeSerial = serial,
|
|
AnimeSerial = serial,
|
|
@@ -469,11 +573,13 @@ namespace CrossgateToolkit
|
|
actionType = actionType,
|
|
actionType = actionType,
|
|
playType = playType,
|
|
playType = playType,
|
|
Speed = Speed,
|
|
Speed = Speed,
|
|
- FrameRate = animeDetail.CycleTime / Speed / animeDetail.FrameCount,
|
|
+ FrameRate = animeDetail.CycleTime * 1f / (float)animeDetail.FrameCount /Speed,
|
|
AnimeDetail = animeDetail,
|
|
AnimeDetail = animeDetail,
|
|
onEffectListener = onEffectListener,
|
|
onEffectListener = onEffectListener,
|
|
onFinishCallback = onFinishCallback,
|
|
onFinishCallback = onFinishCallback,
|
|
|
|
+ _keepCallback = keepCallback
|
|
};
|
|
};
|
|
|
|
+
|
|
return animeOption;
|
|
return animeOption;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -487,13 +593,10 @@ namespace CrossgateToolkit
|
|
onFinishCallback?.Invoke(actionType);
|
|
onFinishCallback?.Invoke(actionType);
|
|
return this;
|
|
return this;
|
|
}
|
|
}
|
|
- if (_animeQueue.Count == 0)
|
|
+ _animeQueue.Add(animeOption);
|
|
|
|
+ if (_animeQueue[0] == animeOption)
|
|
{
|
|
{
|
|
- _play(animeOption);
|
|
+ _play();
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- _animeQueue.Add(animeOption);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return this;
|
|
return this;
|
|
@@ -513,12 +616,15 @@ namespace CrossgateToolkit
|
|
int currentFrame = _currentAnime.CurrentFrame;
|
|
int currentFrame = _currentAnime.CurrentFrame;
|
|
|
|
|
|
|
|
|
|
- _currentAnime = CreateAnimeOption(_currentAnime.AnimeSerial, directionType, _currentAnime.actionType,
|
|
+ AnimeOption animeOption = CreateAnimeOption(_currentAnime.AnimeSerial, directionType, _currentAnime.actionType,
|
|
_currentAnime.playType, _currentAnime.Speed);
|
|
_currentAnime.playType, _currentAnime.Speed);
|
|
- _currentAnime.CurrentFrame = --currentFrame;
|
|
+ if (animeOption == null) return;
|
|
|
|
+ animeOption.CurrentFrame = --currentFrame;
|
|
|
|
|
|
- _currentAnime.KeepFrame = true;
|
|
+ animeOption.KeepFrame = true;
|
|
- _play(_currentAnime);
|
|
+ if(_animeQueue.Count>0) _animeQueue[0] = animeOption;
|
|
|
|
+ else _animeQueue.Add(animeOption);
|
|
|
|
+ _play();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -534,88 +640,98 @@ namespace CrossgateToolkit
|
|
private void UpdateFrame()
|
|
private void UpdateFrame()
|
|
{
|
|
{
|
|
_delay = 0;
|
|
_delay = 0;
|
|
|
|
+ AnimeOption playingAnime = _currentAnime;
|
|
if (!isPlayable || _frames.Length == 0) return;
|
|
if (!isPlayable || _frames.Length == 0) return;
|
|
|
|
|
|
|
|
|
|
- if (_currentAnime.CurrentFrame >= _currentAnime.AnimeDetail.FrameCount)
|
|
+ if (playingAnime.CurrentFrame >= playingAnime.AnimeDetail.FrameCount)
|
|
{
|
|
{
|
|
|
|
+ OnCycleCallback?.Invoke(playingAnime.actionType);
|
|
|
|
|
|
- if (_currentAnime.playType == Anime.PlayType.Loop)
|
|
+ if (playingAnime.playType == Anime.PlayType.Loop)
|
|
{
|
|
{
|
|
- _currentAnime.onFinishCallback?.Invoke(_currentAnime.actionType);
|
|
+ if(playingAnime==_currentAnime) playingAnime.onFinishCallback?.Invoke(playingAnime.actionType);
|
|
- _currentAnime.CurrentFrame = 0;
|
|
+ playingAnime._finishedCalled = true;
|
|
- }else if (_currentAnime.playType is Anime.PlayType.Once or Anime.PlayType.OnceAndDestroy)
|
|
+ playingAnime.CurrentFrame = 0;
|
|
|
|
+ }else if (playingAnime.playType is Anime.PlayType.Once or Anime.PlayType.OnceAndDestroy)
|
|
{
|
|
{
|
|
- _animeQueue.RemoveAt(0);
|
|
+ if (playingAnime.playType == Anime.PlayType.OnceAndDestroy)
|
|
- if (_currentAnime.playType == Anime.PlayType.OnceAndDestroy)
|
|
|
|
{
|
|
{
|
|
|
|
+ _animeQueue.Clear();
|
|
_spriteRenderer.sprite = null;
|
|
_spriteRenderer.sprite = null;
|
|
_imageRenderer.sprite = null;
|
|
_imageRenderer.sprite = null;
|
|
_rectTransform.sizeDelta = Vector2.zero;
|
|
_rectTransform.sizeDelta = Vector2.zero;
|
|
- _currentAnime.onFinishCallback?.Invoke(_currentAnime.actionType);
|
|
+ if(playingAnime==_currentAnime) playingAnime.onFinishCallback?.Invoke(playingAnime.actionType);
|
|
gameObject.SetActive(false);
|
|
gameObject.SetActive(false);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
+ if (playingAnime.KeepFrame)
|
|
- if(_animeQueue.Count>0)
|
|
|
|
{
|
|
{
|
|
- _currentAnime.onFinishCallback?.Invoke(_currentAnime.actionType);
|
|
+ if(playingAnime==_currentAnime) playingAnime.onFinishCallback?.Invoke(playingAnime.actionType);
|
|
- AnimeOption animeOption = _animeQueue[0];
|
|
+ playingAnime.CurrentFrame--;
|
|
- _play(animeOption);
|
|
+ }
|
|
- return;
|
|
+ else
|
|
- }else
|
|
|
|
{
|
|
{
|
|
- if (_currentAnime.KeepFrame)
|
|
+ _animeQueue.RemoveAt(0);
|
|
|
|
+
|
|
|
|
+ if (_animeQueue.Count > 0)
|
|
{
|
|
{
|
|
- _currentAnime.onFinishCallback?.Invoke(_currentAnime.actionType);
|
|
+ AnimeCallback callback = playingAnime.onFinishCallback;
|
|
-
|
|
+ Anime.ActionType actionType = playingAnime.actionType;
|
|
|
|
+
|
|
|
|
+ _play();
|
|
|
|
+ callback?.Invoke(actionType);
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- isPlayable = false;
|
|
+ Pause();
|
|
- _currentAnime.onFinishCallback?.Invoke(_currentAnime.actionType);
|
|
+
|
|
|
|
+ playingAnime.onFinishCallback?.Invoke(playingAnime.actionType);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- if (_currentAnime.CurrentFrame < _frames.Length && _frames[_currentAnime.CurrentFrame] == null)
|
|
+ if (playingAnime.CurrentFrame < _frames.Length && _frames[playingAnime.CurrentFrame] == null)
|
|
{
|
|
{
|
|
- _currentAnime.CurrentFrame++;
|
|
+ playingAnime.CurrentFrame++;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- float width = _frames[_currentAnime.CurrentFrame].Sprite.rect.width * 1f;
|
|
+ float width = _frames[playingAnime.CurrentFrame].Sprite.rect.width * 1f;
|
|
- float height = _frames[_currentAnime.CurrentFrame].Sprite.rect.height * 1f;
|
|
+ float height = _frames[playingAnime.CurrentFrame].Sprite.rect.height * 1f;
|
|
|
|
+ if (isPPU100)
|
|
|
|
+ {
|
|
|
|
+ width = width / 100f;
|
|
|
|
+ height = height / 100f;
|
|
|
|
+ }
|
|
|
|
|
|
Vector3 pos = Vector3.zero;
|
|
Vector3 pos = Vector3.zero;
|
|
- pos.x = _frames[_currentAnime.CurrentFrame].GraphicInfo.OffsetX;
|
|
+ pos.x = _frames[playingAnime.CurrentFrame].GraphicInfo.OffsetX;
|
|
- pos.y = -_frames[_currentAnime.CurrentFrame].GraphicInfo.OffsetY;
|
|
+ pos.y = -_frames[playingAnime.CurrentFrame].GraphicInfo.OffsetY;
|
|
|
|
|
|
if (isRenderByImage)
|
|
if (isRenderByImage)
|
|
{
|
|
{
|
|
- _imageRenderer.sprite = _frames[_currentAnime.CurrentFrame].Sprite;
|
|
+ _imageRenderer.sprite = _frames[playingAnime.CurrentFrame].Sprite;
|
|
_imageRenderer.SetNativeSize();
|
|
_imageRenderer.SetNativeSize();
|
|
- if (_currentAnime.AnimeDetail.FLAG!=null)
|
|
+ if (playingAnime.AnimeDetail.FLAG.HasFlag(AnimeFlag.REVERSE_X) || playingAnime.AnimeDetail.FLAG.HasFlag(AnimeFlag.REVERSE_Y))
|
|
{
|
|
{
|
|
- if (_currentAnime.AnimeDetail.FLAG.REVERSE_X)
|
|
+ if (playingAnime.AnimeDetail.FLAG.HasFlag(AnimeFlag.REVERSE_X))
|
|
{
|
|
{
|
|
_imageRenderer.transform.localScale = new Vector3(-1, 1, 1);
|
|
_imageRenderer.transform.localScale = new Vector3(-1, 1, 1);
|
|
pos.x = -pos.x;
|
|
pos.x = -pos.x;
|
|
}
|
|
}
|
|
|
|
|
|
- if (_currentAnime.AnimeDetail.FLAG.REVERSE_Y)
|
|
+ if (playingAnime.AnimeDetail.FLAG.HasFlag(AnimeFlag.REVERSE_Y))
|
|
{
|
|
{
|
|
_imageRenderer.transform.localScale = new Vector3(1, -1, 1);
|
|
_imageRenderer.transform.localScale = new Vector3(1, -1, 1);
|
|
pos.y = -pos.y;
|
|
pos.y = -pos.y;
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -627,20 +743,28 @@ namespace CrossgateToolkit
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- _spriteRenderer.sprite = _frames[_currentAnime.CurrentFrame].Sprite;
|
|
+ _spriteRenderer.sprite = _frames[playingAnime.CurrentFrame].Sprite;
|
|
_rectTransform.sizeDelta = new Vector2(width, height);
|
|
_rectTransform.sizeDelta = new Vector2(width, height);
|
|
_spriteRenderer.size = new Vector2(width, height);
|
|
_spriteRenderer.size = new Vector2(width, height);
|
|
_rectTransform.pivot = new Vector2(0.5f,0f);
|
|
_rectTransform.pivot = new Vector2(0.5f,0f);
|
|
- if (_currentAnime.AnimeDetail.FLAG!=null)
|
|
+
|
|
|
|
+
|
|
|
|
+ if (playingAnime.AnimeDetail.FLAG.HasFlag(AnimeFlag.REVERSE_X) || playingAnime.AnimeDetail.FLAG.HasFlag(AnimeFlag.REVERSE_Y))
|
|
{
|
|
{
|
|
- if (_currentAnime.AnimeDetail.FLAG.REVERSE_X)
|
|
+ if (playingAnime.AnimeDetail.FLAG.HasFlag(AnimeFlag.REVERSE_X))
|
|
{
|
|
{
|
|
_spriteRenderer.flipX = true;
|
|
_spriteRenderer.flipX = true;
|
|
|
|
+ }else
|
|
|
|
+ {
|
|
|
|
+ _spriteRenderer.flipX = false;
|
|
}
|
|
}
|
|
|
|
|
|
- if (_currentAnime.AnimeDetail.FLAG.REVERSE_Y)
|
|
+ if (playingAnime.AnimeDetail.FLAG.HasFlag(AnimeFlag.REVERSE_Y))
|
|
{
|
|
{
|
|
_spriteRenderer.flipY = true;
|
|
_spriteRenderer.flipY = true;
|
|
|
|
+ }else
|
|
|
|
+ {
|
|
|
|
+ _spriteRenderer.flipY = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -650,18 +774,35 @@ namespace CrossgateToolkit
|
|
}
|
|
}
|
|
_rectTransform.localPosition = Vector3.zero;
|
|
_rectTransform.localPosition = Vector3.zero;
|
|
}
|
|
}
|
|
- frameTexture = _frames[_currentAnime.CurrentFrame].Sprite.texture;
|
|
+ frameTexture = _frames[playingAnime.CurrentFrame].Sprite.texture;
|
|
|
|
|
|
_timer = Time.time * 1000;
|
|
_timer = Time.time * 1000;
|
|
|
|
|
|
|
|
|
|
- if (_frames[_currentAnime.CurrentFrame].AnimeFrameInfo.Effect > 0)
|
|
+ if (playingAnime==_currentAnime && _frames[playingAnime.CurrentFrame].AnimeFrameInfo.Effect > 0)
|
|
- _currentAnime.onEffectListener?.Invoke(_frames[_currentAnime.CurrentFrame].AnimeFrameInfo.Effect);
|
|
+ playingAnime.onEffectListener?.Invoke(_frames[playingAnime.CurrentFrame].AnimeFrameInfo.Effect);
|
|
|
|
+ if (playingAnime==_currentAnime && _frames[playingAnime.CurrentFrame].AnimeFrameInfo.Effect == Anime.EffectType.HitOver)
|
|
|
|
+ playingAnime._effectOverCalled = true;
|
|
|
|
|
|
- if (_frames[_currentAnime.CurrentFrame].AnimeFrameInfo.AudioIndex > 0)
|
|
+ if (playingAnime==_currentAnime && _frames[playingAnime.CurrentFrame].AnimeFrameInfo.AudioIndex > 0)
|
|
- onAudioListener?.Invoke(_frames[_currentAnime.CurrentFrame].AnimeFrameInfo.AudioIndex);
|
|
+ onAudioListener?.Invoke(_frames[playingAnime.CurrentFrame].AnimeFrameInfo.AudioIndex);
|
|
|
|
|
|
- _currentAnime.CurrentFrame++;
|
|
+ playingAnime.CurrentFrame++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void OnPointerEnter(PointerEventData eventData)
|
|
|
|
+ {
|
|
|
|
+ onMouseListener?.Invoke(MouseType.Enter);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void OnPointerExit(PointerEventData eventData)
|
|
|
|
+ {
|
|
|
|
+ onMouseListener?.Invoke(MouseType.Exit);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void OnPointerClick(PointerEventData eventData)
|
|
|
|
+ {
|
|
|
|
+ onMouseListener?.Invoke(MouseType.Click);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|