Files
2026-02-21 16:45:37 +08:00

255 lines
5.6 KiB
C#

using System;
using UnityEngine;
using UnityEngine.UI;
namespace LapinerTools.uMyGUI
{
public class uMyGUI_TexturePicker : MonoBehaviour
{
[SerializeField]
private GameObject m_texturePrefab;
[SerializeField]
private GameObject m_selectionPrefab;
[SerializeField]
private float m_offsetStart;
[SerializeField]
private float m_offsetEnd;
[SerializeField]
private float m_padding = 4f;
[SerializeField]
private Action<int> m_buttonCallback;
private Texture2D[] m_textures = new Texture2D[0];
private RectTransform m_rectTransform;
private float m_elementSize = 1f;
private GameObject m_selectionInstance;
private GameObject[] m_instances = new GameObject[0];
public GameObject TexturePrefab
{
get
{
return m_texturePrefab;
}
set
{
m_texturePrefab = value;
}
}
public GameObject SelectionPrefab
{
get
{
return m_selectionPrefab;
}
set
{
m_selectionPrefab = value;
}
}
public float OffsetStart
{
get
{
return m_offsetStart;
}
set
{
m_offsetStart = value;
}
}
public float OffsetEnd
{
get
{
return m_offsetEnd;
}
set
{
m_offsetEnd = value;
}
}
public float Padding
{
get
{
return m_padding;
}
set
{
m_padding = value;
}
}
public Action<int> ButtonCallback
{
get
{
return m_buttonCallback;
}
set
{
m_buttonCallback = value;
}
}
public Texture2D[] Textures
{
get
{
return m_textures;
}
set
{
m_textures = value;
}
}
private RectTransform RTransform
{
get
{
return (!(m_rectTransform != null)) ? (m_rectTransform = GetComponent<RectTransform>()) : m_rectTransform;
}
}
public GameObject[] Instances
{
get
{
return m_instances;
}
}
public void SetSelection(int p_selectionIndex)
{
if (m_selectionPrefab != null)
{
if (p_selectionIndex < 0 || p_selectionIndex >= m_instances.Length)
{
UnityEngine.Object.Destroy(m_selectionInstance);
m_selectionInstance = null;
return;
}
if (m_selectionInstance == null)
{
m_selectionInstance = UnityEngine.Object.Instantiate(m_selectionPrefab);
}
else
{
RectTransform component = m_selectionInstance.GetComponent<RectTransform>();
Vector2 anchoredPosition = component.anchoredPosition;
anchoredPosition.x = m_selectionPrefab.GetComponent<RectTransform>().anchoredPosition.x;
component.anchoredPosition = anchoredPosition;
}
SetRectTransformPosition(m_selectionInstance.GetComponent<RectTransform>(), p_selectionIndex, m_elementSize);
}
else
{
Debug.LogError("uMyGUI_TexturePicker: SetSelection: you have passed a non negative selection index '" + p_selectionIndex + "', but the SelectionPrefab was not provided in the inspector or via script!");
}
}
public void SetTextures(Texture2D[] p_textures, int p_selectedIndex)
{
if (m_texturePrefab != null)
{
m_textures = p_textures;
UnityEngine.Object.Destroy(m_selectionInstance);
for (int i = 0; i < m_instances.Length; i++)
{
UnityEngine.Object.Destroy(m_instances[i]);
}
m_instances = new GameObject[p_textures.Length];
float num = 0f;
for (int j = 0; j < p_textures.Length; j++)
{
m_instances[j] = UnityEngine.Object.Instantiate(m_texturePrefab);
RectTransform component = m_instances[j].GetComponent<RectTransform>();
m_elementSize = component.rect.width;
SetRectTransformPosition(component, j, m_elementSize);
RawImage rawImage = TryFindComponent<RawImage>(m_instances[j]);
if (rawImage != null)
{
rawImage.texture = p_textures[j];
}
else
{
Debug.LogError("uMyGUI_TexturePicker: SetTextures: TexturePrefab must have a RawImage component attached (can be in children).");
}
if (m_buttonCallback != null)
{
Button button = TryFindComponent<Button>(m_instances[j]);
if (button != null)
{
int indexCopy = j;
button.onClick.AddListener(delegate
{
m_buttonCallback(indexCopy);
});
}
}
num = component.anchoredPosition.x + m_elementSize;
if (j == p_selectedIndex)
{
if (m_selectionPrefab != null)
{
m_selectionInstance = UnityEngine.Object.Instantiate(m_selectionPrefab);
SetRectTransformPosition(m_selectionInstance.GetComponent<RectTransform>(), j, m_elementSize);
}
else
{
Debug.LogError("uMyGUI_TexturePicker: SetTextures: you have passed a non negative selection index '" + p_selectedIndex + "', but the SelectionPrefab was not provided in the inspector or via script!");
}
}
}
RTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, num - RTransform.rect.xMin + m_offsetEnd);
}
else
{
Debug.LogError("uMyGUI_TexturePicker: SetTextures: you must provide the TexturePrefab in the inspector or via script!");
}
}
private void OnDestroy()
{
m_buttonCallback = null;
}
private void SetRectTransformPosition(RectTransform p_transform, int p_positionIndex, float p_size)
{
p_transform.SetParent(RTransform, false);
Vector2 anchoredPosition = p_transform.anchoredPosition;
anchoredPosition.x += m_offsetStart + (float)p_positionIndex * (p_size + m_padding);
p_transform.anchoredPosition = anchoredPosition;
}
private T TryFindComponent<T>(GameObject p_object) where T : Component
{
T val = p_object.GetComponent<T>();
if (val == null)
{
T[] componentsInChildren = p_object.GetComponentsInChildren<T>(true);
if (componentsInChildren.Length > 0)
{
val = componentsInChildren[0];
}
}
return val;
}
}
}