序文
Sliderの使用では、通常、onValueChangedイベントを使用して値の変更を監視しますが、ドラッグとクリックの開始と終了時にいくつかの操作を実行する必要がある場合があります。このとき、Sliderをある程度拡張する必要があります。これらの機能。
達成
ここでは、スライダーをある程度拡張し、スライダーを継承して基本関数を取得すると同時に、IBeginDragHandlerクラスとIEndDragHandlerクラスを継承してドラッグイベントを拡張します。
拡張イベントを定義する
[Serializable]
public class ExtendedEvent : UnityEvent<float> {
} //定义拓展的事件
ここでのフロートは、スライダーの値にパラメーターを渡すためのものです。
拡張クラスを定義する
public class ExtendedSlider : Slider, IBeginDragHandler, IEndDragHandler
カスタムイベント
public ExtendedEvent DragStart;
public ExtendedEvent DragStop;
public ExtendedEvent PointerDown;
上記の3つのイベントは、拡張が必要なイベントです。
イベントコール
public void OnBeginDrag(PointerEventData eventData)
{
DragStart.Invoke(m_Value);
}
public void OnEndDrag(PointerEventData eventData)
{
DragStop.Invoke(m_Value);
}
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
PointerDown.Invoke(m_Value);
}
関連するイベントがここで呼び出されますが、クリック時の関数(OnPointerDown)を書き直す必要があり、親クラスのイベントが呼び出されます。
手順
コンポーネントを追加する
以下に示すように、新しいSliderコンポーネントノードを作成し、Sliderコンポーネントを
削除し
、ExtendedSliderコンポーネントを追加し
、スクロールノードを関連付けます。
イベントバインディング
次のようにスクリプトを使用します。
using UnityEngine;
public class UseExtendedSlider : MonoBehaviour
{
public ExtendedSlider slider;
// Start is called before the first frame update
void Start()
{
slider.DragStart.AddListener(OnSliderBeginDrag);
slider.DragStop.AddListener(OnSliderEndDrag);
slider.PointerDown.AddListener(OnSliderClick);
}
void OnSliderBeginDrag(float value)
{
Debug.Log("开始拖拽:" + value);
}
void OnSliderClick(float value)
{
Debug.Log("点击:" + value);
}
void OnSliderEndDrag(float value)
{
Debug.Log("结束拖拽:" + value);
}
}
主にイベントにリスナーを追加し、値に出力を出力します。
テスト効果:
プロジェクトのソースコード
https://download.csdn.net/download/qq_33789001/28678255
無効な場合は、監査に合格しなかったことを意味します。
要約する
現在、スクリプトでのイベントバインディング/リスニングのみをサポートし、イベントドラッグバインディングも試行しましたが、失敗しました。次のコードが可能であるため、具体的な理由はSliderコンポーネントの継承であると推測されます。
using UnityEngine;
public class EventTest : MonoBehaviour
{
public ExtendedEvent TestEvent1, TestEvent2;
}
スクリプトをノードにぶら下げることで、イベントの視覚化をバインドできます。