using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using VketCloudGUITools.Utilities; namespace VketCloudGUITools.Runtime { /// /// HeliodorのCSlider相当 /// UnityのSliderの機能制限によって実装 /// [RequireComponent(typeof(VCTransform))] [RequireComponent(typeof(Slider))] public class VCSlider : MonoBehaviour, IVCGUIItem, IHasStateToggleList, IHasVCTransform { [SerializeField] private VCLayerList _parentLayer; [SerializeField] protected VCTransform _vcTransform; [SerializeField] private bool _visible = false; [SerializeField] protected Slider _slider = null; [SerializeField] private bool _sliderEnable = true; [SerializeField] protected List _toggleList = new List(); public VCTransform VcTransform => this.GetRequiredComponent(ref _vcTransform); protected VCLayerList ParentLayer => _parentLayer; public Slider Slider => this.GetRequiredComponent(ref _slider); public bool Visible { get => _visible; set { if (_visible != value) { _visible = value; OnVisibleChanged(); } } } public bool SliderEnable { get => _sliderEnable; set { if (_sliderEnable != value) { _sliderEnable = value; OnVisualStateChanged(); } } } public List ToggleList { get => _toggleList; set => _toggleList = value; } /// /// スライダーの背景画像 /// public Sprite BaseSprite { get => unityBaseImage != null ? unityBaseImage.sprite : null; set { if (unityBaseImage != null) unityBaseImage.sprite = value; } } /// /// スライダーの伸びる棒の画像 /// public Sprite FrontSprite { get => unityFrontImage != null ? unityFrontImage.sprite : null; set { if (unityFrontImage != null) unityFrontImage.sprite = value; } } /// /// スライダーが操作可能なときの画像 /// public Sprite OnHandleSprite { get => unityHandleImage != null ? unityHandleImage.sprite : null; set { if (unityHandleImage != null) unityHandleImage.sprite = value; } } /// /// スライダーが操作不能なときの画像 /// [SerializeField] public Sprite OffHandleSprite; /// /// 背景画像コンポーネント /// [SerializeField] public Image unityBaseImage; /// /// 前景(スライダーの伸びる棒)画像コンポーネント /// [SerializeField] public Image unityFrontImage; /// /// 掴むところ画像コンポーネント /// [SerializeField] public Image unityHandleImage; /// /// 連動する変数名 /// [Tooltip("連動する変数名")] [SerializeField] public string DriveField; public float Value { get => Slider.value; set => Slider.value = value; } private Sprite _onHandleSpriteBackup = null; /// /// 有効化時 /// private void OnEnable() { Slider.onValueChanged.AddListener(OnValueChanged); if (unityHandleImage != null) { _onHandleSpriteBackup = unityHandleImage.sprite; } } /// /// 無効化時 /// private void OnDisable() { Slider.onValueChanged.RemoveListener(OnValueChanged); } private void OnValueChanged(float value) { if (ParentLayer.ParentCanvas != null) ParentLayer.ParentCanvas.OnSliderValueChanged(this, value); } public void InitializePostAddComponent(Image backgroundImage, Image fillImage, Image handleImage, RectTransform fillRect, RectTransform handleRect) { this.Slider.fillRect = fillRect; this.Slider.handleRect = handleRect; this.Slider.targetGraphic = handleImage; this.Slider.direction = Slider.Direction.LeftToRight; this.Slider.transition = Selectable.Transition.SpriteSwap; unityBaseImage = backgroundImage; unityFrontImage = fillImage; unityHandleImage = handleImage; _onHandleSpriteBackup = unityHandleImage.sprite; } /// /// 必須Component参照を解決 /// public virtual void ResolveRequireComponents() { this.GetRequiredComponent(ref _vcTransform); } public void OnResolveReferences(VCLayerList parentLayer) { _parentLayer = parentLayer; ResolveRequireComponents(); } public void UpdateVisible() { // Visibleフラグは、heliodorとの互換性のための状態管理フラグです。 // https://hikky.atlassian.net/wiki/spaces/VKETCLOUD/pages/530317633/Canvas+Show Visible = Show && ToggleList.IsAllTrue() && (ParentLayer != null ? ParentLayer.Show : true); } public void OnParentLayerShowChanged() { UpdateVisible(); } private void OnVisibleChanged() { OnVisualStateChanged(); } internal void OnVisualStateChanged() { if (unityBaseImage != null) unityBaseImage.enabled = _visible && Show; if (unityFrontImage != null) unityFrontImage.enabled = _visible && Show && SliderEnable; if (unityHandleImage != null) unityHandleImage.enabled = _visible && Show && SliderEnable; if (Visible) { if (unityHandleImage != null) unityHandleImage.overrideSprite = SliderEnable ? _onHandleSpriteBackup : OffHandleSprite; } } #if UNITY_EDITOR protected virtual void Reset() { ResolveRequireComponents(); } #endif public virtual bool IsValid() { return false; } public bool Show { get => gameObject.activeSelf; set { if (gameObject.activeSelf != value) { gameObject.SetActive(value); UpdateVisible(); } } } public Vector2Int Pos { get => VcTransform.Pos; set { VcTransform.Pos = value; VcTransform.ApplyTransform(); } } public Vector2Int Size { get => VcTransform.Size; set { VcTransform.Size = value; VcTransform.ApplyTransform(); } } public int Z { get => VcTransform.Z; set { VcTransform.Z = value; VcTransform.ApplyTransform(); } } public Vector3Int Pos3D { get => VcTransform.Pos3D; set { VcTransform.Pos3D = value; VcTransform.ApplyTransform(); } } public void ToggleChange(string name) { StateToggleListUtility.CommonToggleChange(this, this, name); } public void ToggleDefault(string name) { StateToggleListUtility.CommonToggleDefault(this, this, name); } } }