- Home /
Creating clickable image on-the-fly
I am trying to implement an inventory system which allows me to dynamically (i.e. during runtime) create a UI-Image as visual representation for an item which can be moved around with the mouse and snaps in place in the inventory grid. SO basically, all I am doing needs to be accessible from c#-scripts.
However, I found it excessively difficult to use the built-in systems to detect a mouse click on the 2D item with e.g. IPointerDownHandler. I also tried using OnMouseDown(), but it doesn't seem to register. I also also tried this stuff of which I understand about half, so I'm just gonna post it:
//Create new trigger
EventTrigger evtrig=gameObject.AddComponent<EventTrigger>();
//Create a new event to add to the trigger
EventTrigger.TriggerEvent trigev=new EventTrigger.TriggerEvent();
trigev.AddListener((eventData) => OnPointerDown((PointerEventData)eventData)); //link to onpointerdown function
EventTrigger.Entry entry = new EventTrigger.Entry() { callback = trigev, eventID = EventTriggerType.PointerDown };
if (evtrig.delegates==null) evtrig.delegates=new List<EventTrigger.Entry>();
evtrig.delegates.Add(entry);
So I guess my question is this: Has anyone had success implementing a similar system? (The main point being that it has to be created through scripting) Maybe I am just plain wrong with my sample code here, too
Answer by ben-rasooli · Dec 08, 2017 at 12:58 AM
I've made an extension method for it. Simply include this class somewhere in your project:
using UnityEngine.EventSystems;
public static class ExtensionMethods
{
public static void AddListener (this EventTrigger trigger, EventTriggerType eventType, System.Action<PointerEventData> listener)
{
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = eventType;
entry.callback.AddListener(data => listener.Invoke((PointerEventData)data));
trigger.triggers.Add(entry);
}
}
Then use it like this:
using UnityEngine;
using UnityEngine.EventSystems;
public class UIController : MonoBehaviour
{
void Start ()
{
EventTrigger myEventTrigger = GetComponent<EventTrigger> (); //you need to have an EventTrigger component attached this gameObject
myEventTrigger.AddListener (EventTriggerType.PointerClick, onClickListener);
}
void onClickListener (PointerEventData eventData)
{
//put your logic here...
}
}