(client) feat:实现身体贴图加载
This commit is contained in:
@ -3,142 +3,42 @@ using UnityEngine;
|
||||
|
||||
namespace Prefab
|
||||
{
|
||||
[RequireComponent(typeof(SpriteRenderer))]
|
||||
|
||||
[RequireComponent(typeof(SpriteRenderer))]
|
||||
public class ImagePrefab : MonoBehaviour
|
||||
{
|
||||
[Header("Display Settings")] [SerializeField]
|
||||
private Sprite _defaultSprite;
|
||||
public Sprite defaultSprite;
|
||||
|
||||
[SerializeField] private Color _tintColor = Color.white;
|
||||
[SerializeField, Range(0, 1)] private float _alpha = 1f;
|
||||
[SerializeField] private bool _preserveAspect = true;
|
||||
|
||||
private SpriteRenderer _renderer;
|
||||
private Vector2 _originalSize;
|
||||
private bool _isInitialized;
|
||||
|
||||
public Sprite DisplayedSprite => _renderer.sprite;
|
||||
public Color CurrentColor => _renderer.color;
|
||||
private SpriteRenderer spriteRenderer;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
InitializeRenderer();
|
||||
}
|
||||
|
||||
private void InitializeRenderer()
|
||||
{
|
||||
if (_isInitialized) return;
|
||||
|
||||
_renderer = GetComponent<SpriteRenderer>();
|
||||
|
||||
// 初始尺寸记录
|
||||
if (_defaultSprite != null)
|
||||
spriteRenderer = GetComponent<SpriteRenderer>();
|
||||
if (spriteRenderer == null)
|
||||
{
|
||||
_originalSize = new Vector2(
|
||||
_defaultSprite.rect.width / _defaultSprite.pixelsPerUnit,
|
||||
_defaultSprite.rect.height / _defaultSprite.pixelsPerUnit
|
||||
);
|
||||
Debug.LogError("SpriteRenderer组件未找到,请确保预制体包含该组件!");
|
||||
return;
|
||||
}
|
||||
|
||||
// 设置初始状态
|
||||
ApplyVisualSettings();
|
||||
_isInitialized = true;
|
||||
}
|
||||
|
||||
private void ApplyVisualSettings()
|
||||
{
|
||||
if (!_isInitialized) InitializeRenderer();
|
||||
|
||||
// 设置精灵和颜色
|
||||
_renderer.sprite = _defaultSprite;
|
||||
_renderer.color = new Color(_tintColor.r, _tintColor.g, _tintColor.b, _alpha);
|
||||
|
||||
// 保持原始纵横比
|
||||
if (_preserveAspect && _defaultSprite != null)
|
||||
if (defaultSprite != null)
|
||||
{
|
||||
MaintainAspectRatio();
|
||||
spriteRenderer.sprite = defaultSprite;
|
||||
}
|
||||
}
|
||||
|
||||
private void MaintainAspectRatio()
|
||||
{
|
||||
Vector2 currentSize = transform.lossyScale;
|
||||
float aspectRatio = _originalSize.x / _originalSize.y;
|
||||
|
||||
if (currentSize.x == 0 || currentSize.y == 0) return;
|
||||
|
||||
float currentAspect = currentSize.x / currentSize.y;
|
||||
|
||||
if (Mathf.Abs(currentAspect - aspectRatio) > 0.01f)
|
||||
{
|
||||
Vector2 newScale = currentSize;
|
||||
if (currentAspect > aspectRatio)
|
||||
{
|
||||
newScale.x = currentSize.y * aspectRatio;
|
||||
}
|
||||
else
|
||||
{
|
||||
newScale.y = currentSize.x / aspectRatio;
|
||||
}
|
||||
|
||||
transform.localScale = newScale;
|
||||
}
|
||||
}
|
||||
|
||||
// 公共控制方法
|
||||
public void SetSprite(Sprite newSprite)
|
||||
{
|
||||
_defaultSprite = newSprite;
|
||||
if (_defaultSprite != null)
|
||||
if (spriteRenderer != null && newSprite != null)
|
||||
{
|
||||
_originalSize = new Vector2(
|
||||
_defaultSprite.rect.width / _defaultSprite.pixelsPerUnit,
|
||||
_defaultSprite.rect.height / _defaultSprite.pixelsPerUnit
|
||||
);
|
||||
spriteRenderer.sprite = newSprite;
|
||||
}
|
||||
|
||||
ApplyVisualSettings();
|
||||
}
|
||||
|
||||
public void SetColor(Color newColor)
|
||||
{
|
||||
_tintColor = newColor;
|
||||
ApplyVisualSettings();
|
||||
}
|
||||
|
||||
public void SetAlpha(float newAlpha)
|
||||
{
|
||||
_alpha = Mathf.Clamp01(newAlpha);
|
||||
ApplyVisualSettings();
|
||||
}
|
||||
|
||||
public void ToggleVisibility(bool isVisible)
|
||||
{
|
||||
if (!_isInitialized) InitializeRenderer();
|
||||
_renderer.enabled = isVisible;
|
||||
}
|
||||
|
||||
public void SetSortingLayer(string layerName, int order)
|
||||
{
|
||||
if (!_isInitialized) InitializeRenderer();
|
||||
_renderer.sortingLayerName = layerName;
|
||||
_renderer.sortingOrder = order;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
private void OnValidate()
|
||||
{
|
||||
// 编辑器模式下实时预览变化
|
||||
if (UnityEditor.EditorApplication.isPlaying)
|
||||
if (spriteRenderer != null)
|
||||
{
|
||||
ApplyVisualSettings();
|
||||
}
|
||||
else if (GetComponent<SpriteRenderer>() != null)
|
||||
{
|
||||
GetComponent<SpriteRenderer>().sprite = _defaultSprite;
|
||||
GetComponent<SpriteRenderer>().color = new Color(_tintColor.r, _tintColor.g, _tintColor.b, _alpha);
|
||||
spriteRenderer.color = newColor;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user