Bu yazıda sizlere objeyi drag ile hareket ettirip bırakmayı göstereceğim.
Bu scriptte Mouse fonsiyonlarını kullanmak istedim. Mouse fonksiyonlarını bilmiyorsanız buradan bakabilirsiniz. Not: Mouse fonksiyonlarının çalışabilmesi için objede collider olması gerekiyor!!
Öncelikle hareket edecek target objemizi tanımlıyoruz.
public Transform target;
Objemize tıklandığında rigidbody‘sine erişip useGravity ayarını kapatıyorum. Objeyi hareket ettirirken yerçekimini kullanıp objenin sürekli titremesini istemiyorum. Çünkü biz objenin y eksenini bir değere eşitlerken fizik motoruda sürekli yerçekimini kullanmak isteyecek ve karşımıza kötü bir görüntü çıkacak.
Burada GetComponent yerine objenin rigidbody‘sini tanımlayıp verebilirsiniz. Daha maliyetsiz olur.
private void OnMouseDown()
{
transform.GetComponent<Rigidbody>().useGravity = false;
}
Objeye tıklanma sonlandığında rigidbody‘sinin useGravity ayarını tekrardan açıyorum ki yere düşsün. Veya burada y eksenini önceden belirlediğiniz bir değere eşitleyip de yere indirebilirsiniz.
private void OnMouseUp()
{
transform.GetComponent<Rigidbody>().useGravity = true;
}
Şimdi en zor kısıma geldik 🙂 Hareket için gerekli vektörü alttaki MouseWorldPosition fonksiyonu ile hesaplayacağız. Öncelikle ekrandan hareket için gerekli pozisyonları almak için Input.mousePosition kullanarak bu değerleri sonradan kullanacağımız bir değişkene atıyoruz. Burada var yerine Vectör3 kullanabilirsiniz, ben biraz havalı olsun diye var kullandım:) Gelelim dananın kuyruğunun koptuğu yere, biz ekrandan bir vectör3 elde ettik ama bunun z ekseni yok ? İsterseniz print(Input.mousePosition) diyerek bunu göre bilirsiniz. Z eksenini biz manuel olarak 3 boyutlu evrendeki target’in z poziyonuna atıyoruz. Bunu yapamamın sebebi harekete target objesinden başlaması için. İsterseniz z eksenini bir değere atamayın, hareketin ekrana bastığınız yerin gerisinden başladığını göreceksiniz.
Şuan elimde halen daha 2 boyutta bir vektör var, ben bunu 3 boyutlu dünyaya aktarmak için ScreenToWorldPoint diyip return ediyorum. Bu şekilde 2 boyuttaki y ekseninde olan pozisyon değişikliklerini 3 boyutta z eksenine verecek. Ekranın sol altı (0,0)’dan başlayıp sağ en üstü çözünürlüğünüze kadar pixel pixel artar. Elde ettiğimiz son vektörü ScreenToWorldPoint demez isek objenin pozisyonunu ekrana doğunduğumuz pixelin konumuna eşitleyecektir. ScreenToWorldPoint diyerek 2 boyuttaki vektörün kameradan n uzaklaktıktaki izdüşümünü 3 boyutta kullanıyoruz. WorldToScreenPoint’de ise tam tersi bir mantık mevcut.

private Vector3 MouseWorldPosition()
{
var mouseScreenPos = Input.mousePosition;
mouseScreenPos.z = Camera.main.WorldToScreenPoint(target.position).z;
return Camera.main.ScreenToWorldPoint(mouseScreenPos);
}
Son olarak hareket ettireceğimiz fonksiyona bakalım. Burada y eksenini 1 vermemin sebebi hareket ettirme hissiyatına katkı sağlaması. Bu şekilde objemizi x ve z olmak üzere 2 eksende hareket ettirebiliyorum.
Y eksenine MouseWorldPosition().y verirsek ne olur diye merak ediyor musunuz? Sizden denemenizi rica edeceğim. Bu sefer x,y ve z olmak üzere 3 eksende de objeyi hareket ettirebileceğiz fakat ekrandaki y ekseni z eksenini eskisi kadar etkilemeyecek ve genelde 3 boyutlu dünyada y ekseni değişirken z ekseni yanında kırıntıları toplar gibi kalacak.
void OnMouseDrag()
{
transform.position = new Vector3(MouseWorldPosition().x,1f, MouseWorldPosition().z);
}
Target olarak tanımladığımız transform’a hareket ettirmek istediğiniz objeyi vermeyi unutmayın!
BONUS BİLGİ!!! Eğer puzzle gibi bir oyun yapıyor ve objeyi bıraktığınız bölgeye,havuza tam otursun istiyor iseniz collider etkileşime girerse taşınan objenin pozisyonunu etkileşime girilen objenin pozisyonuna eşitleyip işi çözebilirsiniz.
Umarım anlatabilmişimdir, iyi çalışmalar…