- Home /
Fake pointer up on UI gameobject A and pointer down on UI gameobject B
Hi everyone,
here is what I am trying to accomplish:
I have two sliders, one horizontal, one vertical.
Initially only the horizontal slider is active and the vertical one is inactive.
When the user drags the slider handle of the horizontal one and lingers over the same slider value for a certain time, I want deactivate the horizontal slider and activate the vertical one, so that the user can continue dragging the handle of the vertical slider without having to release the mouse button (or lift the finger off the touch screen).
This is what I tried so far:
PointerEventData pointer = new PointerEventData (EventSystem.current);
ExecuteEvents.Execute (horizontalSlider.gameObject, pointer, ExecuteEvents.pointerUpHandler);
ExecuteEvents.Execute (verticalSlider.gameObject, pointer, ExecuteEvents.pointerDownHandler);
However, the horizontal slider keeps receiving the press and drag events until I physically release the mouse button. I also tried setting the pointerPress and pointerDrag gameobject in the PointerEventData manually like this
PointerEventData pointer = new PointerEventData (EventSystem.current);
ExecuteEvents.Execute (horizontalSlider.gameObject, pointer, ExecuteEvents.pointerUpHandler);
pointer.pointerPress = verticalSlider.gameObject;
pointer.pointerDrag = verticalSlider.gameObject;
ExecuteEvents.Execute (sliderInvisible.gameObject, pointer, ExecuteEvents.pointerDownHandler);
This unfortunately didn't do the trick either :-/
Any help is greatly appreciated :)
Answer by Schnodahipfe · Oct 10, 2017 at 08:04 AM
I ended up solving it differently via a sort of mask that receives all events and forwards them to the respective gameobject (in my case the two sliders):
I put a transparent image on top of my whole panel that implements the interfaces IPointerDownHandler, IInitializePotentialDragHandler, IDragHandler, IPointerClickHandler
Depending on which slider I want to receive the events, I forward them in the OnPointerDown, OnInitializePotentialDrag, OnDrag and OnPointerClick methods
This roughly looks like this:
public class MaskHorizontalVsVertical : MonoBehaviour, IPointerDownHandler, IInitializePotentialDragHandler, IDragHandler {
bool vertSliderIsShowing = false;
public Slider horizontalSlider;
public Slider verticalSlider;
void Update () {
// Decide here, which slider should be active and receiving the events and set vertSliderIsShowing accordingly
}
public void OnPointerDown (PointerEventData eventData)
{
if (!vertSliderIsShowing) {
horSlider.OnPointerDown (eventData);
}
else {
vertSliderInvisible.OnPointerDown (eventData);
}
}
public void OnInitializePotentialDrag (PointerEventData eventData)
{
if (!vertSliderIsShowing) {
horSlider.OnInitializePotentialDrag (eventData);
}
else {
vertSliderInvisible.OnInitializePotentialDrag (eventData);
}
}
public void OnDrag (PointerEventData eventData)
{
if (!vertSliderIsShowing) {
horSlider.OnDrag (eventData);
}
else {
vertSliderInvisible.OnDrag (eventData);
}
}
}
Hope this helps!