Ver.0.3.0.33
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream.Kit
|
||||
{
|
||||
public class RepeatTrack : MonoBehaviour
|
||||
{
|
||||
public Sprite sprite;
|
||||
public float width;
|
||||
public float moveSpeed;
|
||||
|
||||
private SpriteRenderer _renderer1;
|
||||
private SpriteRenderer _renderer2;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
_renderer1 = GeneNewRenderer();
|
||||
_renderer1.transform.localPosition = Vector3.zero;
|
||||
}
|
||||
|
||||
private SpriteRenderer GeneNewRenderer()
|
||||
{
|
||||
var newRenderer = new GameObject().AddComponent<SpriteRenderer>();
|
||||
newRenderer.sprite = sprite;
|
||||
newRenderer.transform.SetParent(transform);
|
||||
newRenderer.sortingOrder = 5;
|
||||
newRenderer.sortingLayerName = "FixMiddle";
|
||||
newRenderer.maskInteraction = SpriteMaskInteraction.VisibleInsideMask;
|
||||
|
||||
return newRenderer;
|
||||
}
|
||||
|
||||
public void Update()
|
||||
{
|
||||
// Debug.Log("render" + _renderer1);
|
||||
// Debug.Log("bounds" + _renderer1.bounds);
|
||||
// Debug.Log("size" + _renderer1.bounds.size);
|
||||
var spriteWidth = _renderer1.bounds.size.x;
|
||||
if (-_renderer1.transform.localPosition.x + width > spriteWidth && !_renderer2)
|
||||
{
|
||||
// 可以新建下一个了
|
||||
_renderer2 = GeneNewRenderer();
|
||||
_renderer2.transform.localPosition = new Vector3(width, 0, 0);
|
||||
}
|
||||
|
||||
if (-_renderer1.transform.localPosition.x > spriteWidth)
|
||||
{
|
||||
Destroy(_renderer1.gameObject);
|
||||
_renderer1 = _renderer2;
|
||||
_renderer2 = null;
|
||||
}
|
||||
|
||||
_renderer1.transform.localPosition =
|
||||
new Vector3(_renderer1.transform.localPosition.x + moveSpeed * Time.deltaTime, 0, 0);
|
||||
if (_renderer2)
|
||||
{
|
||||
_renderer2.transform.localPosition =
|
||||
new Vector3(_renderer2.transform.localPosition.x + moveSpeed * Time.deltaTime, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1f3b807c39d1418293491f15d9f6326b
|
||||
timeCreated: 1747141530
|
||||
@@ -0,0 +1,88 @@
|
||||
using System;
|
||||
using AibisDream.Kit;
|
||||
using AibisDream.Utility;
|
||||
using DG.Tweening;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream.Kit
|
||||
{
|
||||
public class SpriteDeepIn : MonoBehaviour
|
||||
{
|
||||
private const int TopLayer = 20;
|
||||
private const int BottomLayer = 19;
|
||||
private const string LayerName = "FixMiddle";
|
||||
|
||||
public Sprite[] spriteArr;
|
||||
|
||||
public float duration;
|
||||
|
||||
public event Action OnFinished;
|
||||
|
||||
private SpriteRenderer _renderer1;
|
||||
private SpriteRenderer _renderer2;
|
||||
|
||||
private float _curProgress;
|
||||
private int _curIndex;
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.K))
|
||||
{
|
||||
Play();
|
||||
}
|
||||
}
|
||||
|
||||
public void Play()
|
||||
{
|
||||
_renderer2 = transform.Find("Renderer1").GetComponent<SpriteRenderer>();
|
||||
PlayNext();
|
||||
}
|
||||
|
||||
private void PlayNext()
|
||||
{
|
||||
_curIndex++;
|
||||
// 所有图片播放完毕则退出
|
||||
if (_curIndex >= spriteArr.Length)
|
||||
{
|
||||
OnFinished?.Invoke();
|
||||
return;
|
||||
}
|
||||
// 播放下一个图片
|
||||
InitNewSprite(_curIndex);
|
||||
// 缩放
|
||||
_curProgress = 0.01f;
|
||||
DOTween.To(() => _curProgress, value => _curProgress = value, 1, duration)
|
||||
.SetEase(Ease.InQuad)
|
||||
.OnUpdate(UpdateSprite)
|
||||
.OnComplete(PlayNext);
|
||||
}
|
||||
|
||||
private void InitNewSprite(int index)
|
||||
{
|
||||
if (_renderer1)
|
||||
{
|
||||
Destroy(_renderer1.gameObject);
|
||||
}
|
||||
|
||||
_renderer1 = _renderer2;
|
||||
_renderer2 = new GameObject().AddComponent<SpriteRenderer>();
|
||||
_renderer2.transform.SetParent(transform);
|
||||
// 处理层级
|
||||
_renderer1.sortingLayerName = LayerName;
|
||||
_renderer1.sortingOrder = BottomLayer;
|
||||
_renderer2.sortingLayerName = LayerName;
|
||||
_renderer2.sortingOrder = TopLayer;
|
||||
_renderer2.transform.localScale = Vector3.one * 0.01f;
|
||||
// 添加图片
|
||||
_renderer2.sprite = spriteArr[index];
|
||||
}
|
||||
|
||||
private void UpdateSprite()
|
||||
{
|
||||
// 大图片缩放
|
||||
_renderer1.transform.localScale = Vector3.one * (_curProgress * 100);
|
||||
// 小图片缩放
|
||||
_renderer2.transform.localScale = Vector3.one * _curProgress;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 885cefce8d27b9c44b433278584f254d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,74 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream.Kit
|
||||
{
|
||||
public class SpriteLooper : MonoBehaviour
|
||||
{
|
||||
private SpriteRenderer _fadeOutRenderer;
|
||||
private SpriteRenderer _fadeInRenderer;
|
||||
|
||||
public Sprite[] sprites;
|
||||
[Range(0, 1)]public float fadeRadio;
|
||||
|
||||
public float CurProgress { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
InitRefs();
|
||||
}
|
||||
|
||||
private void InitRefs()
|
||||
{
|
||||
_fadeOutRenderer = transform.Find("Sprite1").GetComponent<SpriteRenderer>();
|
||||
_fadeInRenderer = transform.Find("Sprite2").GetComponent<SpriteRenderer>();
|
||||
}
|
||||
|
||||
public void Init()
|
||||
{
|
||||
CurProgress = 0;
|
||||
// 激活初始状态
|
||||
_fadeOutRenderer.sprite = sprites[0];
|
||||
_fadeOutRenderer.color = Color.white;
|
||||
_fadeInRenderer.sprite = sprites[1];
|
||||
_fadeInRenderer.color = Color.clear;
|
||||
}
|
||||
|
||||
public void SetLoopProgress(float progress)
|
||||
{
|
||||
CurProgress = progress;
|
||||
|
||||
// 将进度条转为图片序号和淡出进度
|
||||
var calculator = new LoopDataCalculator(progress, sprites.Length, fadeRadio);
|
||||
|
||||
_fadeOutRenderer.sprite = sprites[calculator.CurIdx];
|
||||
_fadeOutRenderer.color = calculator.FadeOutColor;
|
||||
_fadeInRenderer.sprite = sprites[calculator.NextIdx];
|
||||
_fadeInRenderer.color = calculator.FadeInColor;
|
||||
}
|
||||
}
|
||||
|
||||
public readonly struct LoopDataCalculator
|
||||
{
|
||||
private readonly float _progress;
|
||||
private readonly float _localProgress;
|
||||
private readonly float _fadeRadio;
|
||||
public int CurIdx { get; }
|
||||
public int NextIdx { get; }
|
||||
|
||||
public LoopDataCalculator(float progress, int spriteCount, float fadeRadio)
|
||||
{
|
||||
_progress = progress;
|
||||
_localProgress = 1 / (float)spriteCount;
|
||||
_fadeRadio = fadeRadio;
|
||||
CurIdx = Mathf.FloorToInt(progress / _localProgress);
|
||||
NextIdx = CurIdx + 1 >= spriteCount ? 0 : CurIdx + 1;
|
||||
}
|
||||
|
||||
private float LeftProgress =>
|
||||
Mathf.Clamp01((_progress - (CurIdx + 1 - _fadeRadio) * _localProgress) / (_localProgress * _fadeRadio));
|
||||
|
||||
public Color FadeOutColor => new(1f, 1f, 1f, 1 - LeftProgress);
|
||||
|
||||
public Color FadeInColor => new(1f, 1f, 1f, LeftProgress);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 46b06a7e067e04142a7715ae3571abde
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user