Merhaba arkadaşlar. Bugünkü yazımda sizlere Unity’nin faydalı bir özelliğinden bahsedeceğim: UnityEvent

UnityEvent’i JavaScript’teki callback functionlara benzetiyorum ben. Genelde oyunlarda kurgulanan bir olay sonrası bir action fire etmek için kullanırım. Örneğin generic sayılabilecek bir Dragger scriptimiz olsun. Bu scriptin görevi de şu olsun: 2D item’ı sürüklenebilir yap ve hedef trigger ile etkileşime geçtiğinde doğru cevap penceresini aç.

Hemen Dragger adında bir script oluşturalım. Yapmamız gereken on drag eventini ve on trigger enter 2D eventini dinlemek:

public class Dragger : MonoBehaviour, IDragHandler  
{  
  public void OnDrag(PointerEventData eventData)  
 {  // TODO: drag  
  }  
  
  void OnTriggerEnter2D(Collider2D col)  
 {  // TODO: trigger  
  }  
}

Item’ı sürükler iken biraz yumuşak olmasını istiyorum. O yüzden Vector2.SmoothDamp ile, tıkladığımız position olan Input.mousePosition değerini smoothTime değeri ile sınırlayacağız.

public float smoothTime = 0.1f;  
private Vector2 velocity = Vector2.zero;  
public bool dragable = true;

public void OnDrag(PointerEventData eventData)  {  
  if (dragable) { 
    var mousePosition = Input.mousePosition;  
    transform.position = Vector2.SmoothDamp(transform.position,  
	    new Vector2(mousePosition.x, mousePosition.y), ref velocity, smoothTime);  
  }
}

OnTriggerEnter2D methodunda ise, trigger olan game objesi ile bizim inspector’de verdiğimiz hedef game objesinin name’i aynı mı kıyaslaıyoruz. If koşulunun içine girdiğinde inspectorden setlemiş olduğumuz UnityEvent’i invoke metodu ile çalıştırılacak. Metodun olmaması hata fırlatmaz.

public GameObject target;
public UnityEvent afterTrigger;

void OnTriggerEnter2D(Collider2D col)  
{  
  if (col.transform.name == target.name) {
    afterTrigger.Invoke();  
  }
}

Kodlarımızı toparlarsak son hali böyle olacak:

public class Dragger : MonoBehaviour, IDragHandler
{
    public GameObject target;
    public bool dragable = true;

    public float smoothTime = 0.1F;
    private Vector2 velocity = Vector2.zero;

    public UnityEvent afterTrigger;

    public void OnDrag(PointerEventData eventData)
    {
        if (dragable)
        {
            var mousePosition = Input.mousePosition;
            transform.position = Vector2.SmoothDamp(transform.position,
                new Vector2(mousePosition.x, mousePosition.y), ref velocity, smoothTime);
        }
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.transform.name == target.name)
        {
            afterTrigger.Invoke();
        }
    }
}

Inspector’de After Trigger kısmına artık trigger sonrası çalışmasını istediğiniz fonksiyonu sürükleyebilirsiniz.

Yukarıdaki scripti 2D + Mobile oyunlarınızda kullanabilirsiniz.

En basit haliyle UnityEvent böyleydi, dökümana bakarak ve hayal gücünüzü kullanarak nasıl kullanacağınız tamamen size kalmış. Kolay gelsin.