UNITY İle Android’e Uygulama Geliştirmek – 1 – Dokunmatik Ekran Entegrasyonu

Yayınlandı: 17 Temmuz 2013 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde
Etiketler:, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Yine ve yeniden merhaba,

Bu UNITY dersinde Android için uygulama geliştirmenin temellerini öğreneceğiz. Dersin bu ilk parçasında dokunmatik ekranın nimetlerinden faydalanmayı görecek, ikinci derste ise telefonun hareket sensörünü kullanmayı öğreneceğiz (2. derse gitmek için tıklayın: https://yasirkula.com/2013/07/22/unity-ile-androide-uygulama-gelistirmek-2-telefon-sensorunu-kullanmak/ ). Bu derse başlamadan önce UNITY için Android SDK kurulumunu yapmış olmanız gerekiyor. Eğer yapmadıysanız şu dersimize göz atabilirsiniz: https://yasirkula.com/2013/07/17/unity-android-sdk-kurulumu-resimli-anlatim/

Hazırsanız touchscreen’e dalışı yapalım…

Şimdi yapacağımız örnek uygulamadan bahsetmek istiyorum. Bu uygulamada ekranda bir küp olacak ve bu küp bizim dokunmatik ekranda tıkladığımız konuma ışınlanacak. Ayrıca bu küpün boyutlarını ekranda elimizi sağa-sola ya da yukarı-aşağı kaydırarak değiştirebileceğiz. Bu uygulamayı yaparken öğreneceklerinizi kolaylıkla kendi uygulamalarınıza da uygulayabileceğinizi umuyorum.

Öncelikle UNITY’i açın ve yeni bir proje oluşturun. Main Camera‘yı (0, 0, -10) konumuna yerleştirin ve ardından yeni bir Cube GameObject oluşturup bu objenin Transform component‘indeki değerleri resetleyin. Şimdi yeni bir Javascript oluşturup bu scripti küp objesine atayın. Son olarak sahnede bir Directional Light oluşturun ki küp objesinin hareketlerini rahatlıkla gözlemleyebilelim.

Aşama 1 : PC

Uygulamamızı Android’e yazmadan önce PC platformu için yazıp sonra Android’e convert etmeyi uygun gördüm. Bu yüzden öncelikle projeyi bilgisayar üzerinden test edecek, sonra birkaç ufak değişiklikle Android’e çevireceğiz.

İlk önce küpün ekranda mouse ile tıkladığımız yere ışınlanmasını sağlayalım. Bunun için Update() fonksiyonunu kullanmamız uygun olur. Scripti açın ve Update() fonksiyonuna şu kısacık kodu yazın:

if( Input.GetMouseButtonDown( 0 ) )
{
  transform.position = Camera.main.ScreenToWorldPoint( Vector3( Input.mousePosition.x, Input.mousePosition.y, 10 ) );
}

Bu kod sayesinde eğer herhangi bir anda farenin sol tuşuna basılırsa farenin ekrandaki konumu Main Camera’nın bakış açısına göre 3 boyutlu uzaydaki bir koordinata çevriliyor ve obje bu koordinata ışınlanıyor. Şimdi biraz daha detaylı açıklayayım:

Camera.main” ibaresi sahnedeki “MainCameratag‘ına sahip kameraya ulaşmak için kullanılır. Camera class’ının içerisinde “ScreenToWorldPoint” adında bir komut (method) bulunmaktadır. Bu komutun parantezinin içine bir Vector3 değer girilir. Girilen bu Vector3’ün x ve y değerleri ekrandaki bir pixelin konumuna işaret etmelidir, bizim durumumuzda bu mouse’nin ekrandaki konumunun x ve y koordinatlarına denk geliyor. Vector3’ün z değeri ise 3 boyutlu uzayda çevrilecek noktanın kameradan kaç metre uzak olması gerektiğini belirtiyor, bunun değeri ise bizim örneğimizde 10. Yani Main Camera’nın z koordinatının -10’da olduğunu ele alırsak küp objemizin z değeri bundan 10 birim fazla olacak, yani 0 olacak. “ScreenToWorldPoint” method’u içine girilen bu Vector3’ü alır ve bize 3 boyutlu uzayda bir nokta döndürür. Bu nokta döndürülürken hangi kameranın referans alınacağını ise en başta belirtmiştik zaten “Camera.main” ibaresiyle.

Şimdi de küpün boyutunun biz mouse’yi sürükledikçe değişmesini ayarlayalım. Bunun için scriptin içindeki tüm kodu şöyle değiştirin:

var mouseEskiKonum : Vector3;

function Update ()
{
  if( Input.GetMouseButtonDown( 0 ) )
  {
    transform.position = Camera.main.ScreenToWorldPoint( Vector3( Input.mousePosition.x, Input.mousePosition.y, 10 ) );
    mouseEskiKonum = Input.mousePosition;
  }
  if( Input.GetMouseButton( 0 ) )
  {
    transform.localScale += ( Input.mousePosition - mouseEskiKonum ) / 100;
    mouseEskiKonum = Input.mousePosition;
  }
}

Burada görüldüğü üzere öncelikle mouseEskiKonum adında bir Vector3 değişken oluşturduk ve ekranda bir noktaya tıklandığında bu değişkene mouse’nin koordinatını atadık. Ardından “Input.GetMouseButton( 0 )” komutuyla, mouse’nin sol tuşunun basılı olduğu her frame’de objenin boyutunun (transform.localScale) mouse’nin mevcut konumuyla eski konumu arasındaki farkın 1/100’ü kadar değişmesini sağladık. Neden 1/100? Çünkü ekran koordinatları pixellerle alakalı ve mouse’yi birazcık bile oynatsak ekranda epey pixel katedebiliriz. Ancak 3 boyutlu dünyada (World koordinatlarında) metrelerle işlem yapıyoruz ve 1 metrelik bir değişiklik bile küpün boyutunda ciddi değişikliklere yol açar. Bu yüzden her 100 pixellik oynamada küpün 1 metre büyümesini sağladık. Son olarak da “mouseEskiKonum” değişkeninin değerini mouse’nin güncel konumuna ayarladık.

Ve böylece ufak uygulamamızı PC için yazmış olduk. Şimdi sıra Android’e uyarlamaya geldi!

Aşama 2 : Android

Uygulamayı Android’e çevirmeden önce touchscreen ile alakalı olan önemli komutları açıklamak istiyorum.

Android’e uygulama geliştirirken dokunmatik ekranla işlem yapmak için en aşina olmanız gereken komut “Input.touches” değişkeni. Bu değişken ne yapar? Dokunmatik ekrana dokunmakta olan tüm parmakları içerisinde depolar. Peki bu parmaklar ne türde depolanır? Vector3 mü? Transform mu? Hayır! Bu parmaklar çok daha gelişmiş bir tür olan “Touch” türünde depolanır. Yani anlayacağınız “Input.touches” komutu dokunmatik ekranla temas halinde olan tüm parmakları birer “Touch” türünde depolamakta olan bir değişkendir.

Peki bu “Touch” türünde depolanmakta olan parmak ile neler yapılabilir? “Touch” dediğim şey bir Struct olup içerisinde çeşitli özellikler barındırır. Mesela bunlardan biri “position“dır ve bu değişken parmağın dokunmatik ekrandaki konumunu bir Vector2 olarak tutar. Bunun haricinde “deltaPosition” değişkeni de oldukça önemli olup parmağın ekranda son frame’den itibaren yatayda ve dikeyde kaç pixel hareket ettiğini yine bir Vector2 olarak döndürür. O halde “deltaPosition.x” dediğimiz zaman parmağın yatay eksende kaç pixel hareket ettiğini, “deltaPosition.y” dediğimiz zaman da parmağın dikey eksende kaç pixel hareket ettiğini bulmuş oluruz. Touch’un depoladığı bir başka önemli değişken ise “phase” değişkenidir. Bu değişken TouchPhase türündedir ve parmağın durumunu depolar. Daha açık konuşmak gerekirse parmağın ekrana yeni mi dokunduğunu (TouchPhase.Began), yoksa ekranda basılı halde hareket etmekte olan bir parmak olduğunu mu (TouchPhase.Moved), ekranda basılı halde duran ama hareket etmeyen bir parmak olduğunu mu (TouchPhase.Stationary) ya da ekrandan yeni kaldırılan bir parmak olduğunu mu (TouchPhase.Ended) depolar. Ekrana aynı anda beşten fazla parmağın dokunması gibi nadir olaylarda ise değeri TouchPhase.Canceled olur. “Touch” değişkeni bir başka önemli değişken daha depolar: fingerId. Bu değişken bir int‘tir ve ekrandaki o parmağa has bir tamsayı değeridir. Bu değişkenle ne yapılabilir? Örneğin oyununuzda sadece ekrandaki bir parmağı kaâle almak istiyor, ekrana sonradan dokunan parmakların hiçbir etki etmemesini istiyorsunuz. O zaman bir değişkene o parmağın fingerId‘sini atayabilir ve ardından bir parmakla iş yaparken önce o parmağın fingerId‘sinin depoladığınız değişkene eşit olup olmadığına bakabilirsiniz.

Evet, dokunmatik ekranla ilgili önemli olan komutları böylece öğrenmiş olduk. Ne kadar az idi, değil mi! İşte bu yüzden UNITY ile Android’e uygulama geliştirmek aslında hiç de zor değil. Şimdi hazırsanız yarıda bırakmış olduğumuz örnek uygulamamızı Android’e transfer edelim.

Önce küpümüzü ekranda dokunduğumuz konuma ışınlandırmayı yapacağız. Bunun için bize gerekli olan şey ne? Ekrana dokunan bir parmağın (Touch) konumu. Peki bu Touch türündeki parmağa hangi değişken vasıtasıyla ulaşıyorduk? Evet, Input.touches değişkeni. O halde Input.touches değişkeninde yer alan tüm Touch‘ların “phase” değişkenine bakmalı ve eğer parmak ekrana yeni dokunmuşsa (TouchPhase.Began) küpü parmağın ekrandaki konumuna (position) ışınlamalıyız. O halde hemen küp objesine atadığınız scripti açın ve Update() fonksiyonuna şu kodu ekleyin:

for( var parmak : Touch in Input.touches )
{
  if( parmak.phase == TouchPhase.Began )
  {
    transform.position = Camera.main.ScreenToWorldPoint( Vector3( parmak.position.x, parmak.position.y, 10 ) );
  }
}

Buradaki “for( var parmak : Touch in Input.touches )” kullanımıyla ilk kez karşılaşmış olabilirsiniz. Sakın kafanız karışmasın. “for” ifadesinin böyle kullanımı aslında aşağıdaki kullanımıyla tıpatıp aynıdır, sadece yazması daha kolaydır:

for( var i = 0; i < Input.touches.Length; i++ )
{
  var parmak : Touch = Input.touches[i];
  blablabla...
}

Sanıyorum yukarıdaki kodu açıklamaya gerek yok, çünkü neyi niçin yaptığımızı zaten açıkladım. Burada PC için olan kodu Android’e çevirmenin ne kadar kolay olduğuna dikkatinize çekmek istiyorum. Sadece birkaç satırla uygulamamıza Android desteği sunduk. Uygulamanın ikinci aşamasını Android’e aktarmak da bir bu kadar kolay. Tek yapmamız gereken for döngüsünün içini şu hale getirmek:

for( var parmak : Touch in Input.touches )
{
  if( parmak.phase == TouchPhase.Began )
  {
    transform.position = Camera.main.ScreenToWorldPoint( Vector3( parmak.position.x, parmak.position.y, 10 ) );
  }
  else if( parmak.phase == TouchPhase.Moved )
  {
    transform.localScale += Vector3( parmak.deltaPosition.x, parmak.deltaPosition.y, 0 ) / 100;
  }
}

Gördüğünüz gibi içeriye bir “else if” ekledik ve eğer parmak ekranda hareket ettirilmişse (TouchPhase.Moved) küp objesinin boyutlarını değiştirdik. Bu esnada parmakEskiKonum gibi gereksiz bir değişkene de ihtiyacımız olmadı, çünkü hatırlayacağınız gibi “Touch” türü içerisinde zaten bir deltaPosition barındırıyor! Yine hatırlayacağınız üzere bu deltaPosition bir Vector3 değil ama bir Vector2. Ancak transform.localScale değişkeni bir Vector3 ve bu yüzden transform.localScale‘e bir Vector2 ekleyemezdik. Bunu çözmek için yeni bir Vector3 oluşturduk ve buna x değeri olarak parmak.deltaPosition.x verirken y değeri olarak da parmak.deltaPosition.y verdik ve z değerini ise 0 olarak bıraktık.

Evet, bitti! Buraya kadar gelmişseniz bir Android developer olma yolunda çok büyük bir basamak atladığınızı söyleyebilirim. Şimdi dilerseniz uygulamayı Android’e Build yapıp telefonunuzda test edebilirsiniz. Peki şimdi ne yapmalı? Öğrendiklerinizi pekiştirmek için niçin kendi başınıza basit bir Android oyunu yapmıyorsunuz? Heyecan verici!

Umarım faydalı olmuştur, dersin ikinci kısmında görüşmek üzere!

NOT: if( GUI.Button( blabla ) ) şeklinde oluşturduğunuz tüm GUI elemanları aynı zamanda otomatik olarak dokunmatik ekran desteğine de sahip. Yani onlar için ekstra kod yazmanız gerekmiyor.

yorum
  1. furkan dedi ki:

    sagol süleyman kardeşim

    • Mehmet Çınar dedi ki:

      S.a yasirbey size bir sorum olacaktı.
      C# olarak elimde yazılmış bir virtualjoystick scripti var.
      Benim yapmak istediğim şey bu joystickden gelen verilere göre
      Player scriptinden karaktere hareket vermek. ama nasıl yapacagımı çözemedim.

      • yasirkula dedi ki:

        Player scriptlerinde yer alan Input.GetAxis(“Horizontal”) ve GetAxis(“Vertical”)’lı kısımları joystick’in output’unun (Vector2 ise) x ve y değerleri ile değiştireceksiniz.

      • Mehmet Çınar dedi ki:

        Tesekkur ederim bi deneyeyim eger yapamassilam kodlari buraya aktarsam yardimci olursunuz degil mi yasir bey. Gorsel egitim seti cekmeyi dusunuyorsaniz ilk musteriniz benim.

      • yasirkula dedi ki:

        İlginiz için teşekkürler. Kodun sadece alakalı kısmını atarsanız güzel olur ama kendi başınıza yapabileceğinizi düşünüyorum.

  2. murat dedi ki:

    Ekrana oluşturulan birçok küpten sadece belli birine dokunup onu taşımayı nasıl yapabiliriz. Yardımcı olur musunuz.

    • yasirkula dedi ki:

      Üzerine tıkladığımız küpü bir değişkene atayıp taşıma işlemlerini o küpe uygulayabiliriz. Asıl soru, küpün üzerine tıkladığımızı nasıl anlarız? PC’de OnMouseDown ile çok kolay ama Android’de henüz OnMouseDown desteği yok. İşte bunun için Android’de OnMouseDown’ın nasıl çalıştırılabileceğiyle ilgili bir ders anlatacağım yakında. O zamana kadar şu İngilizce kaynağa göz atabilirsiniz: http://wiki.unity3d.com/index.php?title=OnMouseDown

      • murat dedi ki:

        Hızlı cevabınız için teşekkürler bu konuyu biraz incelemiştim fakat nedense sadece seçtiğim değil tüm ekrandaki kutuları taşıdığı için beceremedim ekrana dokununca tüm kutular oraya geliyor.

      • yasirkula dedi ki:

        Tıkladığınız kutuyu bir değişkene atayın Transform cinsinden ve ekranda parmağınızı sürüklerken sadece bu Transform değişkeninin position değerini ilgili koordinata taşıyın.

  3. Berk Yaşar dedi ki:

    Merhabalar,burayı inceledim fakat burada küpü ışınlama türü olaylar var galiba yada yanlış kavradım.Ben buradan nasıl bir ilişki çıkartarak ateş etme scriptimdeki kodları GUİButton’a tıklayınca aktif hale getirmeyi başarabilirim?

    • yasirkula dedi ki:

      Merhaba,

      Eğer GUI.Button veya GUILayout.Button kullanıyorsanız o zaman ekstra kod yazmanıza gerek yok. Ekrandaki butona parmakla dokununca if( GUI.Button( … ) )’ın içindeki kod otomatik olarak çalışıyor. Eğer butonunuz Collider’ı olan bir 3D obje ise ya da GUITexture ise o zaman şu yazıdaki kodu kameranıza atın ve buton objenizin yapacağı şeyleri OnMouseDown fonksiyonuna yazın: https://yasirkula.com/2013/07/28/unity-onmousedown-fonksiyonunu-androide-uyarlamak/

      Gördüğünüz gibi butonlar için bu derste anlattığım komutları kullanmanız gerekmiyor. Ancak parmak sürükleyerek kameranın yönünü değiştirmek gibi şeylerle uğraşacaksanız da sadece ve sadece tek bir değişkenle uğraşacaksınız: Input.touches . Ben burada bir küpü oynattığımız basit bir uygulama üzerinden gittim ama bu işlemleri gerçekleştirmek için kullandığım yöntem üzerinde oynama yaparak kendi sorununuza uygun bir algoritma üretebilirsiniz.

  4. Berk Yaşar dedi ki:

    Yalnız şöyle bit sıkıntı var.Kodun bulunduğu cisim hangi bölgedeyse kurşun ordan çıkıyor.Yani Butona tıkladığım kısımdan kurşun çıkmaya başlayacak.Onun için kodda şu cisimde(gameobject) bulunan şu script ti ,butona tıklayınca true yap gibi bir şey olması lazım.Benim gui kodum :

    var btnTexture : Texture;
    function OnGUI() {
    if (!btnTexture) {
    Debug.LogError("Please assign a texture on the inspector");
    return;
    }
    if (GUI.Button(Rect(90,50,50,50),btnTexture))
    Debug.Log("Clicked the button with an image");

    }

    • yasirkula dedi ki:

      Butona basınca çalışmasını istediğiniz scripte “Ates” diyelim ve bu scriptin bulunduğu objeye de “Asker” diyelim. 2 yol var şimdi:

      1) GUI kodunuzda “public var atesScripti : Ates;” adında bir değişken oluşturabilir ve Inspector’dan buna değer olarak “Asker” GameObject’ini sürükleyebilirsiniz. (Bu yöntemi tavsiye ederim)

      2) Butona tıklayınca Debug.Log(“Clicked the button with an image”) komutundan sonra “var atesScripti : Ates = GameObject.Find( “Asker” ).GetComponent( “Ates” );” komutunu ekleyin.

      Bu işlemlerden birini yaptıktan sonra GUI kodunuzdaki “if(GUI.Button(Rect(90,50,50,50),btnTexture))”in içinde en altta yeni bir satır oluşturup şu komutu ekleyin: “atesScripti.SendMessage( “AtesEt” );”. Son olarak “Ates” scriptinizin içinde “AtesEt()” adında yeni bir fonksiyon oluşturun ve tüm ateş etme kodunuzu buraya yazın. Artık ekrandaki GUI butonuna tıkladığınızda bu “Ates” scriptinin “AtesEt()” fonksiyonu çalıştırılacak.

  5. Berk Yaşar dedi ki:

    Hep kodda hata buluyor.Ateş kodumu şöyle yaptım:

    AtesEt(
    var Bullet : Rigidbody;
    var BulletSpeed = 20;
    var rate : float = 0.5;
    var muzzleFlash : GameObject;
    var sound : AudioClip;
    var reloadtime : float = 4; // this reload time is too long!
    var magcount : int = 10;
    var magbulletcount : int = 21;
    var bulletcount : int = 0;
    private var rate_time : float;
    private var reloadTimer: float = 0.0; // internal reload timer
    
    function Start () {
    bulletcount = magbulletcount;
    
    }
    function Update()
    {
    if (reloadTimer > 0){ // if reloadTimer active…
    
    Reload();
    }
    else
    if(Input.GetButton(“Fire1″)&& bulletcount > 0 && Time.time > rate_time)
    {
    Shot();
    
    }
    }
    
    function MuzzleFlashOn()
    {
    muzzleFlash.active = true;
    yield WaitForSeconds(0.02);
    muzzleFlash.active = false;
    }
    function OnGUI () {
    
    GUI.Label (Rect (1235, 825, 100, 250),”" + bulletcount);
    GUI.Label (Rect (1252, 825, 100, 250),”/” + magcount);
    
    }
    function Shot(){
    rate_time = Time.time + rate;
    var mermi=Instantiate(Bullet,this.transform.position,this.transform.rotation);
    mermi.velocity=transform.TransformDirection(Vector3.forward*BulletSpeed);
    
    AudioSource.PlayClipAtPoint(sound, transform.position, 1);
    bulletcount –;
    
    if (bulletcount 0){
    // if run out of ammo but still have clips…
    reloadTimer = reloadtime; // activate reloadTimer
    // you can play reload sound or animation here
    }
    
    MuzzleFlashOn();
    
    }
    function Reload(){
    
    reloadTimer -= Time.deltaTime;
    if (reloadTimer <= 0){
    bulletcount = magbulletcount;
    magcount–;
    }
    
    }
    )
    

    Gui kodum:

    public var atesScripti : Ates;
    var btnTexture : Texture;
    	function OnGUI() {
    		if (!btnTexture) {
    			Debug.LogError("Please assign a texture on the inspector");
    			return;
    		}
    		if (GUI.Button(Rect(90,50,50,50),btnTexture))
    			Debug.Log("Clicked the button with an image");
    		atesScripti.SendMessage( “AtesEt” );
    	}
    

    Böyle oldu fakat Unity hep uyarı verdi kodda hata olduğuna dair.Nerde hata var anlamadım.Birde "Fire1" komutu bir sorun yaratabilir belki.

    • yasirkula dedi ki:

      Tüm ateş kodunu AtesEt()’e atmak kısmı yanlış anlaşılmış. Kodun doğru şekli şöyle olacaktır:

      var Bullet : Rigidbody;
      var BulletSpeed = 20;
      var rate : float = 0.5;
      var muzzleFlash : GameObject;
      var sound : AudioClip;
      var reloadtime : float = 4; // this reload time is too long!
      var magcount : int = 10;
      var magbulletcount : int = 21;
      var bulletcount : int = 0;
      private var rate_time : float;
      private var reloadTimer: float = 0.0; // internal reload timer
      
      function Start ()
      {
      	bulletcount = magbulletcount;
      }
      
      function Update()
      {
      	if (reloadTimer > 0){ // if reloadTimer active…
      		Reload();
      	}
      }
      
      function MuzzleFlashOn()
      {
      	muzzleFlash.active = true;
      	yield WaitForSeconds(0.02);
      	muzzleFlash.active = false;
      }
      
      function OnGUI () {
      	GUI.Label (Rect (1235, 825, 100, 250),"" + bulletcount);
      	GUI.Label (Rect (1252, 825, 100, 250),"/" + magcount);
      }
      
      function Shot() {
      	rate_time = Time.time + rate;
      	var mermi=Instantiate(Bullet,this.transform.position,this.transform.rotation);
      	mermi.velocity=transform.TransformDirection(Vector3.forward*BulletSpeed);
      
      	AudioSource.PlayClipAtPoint(sound, transform.position, 1);
      	bulletcount--;
      
      	if (bulletcount == 0) {
      		// if run out of ammo but still have clips…
      		reloadTimer = reloadtime; // activate reloadTimer
      		// you can play reload sound or animation here
      	}
      
      	MuzzleFlashOn();
      }
      
      function Reload() {
      	reloadTimer -= Time.deltaTime;
      	if (reloadTimer <= 0){
      		bulletcount = magbulletcount;
      		magcount--;
      	}
      }
      
      function AtesEt()
      {
      	if( bulletcount > 0 && Time.time > rate_time)
      	{
      		Shot();
      	}
      }
      
    • yasirkula dedi ki:

      Ayrıca eğer GUI butonuna basılı tuttuğunuz sürece ateş edilmesini istiyorsanız “GUI.Button(Rect(90,50,50,50),btnTexture)” kodunu “GUI.RepeatButton(Rect(90,50,50,50),btnTexture)” ile değiştirin.

  6. Berk Yaşar dedi ki:

    GUIButton kodum:

    “public var atesScripti : Ates;
    var btnTexture : Texture;
    function OnGUI() {
    if (!btnTexture) {
    Debug.LogError(“Please assign a texture on the inspector”);
    return;
    }
    if GUI.RepeatButton(Rect(90,50,50,50),btnTexture)
    Debug.Log(“Clicked the button with an image”);
    atesScripti.SendMessage( “AtesEt” );
    }”

    Verilen hata: “http://img202.imageshack.us/img202/2580/fiim.jpg” bu resimde belirtilmiştir.İncelerseniz sevinirim.

    • yasirkula dedi ki:

      “if( GUI.RepeatButton(Rect(90,50,50,50),btnTexture) )” yerine neden “if GUI.RepeatButton(Rect(90,50,50,50),btnTexture)” yazdınız? Hata burada. Ve “AtesEt” kelimesinin sağındaki ve solundaki tırnak işaretlerini silip klavyeyle tekrar oluşturun.

  7. Berk Yaşar dedi ki:

    Yine hatalar var .Hatalar :”http://imageshack.us/a/img841/2545/zimc.jpg” bu urldeki resimde belirttim.Kodumuda bu resimde :”http://imageshack.us/a/img801/3297/ch1c.jpg” eğer bu işi halledersek çok mutlu olacam.İnşallah

  8. berk1966 dedi ki:

    Ama öyle yapmama rağmen “unkown identifier : ‘AtesEt’ ” hatası aldım.

  9. Berk Yaşar dedi ki:

    “Expecting }, found ” ” hatası verdi

  10. Enes dedi ki:

    Merhaba.. ben unity de yeni sayılırım hep yazmaya çizmeye çalıştım ama bu programı build etmeye kalktım ilk defa 🙂 ve Build failure! Unable to locate Android SDK diye hata verdi nasıl düzeltebilirim.. Teşekkürler..

  11. Enes dedi ki:

    Android SDK yı önceden kurduğum için kolay oldu ve hızlı cevabın için teşekkürler 🙂

  12. Berk Yaşar dedi ki:

    Normal mouse kontrolünü nasıl joystick kontrolüne çevirebilirim?

  13. Berk Yaşar dedi ki:

    Sensörlerle aranız iyi galiba.Telefonda oyunu nasıl yatay kullanabilirim?

  14. Berk Yasar dedi ki:

    Bu scripti neye atamamiz lazim?Simdiden veriginiz cevaplar icin tesekkurler.

    • yasirkula dedi ki:

      Oyunun ilk sahnesinde yer alan herhangi bir obje olur. Ya da şöyle yapın script felan gerekmesin: Edit – Project Settings – Player – Per-Platform Settings – Settings for Android – Resolution and Presentation – Default Orientation -> Landscape Left

  15. melihtarik dedi ki:

    Maalesef oyunumun ismi çalışmayı durdurdu hatası alıyorum bunun sebebi ne olabilir .apk build ediyorum ve olduğu gibi android cihazıma atıyorum 2 android cihazda denedim aynı hatayı aldım ?

    • melihtarik dedi ki:

      unity’de otomatik emilatör seçtim oyunu otomatik emilatör atıyor ordada çalışmayı durdurdu hatası alıyorum bunun sorunu ne anlamadım.

      • yasirkula dedi ki:

        Oyunu Unity Editor’de çalıştırırken konsolda çeşitli Error’lar çıkıyorsa onları düzeltin. Error vermiyorsa o zaman bir bilgim yok.

  16. Murat Şimşek dedi ki:

    Şöyle bir hata alıyorum

    • yasirkula dedi ki:

      Build&Run yapıyorsunuz. Bu seçeneği seçince Unity oyunu belirlediğiniz konuma Build eder ve ardından bilgisayarınıza bağlı Android cihazınıza oyunu otomatik olarak yükleyip çalıştırır. Bu seçeneğin istendiği gibi çalışması -hata vermemesi- için dikkat etmeniz gereken hususlar:

      1- Android cihazınızın Developer Options ayarlarında USB Debugging (ve sanırım Allow mock locations) seçili olmalı
      2- Cihazın sürücüleri bilgisayarınıza kurulu olmalı
      3- Cihaz USB kablo ile bilgisayara bağlı olmalı

      Build&Run seçeneği hâlâ hata verirse sadece Build edin. Ardından .apk dosyasını telefonunuza USB kablo ile atıp dosya yöneticisinden bu .apk dosyasına tıklayarak oyunu cihazınıza elle kurun ve öyle test edin.

  17. Murat dedi ki:

    Yasir Bey Merhaba
    Yaptığım android oyununda ekrana dokunma scripti oluşturdum bunu main cameraya atadım raycast yapıp bulduğum objenin OnMouseDown olayını SendMessages ile yolluyorum bu şekilde sorunsuz çalışan uygulamam google play’a attıktan sonra çalışmamaya başladı kabloyla direk atıyorum çalışıyor ama google play ile yükleyince çalışmıyor. neden olabilir

  18. umut dedi ki:

    hocam ben androide yazdığım oyunda telefon ekranını yan çevirdiğimde ekranında dönmesi için ne yapmam lazım

    • yasirkula dedi ki:

      Player Settings-Resolution and Presentation-Default Orientation seçeneğinin değerini değiştirmeniz lazım (Auto gibi bir seçenek olması lazım.).

  19. Furkan dedi ki:

    hocam ben bi araba atıyorum bunun oyunu başlattığında otomatik ilerlemesini istiyorum oyuncu sadece sağa sola hareket etcek.

  20. Furkan dedi ki:

    Yanlız ben bunu otomatik bi türlü ilerletemedim ve birde attığım ne olursa olsun sahneden düşüyor collider atıyorum genede düşüyor anlamadım

    • yasirkula dedi ki:

      Update fonksiyonunda transform.Translate kullanarak otomatik ilerletebilirsiniz. Ayrıca objeyi yere düşmeyene kadar y ekseninde yavaş yavaş yukarı kaldırmayı denemenizi tavsiye ederim.

  21. Emre dedi ki:

    Abi ben birşey sormak istiyorum konuyla alakasız. Şimdi ben android için temple run tarzı bir oyun yapıyorum. Deneme amaçlı 3rd person controllerde deniyorum. Bu modelin oyun başladığı an otomatik olarak koşmasını nasıl sağlayabilirim?

  22. Emre dedi ki:

    Çok teşekkürler abi

  23. Emre dedi ki:

    Bu kodu küp için değil de 3rd person controllere uygulasak çalışır mı?

  24. GUI dedi ki:

    haritada bi yere tıklayınca cameradan tıkladığımız yere doğru top fırltmasını istiyorum nasıl yapabilirim?(android)

    • yasirkula dedi ki:
      for( var t : Touch in Input.touches )
      {
      	if( t.phase == TouchPhase.Began )
      	{
      		var top : Rigidbody = Instantiate( topPrefab, Camera.main.transform.position, Quaternion.identity ) as Rigidbody;
      		top.velocity = Camera.main.ScreenPointToRay( t.position ).direction;
      	}
      }
      

      topPrefab’ında Rigidbody olmak zorunda.

      • GUI dedi ki:

        Bunu update fonksiyonunun içinemi atıcam ve (topprefab) yerine ne yazıcam?

      • yasirkula dedi ki:

        Update(). topPrefab GameObject türünde public bir değişken olacak. Değerine Inspector’dan top objenizi vereceksiniz.

      • GUI dedi ki:

        tmm onu yaptım ama bu scripti nereye atıcam cube atmayız heralde.

      • GUI dedi ki:

        dediğnizi yaptım ve kodu update fonksiyonunun en altına attim ama ınspector paneline bişey gelmedi.kod şöyle:
        var mouseEskiKonum : Vector3;

        function Update ()
        {
        if( Input.GetMouseButtonDown( 0 ) )
        {
        transform.position = Camera.main.ScreenToWorldPoint( Vector3( Input.mousePosition.x, Input.mousePosition.y, 10 ) );
        mouseEskiKonum = Input.mousePosition;
        }
        if( Input.GetMouseButton( 0 ) )
        {
        transform.localScale += ( Input.mousePosition – mouseEskiKonum ) / 100;
        mouseEskiKonum = Input.mousePosition;
        }
        for( var t : Touch in Input.touches )
        {
        if( t.phase == TouchPhase.Began )
        {
        var top : Rigidbody = Instantiate( topPrefab, Camera.main.transform.position, Quaternion.identity ) as Rigidbody;
        top.velocity = Camera.main.ScreenPointToRay( t.position ).direction;
        }
        }
        }

      • yasirkula dedi ki:

        Dedim ama size topPrefab bir değişken olacak diye… Kodun en başına public var topPrefab : GameObject; yazacaksınız.

  25. mehmeterozkan dedi ki:

    Merhaba hocam paylaşım on numara Elinize sağlık.
    Bir sorum var hocam ben android oyun gelitşriiyorum . ekranda random sphere yagıyo yukardan asagı . benım ıstedıgım ekranda o topa dokundugu an topun yok olması fakat input.mouseposition denedim her yolu denedım olmadı yardım edermısınız..

    #pragma strict

    public var zaman: float=0;
    function Start () {
    }

    function Update () {

    zaman=zaman+1;
    if(zaman % 100==0){

    var cube = GameObject.CreatePrimitive(PrimitiveType.Sphere);
    cube.transform.localScale.x=0.1;
    cube.transform.localScale.y=0.1;
    cube.transform.localScale.z=0.1;

    cube.AddComponent(Rigidbody);
    cube.rigidbody.drag=11;
    cube.transform.position = Vector3 (Random.Range(-3.5,3.4), Random.Range(2,7), -2);

    if( ? )
    {
    skor.score +=1;

    }

    }
    }

  26. mehmeterozkan dedi ki:

    küçük bir örnek verirmisiniz anlamadım

    • yasirkula dedi ki:

      function OnMouseDown() {
      skor.score++;
      Destroy( gameObject );
      }

      Üstteki scriptin adı KureyeTikla.js ise kendi scriptinizde cube.AddComponent( KureTikla ); yapacaksınız. Böylece KureyeTikla.js scripti küreye atanacak ve artık küreye tıklayınca küre yok olacak.

  27. mehmeterozkan dedi ki:

    Tamam oldu hocam .. Script içindeki Start() ve Update () silince oldu Teşşekür ederim Bir de oyunun yatay oynmasını ıstıyorum hocam o nasıl olacak suan benım dık sekılde oynuyor.

  28. Erdinç dedi ki:

    yalnız sanırım “Touch” yapısını açıklarken bir hata var o yapı “Struct” türünde değil enumeration yani “enum” yapısında yanlış yazmışsınız.

  29. recep dedi ki:

    kardeşim şöyle bir hata alıyorum — Error building Player: Win32Exception: ApplicationName=’C:/Android/android-sdk\tools\zipalign.exe’, CommandLine=’4 “C:\Users\asd\Documents\New Unity Project 1\Temp/StagingArea/Package_unaligned.apk” “C:\Users\asd\Documents\New Unity Project 1\Temp/StagingArea/Package.apk”‘, CurrentDirectory=’Temp/StagingArea’ — sebebi ve çözümü nedir yardım edermisin

  30. recep dedi ki:

    kardeşim öncelikle hızlı cevabın için teşekkür ederim bu arada çözümü vereyim bizimde faydamız olsun build-tools içindeki zipalign.exe yi tools un içine kopyalıyoruz…iyi günler

  31. ibrahim dedi ki:

    flappy birdteki gibi karakterin zıplamasını nasıl yapıyoruz

    • yasirkula dedi ki:

      rigidbody.AddForce olabilir, transform.Translate olabilir, bir zıplama animasyonunu animation.Play ile oynatmak olabilir… Seçenek çok.

      • ibrahim dedi ki:

        ben yeni başladım bu yüzden pek birşey bilmiyorum şu anlık daha ana menüyü ve geçişleri yaptım animasyon yapımı nasıl oluyor bunla ilgili bir video yada bir yazı yazacakmısınız

      • yasirkula dedi ki:

        Hayır animasyon konusu ilgimi çekmiyor.

  32. gökhan dedi ki:

    (Input.GetAxis(“Vertical”) bu komutu androidde nasıl çalıştırabilirim (ekranda bir guı objesine dokununca çalışmasını istiyorum)

  33. enes dedi ki:

    Merhaba yasir abi benim bi sorum var şimdi ben bi fps yaptım tamamladım herşeyi bunun fire1, w, a, s, d veya left shift gibi tuşları var her şey tamam ama birtek bu sorunum kaldı sağda solda pek bi bilgi bulamadım çoğu ingilizce bendeki ingilizcede lise düzeyi çıkamıyorum içinden bu tuşları nasıl dokunmatik butona çeviricem yarrdımcı olun lütfen bmyle bi konunuz varsa link atarmısınız

  34. enes dedi ki:

    abi aslında merak edilen ve değinilmeyen bi konu. klavye tuşlarını dokunmatik butona çevirmeyle alakalı bi konu açsanız baya faydalı siteye yakışır bişey olur

  35. halis dedi ki:

    abi klavyede yapma olayı biraz daha rahat oluyor en azından dokunmatik ekranda bir cismi butonlarla nasıl sağa sola hareket ettireceğiz koda dökseniz çok sağolun şimdiden.

    • yasirkula dedi ki:

      Ekranın sağ yarısına dokununca sağa doğru, sol yarısına tıklayınca sola doğru hareket edebilirsiniz. Kod şuna benzer:

      for( var t : Touch in Input.touches )
      {
      if( t.position < Screen.width * 0.5f ) // ekranın sol yarısına tıklıyoruz
      {
      //sola hareket etme kodu
      }
      else // ekranın sağ yarısına tıklıyoruz
      {
      //sağa hareket etme kodu
      }
      }

  36. halis dedi ki:

    Hocam kusura bakmayın bir sorum daha olacak ben unity de android için apk çıkardığımda (uygulamaadı.apk.lnk) diye çıkarıyor ve bunu android cihaza atıp çalıştırmaya başladığımda ***bu eylemi gerçekleştirecek uygulama bulunmadı diyor***** sorun nedir yardımcı olabilirmisiniz Teşekürler.

    • yasirkula dedi ki:

      Bu sorunu yaşayan birini daha önce duymadım ve çözümü bilmiyorum. Ama dosyanın uzantısını .lnk’den .apk’ya çevirmeyi deneyebilirsiniz.

      • halis dedi ki:

        Eclipse ortamında Androide herhangi bir uygulama yaptığında bilgisayara samsung kies kurup her yaptığının apk sını çıkarmadan önce android cihazı usb kablosu ile bağlayıp play dediktan sonra cihazda Çalışıyormu veya nasıl bir görüntü var bakabiliyorsun. Unity de bu işlemi nasıl yapabiliriz acaba(lnk uzantısı işe yaramadı olmuyor)

      • yasirkula dedi ki:

        Unity Remote diye bir Android uygulaması var, o işinize yarayabilir. Nasıl çalıştığını bilmiyorum.

  37. muhammed dedi ki:

    Selamun aleyküm cok degerli bir oyun yapmaktayim size iki tane sorum olacakti cevaplarsaniz sevinirim =)
    1.ben 2d characterimi unity asset store dan aldim bedava 😀 acaba bu karakteri kullanarak Google Play store’a yayinlarsam sucmu islerim yoksa normalmi tesekkürler.

    ve bu touch(dokunmatik) cok ugrastim ingilizce almanca türkce aradim vs. hic yapamadim
    karakterim platform üzerinde oldugu icin sadece x ekseninde yürümesi gerek siz isinlanma yapmissiniz rica etsem birde saga sola tus koyarak onlara basarak karakteri yürütmeyi anlatabilirmisiniz lütfen tesekkür ediyorum.

    siteniz cok güzel =)

    • yasirkula dedi ki:

      1- Belki olabilir. Asset Store’da modelin lisans bilgilerini bulmaya çalışın.
      2- rigidbody.AddForce ile hareket edebilirsiniz sanırım. Bu konuyu anlatamam, ben de pek bilmiyorum.

      • muhammed dedi ki:

        Hizli Cevap Verdiginiz icin tesekkür ederim öncelikle.
        ben bir script kullaniyorum (unity tutorials) da buldum cok güzel hersey cok iyi calisiyor animasyon da yaptim hiz arttiginda yürümeye basliyor fakat bu scriptte a ve d veya tuslariyla yürüyor bunun hic mi dokunmatik yapamayiz ? 😦
        örnegin gui texture 2 tane yaparak sag sol yerlestirsem ve bu scriptin icine bikac kod yazmakla falan filan olurmu ;(

        public class PlayerController : MonoBehaviour {

        blablabla…
        void Update () {
        blablabla…
        float moveSideways = Input.GetAxis (“Horizontal”);
        Vector3 movement = new Vector3 (moveSideways, 0.0f, 0.0f);
        rigidbody.AddForce (movement * sideSpeed * Time.deltaTime);
        transform.position += Vector3.forward * speed * Time.deltaTime;
        }
        blablabla…
        }

        tesekkür ederim sabirsizlikla cevabinizi bekliyorum

      • yasirkula dedi ki:

        Sol GUITexture’yi “public GUITexture solTexture;” değişkenine, sağ GUITexture’yi de sagTexture değişkenine değer olarak atayın. Sonrasında “float moveSideways = Input.GetAxis (“Horizontal”);” satırını şununla değiştirin:

        float moveSideways = 0f;

        foreach( Touch t in Input.touches )
        {
        if( solTexture.HitTest( t.position ) )
        moveSideways = -1f;
        else if( sagTexture.HitTest( t.position ) )
        moveSideways = 1f;
        }

  38. muhammed dedi ki:

    Olmuyor Olmuyor Olmuyor!!!!!!!!!!!!1
    ben touch yapamicam galiba birakacam bu oyun isini 😦 okadar yaptim bi touch yapamiyorum yha ekledim dediklerinizi hatayi da giderdim deger olarak da atadim basiyorum maus la üstüne haraket bile etmiyor… off

    • yasirkula dedi ki:

      Mouse ile çalışmaz. Dokunmatik ekranda çalışır sadece.

      Eğer hemen pes edecekseniz gerçekten bırakın oyun işini. Eğer oyun yaparken takıldığınız noktaları araştırmıyor, oyun yapım sürecinden bir zevk almıyorsanız boşuna kasmayın derim.

  39. muhammed dedi ki:

    haaa tamam kusura bakma yasir abi 😀 yok ben pes etmem cünki 1 yildir htc one m8 hayali kuruyom 😀 onu almam icin bu oyunu yapiyorum ads ten para kazanirim insallah 😛

  40. murat dedi ki:

    abi ben bi fps yapıyorum şuan ama kamera rotasyonunu yapamıyorum ekranın herangibi yerinden sürükleyince kamera döncek(dead triger gibi) belli açıları olacak ama yapamadım elinizde kamera rotasyonuyla alakalı script varmı

  41. Emir dedi ki:

    Ben koşu oyunu yapıyorum scriptsde zıplamak için atanan tuş space androidde bunun karşılığı ne oluyor?

    • yasirkula dedi ki:

      Karşılığı yok. Ancak kodu düzenleyerek karakterin ekrana tıklandığı zaman zıplamasını ayarlayabilirsiniz.

      • Emir dedi ki:

        sağolun

      • Emir dedi ki:

        if ((Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space)) && m_playerJump <= -1.0f && m_playerSlide <=0.0f)
        {
        AudioSource.PlayClipAtPoint(m_jumpAudio, m_player.transform.position);
        m_playerJump = 1.0f;
        m_playerYvel = 0.0f;
        m_player.animation.Play("jump");
        }

        peki bu komutu nasıl düzenleyip androide uyarlıyabilirim?

      • yasirkula dedi ki:

        Ekrana tıklayınca zıplaması için if’i şöyle değiştirmelisiniz: if( Input.GetMouseButtonDown(0) && m_playerJump <= -1.0f && m_playerSlide <=0.0f )

  42. günay dedi ki:

    SELAMUN ALEYKUM

    hocam verdiğiniz linki açtım bütün yazıları okudum ama halen anlayamadım.biraz acemiyim.

    if( Input.GetMouseButtonDown(0) && !engeleCarptim && Input.mousePosition.x < Screen.width /2 )

    sizin söylediğiniz kodu kullanarak sadece sol tarafta çalıştırabildim ama bana aynı anda tıklayınca çalışması lazım.Mesela ekranı ikiye bölüyorum.1.player sol tarafa 2.player sağ tarafa bunun içince touch kullanmam gerek herhalde.

    if( Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began && !engeleCarptim )

    touch için nasıl sol/sağ tarafa alacağım

  43. günay dedi ki:

    evet hocam teşekkürler oldu ama şimdide multitouch desteklemiyor

  44. günay dedi ki:

    Input.touches yaptıgım zaman multitouchmu oluyor

    • yasirkula dedi ki:

      Input.touches bir array’dir ve ekrandaki tüm parmakları barındırır. Bu parmaklar üzerinde tek tek işlem yapabilirsiniz, böylece multi-touch olmuş olur.

  45. günay dedi ki:

    hocam facebookda kabul etseniz olurmu

  46. günay dedi ki:

    hocam yönlendirdiğiniz sayfaya baktım baştan aşağı okudum.aşagıdaki kod dogrumu acaba.multitouch için

    #if UNITY_ANDROID
    for( var parmak : Touch in Input.touches )
    {
    if( Input.touchCount == 1 && parmak.phase == TouchPhase.Began && !engeleCarptim && Input.GetTouch(0).position.x < Screen.width / 2 )
    {
    gravity = true;
    Camera.main.GetComponent(Engeller).enabled = true;
    dikeyHiz = ziplamaGucu;
    audio.PlayOneShot( kanatSes );
    }
    #endif

    • yasirkula dedi ki:

      Rica ediyorum yazdığınız kodu bir okuyun. (Input.touchCount == 1) demek o if’in sadece ekranda bir tane parmak varken çalışması demektir. Multi-touch ise birden çok parmağı idare etmek anlamına gelmekte. Nasıl multi-touch desteklesin ki :/

  47. günay dedi ki:

    if( Input.touchCount > 0 && Input.GetTouch(Input.touchCount-1).phase == TouchPhase.Began && !engeleCarptim && Input.GetTouch(Input.touchCount-1).position.x > Screen.width / 2 ) bu dogru değilmi

  48. günay dedi ki:

    hocam şimdi çalıştı neden hayır dediniz acaba.kodda sıkıntı mı var

  49. günay dedi ki:

    hocam abimle denedik olmamış.tam olarak nasıl yapmam lazım

    #if UNITY_ANDROID
    for( var parmak : Touch in Input.touches )
    {
    if( Input.touchCount > 0 && parmak.phase == TouchPhase.Began && !engeleCarptim && Input.GetTouch(0).position.x < Screen.width / 2 )
    {
    gravity = true;
    Camera.main.GetComponent(Engeller).enabled = true;
    dikeyHiz = ziplamaGucu;
    audio.PlayOneShot( kanatSes );
    }
    #endif

    • yasirkula dedi ki:

      Soldaki karakter için kod:

      for( var parmak : Touch in Input.touches )
      {
      if( parmak.phase == TouchPhase.Began && !engeleCarptim && parmak.position.x < Screen.width / 2 )
      {
      gravity = true;
      Camera.main.GetComponent(Engeller).enabled = true;
      dikeyHiz = ziplamaGucu;
      audio.PlayOneShot( kanatSes );
      }
      }

      Sağdaki karakterin kodunu kendiniz yazarsınız.

  50. günay dedi ki:

    sağdakinide > işareti yaparakmı kaydedeceğim.

  51. Emre dedi ki:

    abi ben şöyle birşey yapmak istiyorum. telefonda nereye dokunursam küp oraya doğru kaysın yani ışınlanmasın yavaş yavaş gitsin oraya sağa veya sola. Bunu nasıl yapabilirim

    • yasirkula dedi ki:

      Dokunduğunuz noktanın koordinatını öğrenmek için Raycast fonksiyonuna parametre olarak girilen RaycastHit değişkeninin point değerini okuyun.

      Artık hedef noktayı bildiğinize göre ona doğru hareket etmeyi de siz halledebilirsiniz.

  52. nuri dedi ki:

    hocam android oyunda butonmu daha iyi olur yoksa bu dokunmatik işlevi mi?

    • nuri dedi ki:

      buton UI bu arada..

      bide meselea örnek verirsek ekrana dokunuldugunda topun kaybolmasını istediğimizde

      for( var parmak : Touch in Input.touches )
      {
      if( parmak.phase == TouchPhase.Began)
      {

      Destroy ( top );

      }
      }

      bunu yapmak yeterli olurmu bu kadar mı yani?

    • yasirkula dedi ki:

      İlk sorunuzun cevabı oyundan oyuna değişir, buna siz karar verin. İkinci sorunuzda verdiğiniz kod ise doğrudur.

  53. kadir dedi ki:

    Çok faydalı bi yazı olmuş eline sağlık . Peki biz küpün sağa bastığımızda sağa sola basatığımızda sola gitmesini nasıl sağlayabiliriz? (ışınlanmadan)

  54. nuri dedi ki:

    hocam bu fingerID hakkında basit bi örnek kod yazabilirmisiniz.teşekkürler.

    • yasirkula dedi ki:

      Ekrana birden çok parmak dokunsa da sadece ilk parmağın konumunu dikkate almak istiyoruz diyelim:

      var fID : int = -1;
      
      function Update()
      {
      	for( var t : Touch in Input.touches )
      	{
      		if( t.phase == TouchPhase.Began && fID == -1 )
      			fID = t.fingerID;
      		else if( ( t.phase == TouchPhase.Ended || t.phase == TouchPhase.Canceled ) && fID == t.fingerID )
      			fID = -1;
      		if( t.fingerID == fID )
      		{
      			// ekrana ilk dokunan parmaktayız, burada onun üzerinde işlem yapabiliriz.
      		}
      	}
      }
      
      • nuri dedi ki:

        “t.fingerID” “t.fingerId” şeklinde olacak sanırım öbür türlü hata veriyor diğer arkadaşlar için.

        sağolun hocam çözdüm sonunda yardımınız sayesinde.

  55. nuri dedi ki:

    bide karakteri herhangi birşeyin poziyonuna doğru nasıl fırlatabiliriz?
    addForce yada başkabirşeyle

    • yasirkula dedi ki:

      Diğer GameObject obje2, bizim GameObject obje1 olsun. İki obje arasındaki yön vektörünü obje2.transform.position – obje1.transform.position işlemiyle buluyoruz.

  56. nuri dedi ki:

    hocam cevaplarınız için teşekkür ederim.
    birşey daha sormak istiyorum.
    bir obje var mesela mouse ya basıldığında obje2nin pozisyonuna yavaşça nasıl ışınlayabiliriz yani yavaş yavaş obje2 nin pozisyonuna nasıl getirebilirim

    • yasirkula dedi ki:

      public var kaymaMiktari : float = 0.1f;
      function Update()
      {
      if(Input.GetMouseButtonDown(0))
      transform.Translate( ( obje2.transform.position - transform.position ) * kaymaMiktari );
      }

      Burada Translate fonksiyonu her çalıştığında obje1 ile obje2 arasındaki mesafenin 1/10’u kadarı obje1 tarafından katedilir (kodun obje1’de olduğunu varsayarsak).

      • nuri dedi ki:

        tmmdır hocam çok sağolun sayenizde oldu.

      • nuri dedi ki:

        aynı şekilde rotate nasıl oluyor

        transform.Rotate( (obje2.transform.rotation – transform.rotation) ) * kaymaMiktarı );

        şeklinde yapınca hata veriyor

      • yasirkula dedi ki:

        rotation yerine eulerAngles yazabilirsiniz. Ancak çalışıp çalışmayacağını bilmiyorum.

  57. çaylak dedi ki:

    class Dokun ..
    void Update(){ if (Input.touchCount == 1) {
    transform.Translate(Input.touches[0].deltaPosition.x*0.04f,Input.touches[0].deltaPosition.y*0.04f,0);}}

    hocam misal jenga oyunu yapıyoruz dokunduğumuz taşı çekicez ilk oyuna girdiğimde sıkıntı yok kübü istediğim eksen doğrultusunda çekiyor fakat camera acısını değiştirdiğimde yine kübün local eksenine göre hareket ediyor . bu hareketi kameranın acısı ne olursa olsun çektiğimiz eksen doğrultusunda gelmesini nasıl sağlarız.kontrolüde şu scriple sağlıyorum
    public Dokun dkn;
    void Start(){dkn = gameObject.GetComponent();}
    void OnMouseDrag(){dkn.enabled = true;}
    void OnMouseUp(){dkn.enabled = false;}}

  58. çaylak dedi ki:

    public float vec=0f;

    void Update(){if (Input.touchCount == 1) {
    vec= Input.touches[0].deltaPosition.x*0.04f;
    transform.Translate( Vector3.right *vec ,Camera.main.transform);}
    sonunda buldum transform.translatenin bu parametreleri kamera netarafa dönerse dönsün touch pozisyonunu hareketini paralel şekilde sağa sola hareket etmesini sağlıyor kullanışlı bi özellik.

  59. wilson dedi ki:

    Assets/k�p.js(8,5): BCE0005: Unknown identifier: ‘parmak’. böyle bir hata alıyorum yardımcı olur musunuz?

  60. wilson dedi ki:

    Tamam çok teşekkürler düzelttim.

  61. yunusemre dedi ki:

    Abi bir soru dah sormak istyorem omcollisionenter komutu coildera değincemi yoksa objeyemi değince calisir bu komutla yapay zeka yapmk istiyorumda

    Void OnCollisionEnter(Collision col)
    {
    if(col.gameobject.tag == “duv”)

    {
    animation.play (koşma anmimasyonu)
    asker.transform.translate , biz.transform.translate
    }
    }
    Gibi abi bu konuda yrdim edersen sevinirim

    • yunusemre dedi ki:

      Hatalarımı düzeltirsen sevinirkm bu arada bix colider trigger olacak

    • yasirkula dedi ki:

      OnCollisionEnter fonksiyonu, “Is Trigger”ı kapalı collider’a çarpınca çalışır. OnTriggerEnter ise “Is Trigger”ı açık collider’a çarpınca çalışır.

      void OnTriggerEnter( Collider col )
      {
      if(col.gameObject.tag==”duv”)
      {
      animation.Play(“KosmaAnim”);
      askeri translate;
      bizi translate;
      }
      }

  62. yunusemre dedi ki:

    Abi peki update fonksiyonuna yazdigimiz bir işlemi 5saniyede bir nasıl yapariz
    colider icine girince canı 5 saniyede bir azalsın istiyorum

    • yasirkula dedi ki:

      Bir float olur ve bunun değeri Update’te Time.deltaTime kadar artar. Değişkenin değeri 5’ten büyük eşit olduğu vakit karakter hasar alır. Collider’ın içinde olup olmadığımızı anlamak için bir boolean’ın değeri OnTriggerEnter’da true, OnTriggerExit’ta false yapılabilir.

      • yunusemre dedi ki:

        Abi bu işlemi nasıl bi kodla yaparım

      • yasirkula dedi ki:

        void OnTriggerEnter
        boolean=true

        void OnTriggerExit
        boolean = false

        void Update
        float += Time.deltaTime
        if( float >= 5 && boolean == true )
        {
        canı azalt
        float = 0
        }

  63. yunusemre dedi ki:

    Abi canı azalt kısmını nasıl yapıcaz onu anlamyamadım

  64. Gamer dedi ki:

    ABi time.deltatime ı void update yazarsam sürekli süre artıyor fakat ben sadece colidera girince artamsını istiyorum ontriggerentere yazarsam colidera girip çıkınca canım 5 eksiyor

    if( mlk >= 5 && saldırı == true )
    {
    Can -= 5;
    }
    bu kısmıda ontriggera attım çünkü update deyken sürekli canım 5 eksiliyor abi bu sorunu nasıl çözerim şuan ki kodum

    using UnityEngine;
    using System.Collections;

    public class atak : MonoBehaviour {
    public bool saldırı ;
    public float Can = 100;
    public float mlk = 0;
    public GameObject karakter;

    // Use this for initialization
    void Start () {
    saldırı = false;
    }

    // Update is called once per frame
    void Update () {
    mlk += Time.deltaTime;

    if (Can = 5 && saldırı == true )
    {
    Can -= 5;
    }
    }
    void OnTriggerExit ()
    {
    saldırı = false;
    }
    }

    • Gamer dedi ki:

      canın sürekli azalması sorununun çözdüm

      mlk += Time.deltaTime;

      if (Can = 5 && saldırı == true )
      {
      Can -= 5;
      mlk = 0;
      }

      kodu böyle değiştirdim fakat sayacın colidera girince çalışmasını istiyorum bu sorunu nasıl çözebilirim

  65. nuri dedi ki:

    hocam kolay gelsin
    “level1” , “level2” , “level3”
    adında 3 level var
    ana menü ekranında başlata basıldığında bu 3 levelden rastgele birisini nasıl başlatabilirliz
    random kodunu burda nasıl kullanıyoruz

    • yasirkula dedi ki:

      if( Random.Range(0, 2) == 0 ) // 0 ya da 1 döndürür
      level1 aç
      else if( Random.Range(0, 2) == 0 ) // 0 ya da 1 döndürür
      level2 aç
      else
      level3 aç

  66. Developer dedi ki:

    andriod için c# script kodum var ama 2D uygulama açınca çalışıyor 3D uygulama açınca çalışmıyor nedeni ne olabilir? Teşekkürler..

    • yasirkula dedi ki:

      Aldığınız hataya bağlı.

      • Developer dedi ki:

        Hata almıyorum. Daha açmam gerekirse, 3D bi oyun yapmam gerek ve androidde ekrana düz çizgi çizdirmem gerek. Elimdeki kod 2D bi proje açıp denediğimde çalışmasına rağmen 3D projede çalışmıyor. Nedenini anlayamadım. Yardımcı olursanız çok sevinirim uzun süredir uğraşıyorum ama çözemedim. Kod şu hocam:

        using UnityEngine;
        using System.Collections;

        public class cizik : MonoBehaviour
        {

        private LineRenderer line;

        private Vector3 mousePos;

        public Material material;

        void Update ()
        {

        foreach (var parmak in Input.touches) {
        if (parmak.phase == TouchPhase.Began) {

        if (line == null) {

        createLine ();
        }

        mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);

        mousePos.z = -10;

        line.SetPosition (0, mousePos);
        line.SetPosition (1, mousePos);
        }

        else if (parmak.phase == TouchPhase.Ended && line) {
        mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
        mousePos.z = -10;
        line.SetPosition (1, mousePos);

        }

        else if (parmak.phase == TouchPhase.Moved && line) {
        mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
        mousePos.z = -10;

        line.SetPosition (1, mousePos);
        }
        }
        }

        private void createLine()
        {

        line = new GameObject(“Line”).AddComponent();
        line.material = material;
        line.SetVertexCount(2);
        line.SetWidth(0.06f,0.06f);
        line.useWorldSpace = true;

        }
        }

  67. Developer dedi ki:

    Sebebini kendi kendime çözdüm. Kamerayı perpective yerine orthographic yapınca düzeldi. Yine de saçma geldl bana.

  68. Yunus kara dedi ki:

    Abi birşey sorabilirmiyim bir animasyonun bir durumda sürekli oynamasını ve de bir kez oynayıp bitmesini nasıl sağlarız

    • yasirkula dedi ki:

      Animasyon asset’ini seçince animasyonun türüne göre (Legacy veya Mecanim) Inspector’da şu iki değerden biri belirecek:

      Loop Time: değeri true olursa animasyon kendisini tekrar eder, false olursa animasyon bir kere oynayıp durur.
      Wrap Mode: değeri Loop olursa animasyon kendisini tekrar eder, Once olursa animasyon bir kere oynayıp durur.

  69. Yunus kara dedi ki:

    Abi network bilgin varmı http://createathingunity.blogspot.co.uk/ bu sitede bir kod buldum am guı button larla calısıyor ve hic birsey anlayamadim yardim edermisin lutfen kfayi yedim

  70. Yunus kara dedi ki:

    Abi bir soru daha sorucam bir işlem olduğunda ekranda bkruı text beliresini nasıl sağlarım mesela adamın kafasına box colider koyup headshout scipriti yazdım vurunca adam ölüyor ölünce uı text belisin ve 2-3 saniye sonra kaybolsun istiyorum

    • yasirkula dedi ki:

      UI’ın içindeki bir scriptte Start fonksiyonu içerisinde Destroy(gameObject, 2.0f); komutu yer alır. Ardından headshot olduğunda Instantiate ile bu UI objesi oluşturulur. Bunun için UI’ı prefab yapmanız lazım.

  71. Yunus kara dedi ki:

    Abi yine ben 😀 abi bir silah scipritim var mermiyi her instaniate ettiğinde uı textteki sayı nin azalmasini nasil sağlarim

    • yasirkula dedi ki:

      Ateş etme fonksiyonu her çalıştığında
      1) UI Text’in değerine String olarak erişmek için: GetComponent(UnityEngine.UI.Text).text
      2) Bu String’i int’e çevirmek için: google “unity string to int”
      3) Ardından int değeri 1 azaltmak için: değişken = değişken – 1
      4) UI Text’e yeni değerini vermek için: GetComponent(UnityEngine.UI.Text).text = “” + değişken

      • Yunus kara dedi ki:

        Abi bayada karışık biraz açıklanrmısın getcomponent diyoruz ama hangi gameobject e yapıcaz bide bir sorum daha olacak abi animation.Play yazınca hata oluşuyor kod çalışmıyor

      • yasirkula dedi ki:

        UI Text objesinde yazabilirsin GetComponent’i. animation için objede Animation component’i olmak zorunda ve bu component’te kullanacağın animasyonlar da listelenmiş olmak zorunda.

  72. Yunus kara dedi ki:

    Abi animation.play kodunu algılamayo unity eskiden oluyordu ama şimdi olmuyor

  73. Sefa DOĞAN dedi ki:

    İyi günler eğitimleriniz çok faydalı ama bir şey daha sormak istiyorum ben sahneme Canvas koydum maksat onun üzerinde Uİ butonlar koyarken ölçülü olsun fakat canvas kare oluşuyor eskiden dikdörtgen oluşurdu ve oyun açılınca o boyutta olurda imdi değişti boyutları ve android tabanlı oyun yapıyorum en uygun boyutlar nedir ve nasıl ayarlarım

    • yasirkula dedi ki:

      2D canvas hep ekran ile aynı boyuttadır. 2D canvas’larda “UI Scale Mode”u “Scale With Screen Size” yaparsanız ekranın boyutu değiştikçe arayüz de aşağı yukarı aynı şekilde kalacaktır.

  74. mehmet eren ballı dedi ki:

    smartface app studio’da javascriptle program yazmayı istiyorum.amacım telefonda boş ekrana tıklayınca alert yoluyla uyarı verdirmek.butona tıkladığında bunu yap metodunun ekrana dokunma versiyonu yani.ilk olarak deneme için bunu yapmak istiyorum.yardımcı olursanız sevinirim.

    • yasirkula dedi ki:

      Ekrana tıklayınca bunu algılamak Unity’de çok kolay ama Smartface App Studio’yu hiç kullanmadığım için onda nasıl yapılır bilmiyorum.

  75. ekrem dedi ki:

    hocam iyi günler ben unity de bir oyun yaptım ama apk cıktısı alırken su hatayla karşılaşıyorum ve cözemedim hata Array index is out of range

    • yasirkula dedi ki:

      Bu hata array’in kapasitesinden büyük bir index’teki elemana erişmeye çalışırken olur (örneğin 2 elemanlı array’in 3. elemanını erişmeye çalışınca). Build alırken olması gerçekten garip geldi.

  76. maliyazici dedi ki:

    Öncelikler Selamun Aleykum
    Ben unıty nin kendi 2D characterini kullanarak bir oyun yaptım.
    Bu oyunu android için yaptım bu bir koşu oyunu surekli adam koşuyor.
    Ama zıplamayı ayarlayamadım android için 2d character e ne scripti yazıp eklemem lazım yardım edermisin ?

    • yasirkula dedi ki:

      rigidbody.AddForce veya CharacterController.Move kullanabilirsiniz. Belki basit bir animasyon kullanmak bile yeterli olabilir. Unity’nin 2D karakterini kullanmadığım için kesin birşey diyemiyorum.

      • maliyazici dedi ki:


        bak bu benim uzerinde duzenleme yaptıgım unıty nin character controller ı benım buna tam olarak ne eklemem lazımki bu oyun androidde ekrana tıklandıgında zıplasın tam ne eklemem lazım ya tam kodu söyleyemezmisin yardım edersen çok sevinirim bu sorun çözuldugu an google play e koyıcam oyunu.

      • yasirkula dedi ki:

        m_Jump = Input.GetMouseButtonDown(0); deneyebilirsin.

      • maliyazici dedi ki:

        m_Jump = Input.GetMouseButtonDown(0); bu kod pc de işe yaradı androidde yaramadı

  77. maliyazici dedi ki:

    http://i.hizliresim.com/0kYy7Y.jpg buda controller ın resmi ne eklersem android de tıklayarak zıplar

  78. oguz dedi ki:

    hocam 2d bir Android basketbol oyunu tasarladım pota ve toptan oluşan ancak sadece tek bir şey kaldı yayınlamam için başlangıçta top durgun halde ve ben parmağımla topu tutup potaya fırlatmak istiyorum(mesela yavaş sürüklersem yavaş gitsin yönü biz seçelim vs) bir kod örneği olur fikir olur yardım ederseniz çok sevinirim iyi çalışmalar

  79. Burak GÜNDÜZ dedi ki:

    S.a. Hocam çok güzel bir şekilde açıklıyorsunuz emeğinize sağlık. Benim android touch entegrasyonu anlatımınızla ilgili bir sorum olacak. Anlattığınız touch kütüphanesiyle ekranın belli noktasına tıklamayı aldık, hareket ettiğini algıladık hatta yukarı-aşağı ayırt ederek. Peki parmağı kaldırmadan, basılı tutarak önce yukarı sonra aşağı hareket ettirdik ve her hareketin ayrı, yani aşağı kaç birim gitti, yukarı kaç birim gitti şeklinde alabilir miyiz? Teşekkürler.

    • yasirkula dedi ki:

      Zor bir soru olmuş. İlla ki dediğiniz gibi birşey yapılır ancak algoritmasını tam tahmin edemiyorum. Parmak ekranda olduğu sürece genelde çok ufak da olsa hareket eder, yani parmağı ekranda ne kadar sabit tutmaya çalışsanız da genelde orada 1-2 pixellik oynamalar olur. Bir parmak hareketinin kasıtlı olarak yukarı veya aşağı olup olmadığını anlamak için belli zaman aralıklarında son iki parmak position’larının farkının y değerine bakmalısınız. Bu değer 0’dan çok büyükse parmak o zaman aralığında yukarı çıkmıştır, yoksa aşağı inmiştir.

  80. mahmut dedi ki:

    Daha kolay kod yazmayi istiyorum onun icinde program gerekli bana en kolay kod yazma programi bulamazmisiniz bu işi anladiginiz için size sordum lutfen

    • yasirkula dedi ki:

      Visual Studio’yu beğenenler var. Ben Notepad++ kullanıyorum çünkü çok hızlı açılıyor, ancak VS kadar detaylı bir kod editörü değil.

  81. ahmet dedi ki:

    Merhabalar kusura bakmayın bir sorum olacaktı: Ben bir tane karekter hazırladım ve bunun animasyon hareketleri(yürüme,koşma,dönme ) bunları yaptım ve bunu bilgisayarda çalıştırdığımda animasyonlar çalışıyor.(Adım atma,koşma gibi) ben bunu telefonda oluşturduğum butonlar sayesinde yapmak istiyorum ama tam olarak nasıl olacağını anlamadım. Yardımcı olma imkanınız varmı. Teşekürler.

    bilgisayarda bu kadarla animasyonlar hareketler herşey tamam çalışıyor.

    ******
    #pragma strict

    internal var animator:Animator;
    var v:float;
    var h:float;
    var sprint :float;//koşma

    function Start () {

    animator=GetComponent(Animator);

    }
    function Update () {

    v=Input.GetAxis(“Vertical”);
    h=Input.GetAxis(“Horizontal”);
    Sprinting();
    }
    function FixedUpdate()
    {
    animator.SetFloat(“walk”,v);
    animator.SetFloat(“Turn”,h);
    animator.SetFloat(“Sprint”,sprint);

    }
    function Sprinting()
    {
    if(Input.GetButton(“Fire1”))
    {

    sprint=0.2;
    }
    else{
    sprint=0.0;
    }

    }
    ******

    • yasirkula dedi ki:

      Bu scripte şu kod eklenecek:

      function MoveUp() { v = 1.0; }
      function MoveDown() { v = -1.0; }
      function MoveLeft() { h = -1.0; }
      function MoveRight() { h = 1.0; }

  82. ahmet dedi ki:

    şu kodlarla ekranda var olan bir tane nesneyi sadece normal ilerleme hareketleri yaptırabiliyorum. ben bilgisayarda çalışan yukardaki sistemi bu butonlarla karektere nasıl uygulayabilirim

    #pragma strict

    var walkSpeed:float = 9;

    private var Controller:CharacterController;

    private var motion:Vector3;//motion=hareket

    function Start() {

    Controller = GetComponent(CharacterController);

    }

    function Update() {

    if(Input.GetKeyDown(KeyCode.Escape)) {
    Application.Quit();
    }

    }

    function MoveLeft() {

    motion = transform.TransformDirection(Vector3.left) * walkSpeed * Time.deltaTime;

    Controller.Move(motion);

    }

    function MoveRight() {

    motion = transform.TransformDirection(Vector3.left) * walkSpeed * Time.deltaTime*-1;

    Controller.Move(motion);

    }

    function MoveUp() {

    motion = transform.TransformDirection(Vector3.forward) * walkSpeed * Time.deltaTime;

    Controller.Move(motion);

    }

    function MoveDown() {

    motion = transform.TransformDirection(Vector3.forward) * walkSpeed * Time.deltaTime*-1;

    Controller.Move(motion);

    }

    function MoveRotation(angle:Vector3) {

    transform.rotation = Quaternion.Euler(0, angle.y * ButtonController.cameraRoateSpeed, 0);

    }

  83. ahmet dedi ki:

    bunlarda buton çizimleri ve kamera hareketleri ….

    #pragma strict


    function Update() {
    TouchNone();
    if(Input.touches.Length > 0) {
    for(var i:int=0; i<Input.touchCount; i++) {
    var touch:Vector2 = Vector2(Input.GetTouch(i).position.x,(Screen.height-Input.GetTouch(i).position.y));
    TouchButtonCheck(touch);
    TouchRotate(touch, i);
    }
    }
    }

  84. ahmet dedi ki:

    Ben bunu daha önce sordum mantığını anlatınız uygulamaya çalıştım ama yapamadım.Biraz daha kapsamlı bir şekilde açıklamaya zamanınız varsa yardımcı olursanız çok iyi olur.Şmdiden teşekürler

  85. ahmet dedi ki:

    Hoacam aynısını yaptım şimdi sadece sprint koşma animasyonu yukarı buttonla çalışıyor diğer 3 tane buton etkisiz neden acaba.(Sizi sürekli rahatsız ettiğmizden dolayı kusura bakmayın.Tüm yardımlarınız için saolun.)

  86. ahmet dedi ki:

    Pardon yanlış saöyledim 1 tane butona basıldığında koşma animasyonu çalışıyor tamam ama diğer 3 tane buton animasyonları çalıştırmadan sağa ,sola ve geriye sadece normal ilerleme var animasyon aktif olmuyor

  87. ahmet dedi ki:

    Dediğiniz gibi sprinting(); satırını sildiğimde bu defa bir tane button yürüme animasyonunu çalıştırıyor karekter böyle ilerliyor ve koşma yok bu defa diğer 3 tane button sağa sola ve geriye doğru animasyon olmadan hareket özelliği sağlıyor

  88. ahmet dedi ki:

    #pragma strict

    internal var animator:Animator;
    var v:float;
    var h:float;
    var sprint :float;

    function Start () {

    animator=GetComponent(Animator);

    }
    function Update () {

    //v=Input.GetAxis(“Vertical”);
    //h=Input.GetAxis(“Horizontal”);
    //Sprinting();
    }
    function FixedUpdate()
    {
    //animator.SetFloat(“walk”,v);
    //animator.SetFloat(“Turn”,h);
    //animator.SetFloat(“Sprint”,sprint);

    }
    function Sprinting()
    {
    if(Input.GetButton(“Fire1”))
    {

    sprint=0.2;
    }
    else{
    sprint=0.0;
    }

    }
    function MoveUp() { v = 1.0; animator.SetFloat(“walk”,v);}
    function MoveDown() { v = -1.0; animator.SetFloat(“walk”,v);}
    function MoveLeft() { h = -1.0;animator.SetFloat(“Turn”,h); }
    function MoveRight() { h = 1.0; animator.SetFloat(“Turn”,h);}

    Kodda şöyle birşey denediğimde up butonuna tıklandığında dönme animasyonu çalışıyor hep.Ama Up butonu basılı tutulduğunda ise ileri doğru yürüme işlemi gerçekleşiyor.Bıraktığında tekrar dönme işlemine geçiyor down butonuna tıklandığında animasyonlar duruyor.Sorun ne Bakma imkanınız varmı.Teşekürler.

    • yasirkula dedi ki:

      Butonlardan eli çekince h ve v’nin sıfırlanması lazım. O yüzden de Update ve FixedUpdate’in comment’li olmaması lazım. Bu durumda da karakterin animasyonu oynamıyor diyorsunuz, bunun sebebini ben de hâlâ çözemedim.

  89. Mehmet Çınar dedi ki:

    S.a yasirbey size bir sorum olacaktı.
    C# olarak elimde yazılmış bir virtualjoystick scripti var.
    Benim yapmak istediğim şey bu joystickden gelen verilere göre
    Player scriptinden karaktere hareket vermek. ama nasıl yapacagımı çözemedim.

  90. Emre dedi ki:

    Merhaba Public Scprit kod ;
    diye bir tanımlama yapıyorum fakat Scprit i oyun kütüphanesinde bulamıyor
    yeni güncelleme felanmı geldi rigidbody.Addforce gibi bazı şeyler değişmiş

    • djemrelak dedi ki:

      using UnityEngine;
      using System.Collections;
      kütüphane olduğunu düşündüğüm bu ikisini kullanıyorum ayrıca c# kullanıyorum

      • djemrelak dedi ki:

        AYRICA 2.Sorum
        Eğerki sadece parmağın oynattığımız ölçüde ilerlemesini isteseydik;
        Update’in içine sadece bunu yazsak olmazmıydı yani neden for döngüsünü kullandık optimizasyon içinmiydi yoksa bilmediğim bir sebepmi var ben sadece oynatmak için bunu kullansam bir problem olurmu vaktiniz varsa kısa bir açıklama yapabilirmisiniz şimdiden teşekkürler.Ayrıca oyun yapımcıları optimizasyon konusunda sıkıntı çekiyor bazı kişiler unity scprit arşivinizi görmüyor ordaki yöntemleride ayrıbir konu olarak açarsanız takipçileriniz için yararlı olacaktır 🙂

        if( parmak.phase == TouchPhase.Moved )
        {
        transform.localScale += new Vector3( parmak.deltaPosition.x, parmak.deltaPosition.y, 0 ) / 100;
        }

      • yasirkula dedi ki:

        Ekranda birden çok parmak olunca her bir parmağın üzerinden ayrı ayrı geçmek için for loop’u kullanıyoruz. Dilerseniz sadece ekrandaki ilk parmağın (Input.GetTouch(0)) üzerinden de geçebilirsiniz; ancak if(Input.touchCount>0) koşulunun true döndürdüğünden emin olun.

    • yasirkula dedi ki:

      “public DegiskenTuru degiskenIsmi;” şeklinde değişken tanımlanıyor. Eğer DegiskenTuru Javascript ise bu hatayı alabiliyor olabilirsiniz. Sorunu çözmek için DegiskenTuru scriptini Plugins klasörüne taşımayı deneyebilirsiniz.

      Unity’nin son sürümlerinde artık Transform hariç diğer component’lere şu şekilde erişiliyor:

      GetComponent<Rigidbody>()
  91. Mehmet Samsunlu dedi ki:

    Üstadım, merhaba. Ben karakteri dokunmatik ekranda dokununca karakteri 2 cm kadar zıplatıyorum. Fakat karakter bazen 4-5 cm. zıplıyor. Benim istediğim karakter her zaman aynı ölçüde zıplasın. Nasıl bir kod yazmam gerek. Ayrıca karakteri havada 2 kere zıplatmak istiyorum. Lütfen yardımlarınızı bekliyorum. Saygılar.

    • yasirkula dedi ki:

      Eğer Rigidbody kullanıyorsanız ekrana dokununca velocity.y’yi değiştirmeniz yeterli; AddForce kullanırsanız karakterin y eksenindeki mevcut hızına göre zıplamanın şiddeti değişebilir. Rigidbody kullanmıyorsanız kodunuzda Time.deltaTime kullanmanız lazım.

  92. Kadir Turan dedi ki:

    Hocam ağızınıza sağlık çok güzel anlatmışsınız. Fakat bi sorum olacaktı benim. Ben Scriptleri mi C# dilinde yazıyorum ve çok daha yeniyim.
    ” transform.position = Camera.main.ScreenToWorldPoint(Vector3(parmak.position.x, parmak.position.y, 10)); ”
    bu yazımda hata veriyo bende. bu kısmın c# için yazılışı tam olarak nasıldır acaba gösterirseniz sevinirim. şimdiden çok sağolun.

  93. Onur dedi ki:

    Gerçekten yazı için çok teşekkürler benimde bir sorum var hocam. Ben şimdi ekranda dokunduğumuz yerin x ve y sinin kaç olduğunu text olarak öğrenmek istiyorum bunu nasıl yapabilirim yardımcı olabilir misniz?

    • Onur dedi ki:

      Aslında bana şöyle bi kod lazım:

      Eğer parmak.Position.x telefonun width’inin yarısından küçükse sola git eğer telefonun width’inin yarısından fazlaysa sağa git.

      Her telefonun çözünürlüğü aynı olmadığı için oraya 1920’nin yarısı diye giremiyorum. Bana oyunun çalıştırıldığı telefonun width’ini öğrenmemi sağlayacak bi kod lazım yardımcı olursanız sevinirim. Yukarıdaki soruyu boşverebilirsiniz.

  94. assassinfurkan dedi ki:

    Ben karekteri hareket ettirirken charactercontroller kullaniyorum acaba bu kodu nasil android uyarliyabilirim

    Vector3 yon = new Vector3(Input.GetAxis(“horizontal”),0,Input.GetAxis(“Vertical”));

  95. Mucahit dedi ki:

    Selamun aleykum sorum olucakti benim oyunumda karakterimi A ve D tuslari ile saga ve sola belli bi oranda haraket ettirip space tusu ile ziplama S tusu ile egilme yaptiriyodum bunlari androide uyarlamam icin bu komutlari silmem mi gerekir silmem gerekirse ne yazabilirim simdiden tesekkurler

    • yasirkula dedi ki:

      Önce oyunun dokunmatik ekranda nasıl oynanması gerektiğine karar vermeniz lazım. Ekranda parmak mı sürüklenecek? Sensör mü kullanılacak? Ekrandaki butonlara mı tıklanacak? gibi..

      • Mucahit dedi ki:

        Parmakla hareket etmesini istiyorum parmagi ekranda sola cekip biraktiginda 3 birim sola gitmesi mesela

      • yasirkula dedi ki:

        O zaman sağa ve sola gitme kodunu bir fonksiyona taşıyın. Öyle ki biz bu fonksiyonu çağırdığımızda karakter sağa gitsin veya sola gitsin. Ne yöne gideceğini veya ne kadar gideceğini bir parametre ile belirleyebilirsiniz. Ardından dokunmatik ekran için parmağın sola kaymasını algılayan bir kod yazın ve bu kodun içerisinde sağ-sol hareket fonksiyonunu çağırın.

  96. Mucahit dedi ki:

    Nasil bir kod olabilir bir tanesi icin bi ornek verebilir misin

  97. Mucahit dedi ki:

    Mesela ben saga gitmesi icin
    Public float donushiz;

    Void Update (){

    If (input.getkey(keycode.d))
    {
    Getcomponent ().addforce (vector3.right*donushiz)
    }
    }
    Bu kodu silmem gerekir mi androide uyarlayip parmakla hareket ettirmek icin

    • yasirkula dedi ki:

      Şunun gibi:

      void Update() {
      if( Input.GetKey( KeyCode.D ) ) {
      YanaGit( donusHiz );
      }
      else if( Input.GetKey( KeyCode.A ) ) {
      YanaGit( -donusHiz );
      }
      }

      public void YanaGit( float miktar ) {
      GetComponent().AddForce( Vector3.right * miktar );
      }

      Artık YanaGit fonksiyonunu PC’den de çağırabilirsiniz mobilden de.

  98. Muhammed dedi ki:

    S.a abicim size bir şey sorabilirmiyim ben bir korku oyunu yaptım her şey hazır menü jumpscareler,bitişler tek bir sorun var onuda halledebilirsem oyun google playda tek sorun şu abicim reycast denen bir illet var (: onu yaptım şimdi yerdeki notun üzerine gelip E tuşuna basınca ( bir canvas olusturdum ve bir image ekleyip içine resmi koydum) canvas aciliyor bir daha objenin üzerine gelip E tusuna basınca kapanıyor fakat ben bunu androidde E tuşuna tiklanmiyacagi için ekranda bulunan bir butona tıklayınca alçilmasinı istiyorum her kese sordum cevap alamadım yardımcı olursanız çok sevinirim (:

    • Muhammed dedi ki:

      Birde şöyle anlatayım derdimi abicim
      Şimdi ben E tuşu yerine mouse verdim yetkiyi yani objenin uzerine gelip mausede sol click yapinca geliyor eklenti ama apk olarak androidde acinca objenin ustune gelince tere tiklarsan tikla ekranda objeyi aliyor yani normal sadece objenin üzerine tiklayinca almiyor bunlarin ikisinide soyleyebilirmisiniz nasıl yapabilirim (:

      • yasirkula dedi ki:

        Objeye tıklamak için OnMouseDown kullandıysanız bunun Android’de de aynı şekilde çalışması lazım. Başka bir kod yazdıysanız kodu ufaktan görmem lazım.

    • yasirkula dedi ki:

      E tuşuna basınca RaycastAt() isminde bir fonksiyon çalışıyor varsayalım. Bu durumda ekranda gözükmesini istediğiniz butonun OnClick () event’ine RaycastAt() fonksiyonunu koyarsanız sorun olmaması lazım.

      • Muhammed dedi ki:

        Dediğiniz yöntemi deniyicem abicim olmazsa kodları yoruma atarım cevaoladiginiz için teşekkürler
        Son bir şey sormak istiyorum umarım bu son olur (:
        Abicim ben bilgisayara veya androide oyun yapıyorum bilgisayarın ekran büyüklüğü yada telefonun ekran büyüklüğü değişince butonlar falan kuculuyor disarda kalıp ekranda gozukmuyor yani bi kod falan varmı mesea bir ekrana göre yapınca ekran boyutu değişince ona gore buyuyup kuculsun ekrandakiler varsa çok iyi olur çünkü yaptığım oyun 5 incelikte güzel gözüküyor 4.5 te dışarı taşıyor butonlar ve tiklanmiyor

      • Muhammed dedi ki:

        Abicim yapamadım kodlar burada

        BU RAYCAST KODU PCDEN BAKARAK YAZDIM KÜÇÜK YAZDIM

        Raycast Hit hit;
        NotrAl ki;

        Voidstart () {
        }

        Void update (){

        İf( input.getkeydown (keycode.E)){
        İf (physics.raycast (transform.position, transform.forward, out hot, 5)){
        İf(hit.transform.tag== “annekokusu”){
        Ki = hit.transform.gamrobject.getcomponent();
        Ki.kapioynat ();
        }
        }
        }
        }
        }

        BUDA NOT ALMA KODU YİNE KÜÇÜK YAZDIM SEN ANLARSIN

        Public bool acik;
        Public gameobject hikaye;

        Public void kapioynat () {
        Acik = !acik;
        }

        Void update (){

        İf (acik){
        Hikaye.setactive (true);
        }Else{
        Hikaye.setactivr (false);
        }
        }
        }

        KODLAR BUNLAR NOT ALMA KODUNU ANNEKOKUSU TAG Lİ OBJEYE ATIYORUM İMAGEYİDE NOTAL KODUNUN İÇİNE ATİYORUM OBJEYE GELİL E YE BASİNCA CANVASDAKİ İMAGEYİ AÇIYOR AMA BUTONA VEREMEDİM BİR TÜRLÜ.
        ASLİNDA BUTON DEĞİLDE ANDROİDDE USTUNE TİKLAYİNCA ALSADA OLUR YANİ BEN EKRANDA NERE TİKLASAM ALİYOR NOTU SADECE USTUNE TIKLAYINCA YADA BUTONA TIKLAYINCA ALSIN ABİCİM SEN İKİSİNE SÖYLE OLURMU (:

      • yasirkula dedi ki:

        UI elemanlarının her ekranda düzgün gözükmesi için Canvas’taki Canvas Scaler’ın değerleriyle oynayabilirsiniz. Ekranın hep solunda kalmasını istediğiniz arayüz elemanlarını ise ekranın soluna anchor’lamanız lazım.

        Butona basınca not almak için if(Input.GetKeyDown(KeyCode.E)) satırını silip Update fonksiyonunu public void ButonaBasildi fonksiyonuna çevirmeniz lazım. Butonun On Click event’ine de ButonaBasildi fonksiyonunu atamanız lazım.

        Nota dokununca almak için ise Update’in ilk 2 satırını şöyle değiştirmeyi deneyin:

        if( Input.GetMouseButtonDown(0) ) {
        if( Physics.Raycast( Camera.main.transform.position, Camera.main.ScreenPointToRay( Input.mousePosition ), out hot, 5 ) ) {

      • Muhammed dedi ki:

        Yasir abicim sizin verdiğiniz ve söylediğiniz kodları uyguladım ama bir türlü olmuyor lütfen bu dokunmatik ekranda yerdeki objeye tıklayınca alması için bir ders verirmisin lütfen artik oyun bitti tek bu sorun var kısa bir ders abim lütfen lütfen lütfen… (:

      • yasirkula dedi ki:

        Sadece bu konuyla alakalı bir ders yazmam diye düşünüyorum. İsterseniz Google’da “unity android pick up object” şeklinde bir arama yapın, istediğiniz şeyi orada bulabilirsiniz.

Bir Yanıt Bırakın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s