2025-04-22 17:16:40 +08:00

114 lines
3.1 KiB
C#

using System;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
using Object = UnityEngine.Object;
#if ODIN_INSPECTOR
using Sirenix.OdinInspector;
#endif
namespace TEngine
{
[Serializable]
public class SetSpriteObject : ISetAssetObject
{
enum SetType
{
None,
Image,
SpriteRender,
}
#if ODIN_INSPECTOR
[ShowInInspector]
#endif
private SetType _setType;
#if ODIN_INSPECTOR
[ShowInInspector]
#endif
private Image _image;
#if ODIN_INSPECTOR
[ShowInInspector]
#endif
private SpriteRenderer _spriteRenderer;
#if ODIN_INSPECTOR
[ShowInInspector]
#endif
private Sprite _sprite;
public string Location { get; private set; }
private bool _setNativeSize = false;
private CancellationToken _cancellationToken;
public void SetAsset(Object asset)
{
_sprite = (Sprite)asset;
if (_cancellationToken.IsCancellationRequested)
return;
if (_image != null)
{
_image.sprite = _sprite;
if (_setNativeSize)
{
_image.SetNativeSize();
}
}
else if (_spriteRenderer != null)
{
_spriteRenderer.sprite = _sprite;
}
}
public bool IsCanRelease()
{
if (_setType == SetType.Image)
{
return _image == null || _image.sprite == null ||
(_sprite != null && _image.sprite != _sprite);
}
else if (_setType == SetType.SpriteRender)
{
return _spriteRenderer == null || _spriteRenderer.sprite == null ||
(_sprite != null && _spriteRenderer.sprite != _sprite);
}
return true;
}
public void Clear()
{
_spriteRenderer = null;
_image = null;
Location = null;
_sprite = null;
_setType = SetType.None;
_setNativeSize = false;
}
public static SetSpriteObject Create(Image image, string location, bool setNativeSize = false, CancellationToken cancellationToken = default)
{
SetSpriteObject item = MemoryPool.Acquire<SetSpriteObject>();
item._image = image;
item._setNativeSize = setNativeSize;
item.Location = location;
item._cancellationToken = cancellationToken;
item._setType = SetType.Image;
return item;
}
public static SetSpriteObject Create(SpriteRenderer spriteRenderer, string location, CancellationToken cancellationToken = default)
{
SetSpriteObject item = MemoryPool.Acquire<SetSpriteObject>();
item._spriteRenderer = spriteRenderer;
item.Location = location;
item._cancellationToken = cancellationToken;
item._setType = SetType.SpriteRender;
return item;
}
}
}