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:, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

GÜNCELLEME (01.07.2018): Kod C#’a çevrildi ve Input.touches değişkeni yerine Input.touchCount ve Input.GetTouch kullanıldı.

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 C# script oluşturup bu script’i küp objesine atayın. Son olarak, sahnede bir Directional Light oluşturun ki küpün 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 fare 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( new 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 mevcut pozisyon ve eğimine göre 3 boyutlu uzayda bir noktaya çevriliyor ve obje bu noktaya ışı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 fonksiyon bulunmaktadır. Bu fonksiyonun parantezinin içine bir Vector3 değer girilir. Girilen bu Vector3’ün x ve y değerleri ekrandaki bir pikselin konumuna işaret etmelidir, bizim durumumuzda bu fare imlecinin ekrandaki konumunun x ve y koordinatlarına denk geliyor. Vector3’ün z değeri ise, 3 boyutlu uzaya çevrilecek noktanın kameradan kaç birim 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 fonksiyonu, 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.

Şimdi de küpün boyutunun biz fareyi sürükledikçe değişmesini ayarlayalım. Bunun için script’in içinde şöyle değişiklik yapın:

Vector3 mouseEskiKonum;

void Update ()
{
	if( Input.GetMouseButtonDown( 0 ) )
	{
		transform.position = Camera.main.ScreenToWorldPoint( new Vector3( Input.mousePosition.x, Input.mousePosition.y, 10 ) );
		mouseEskiKonum = Input.mousePosition;
	}
	else 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 fare imlecinin koordinatlarını atadık. Ardından Input.GetMouseButton(0) fonksiyonuyla, farenin sol tuşunun basılı olduğu her frame’de, objenin boyutunun (transform.localScale) fare imlecinin mevcut konumuyla eski konumu arasındaki farkın 1/100’ü kadar değişmesini sağladık. Neden 1/100? Çünkü ekran koordinatları piksellerle alakalı ve fareyi birazcık bile oynatsak ekranda epey piksel 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 piksellik oynamada küpün 1 metre büyümesini sağladık. Son olarak da, mouseEskiKonum değişkeninin değerini fare imlecinin güncel konumuna ayarladık.

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

Aşama 2 : Android

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

Android’e uygulama geliştirirken, dokunmatik ekranla işlem yapmak için en aşina olmanız gereken iki komut, Input.GetTouch fonksiyonu ve Input.touchCount değişkeni. Bu komutlar ne işe yarar? Input.touchCount, ekrana dokunan parmak sayısını döndürürken, Input.GetTouch ise bu parmaklardan birisi hakkında detaylı bilgi döndürür. Peki bu detaylı bilgi 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.

Touch türünde depolanmakta olan bir parmak ile neler yapılabilir? Touch dediğim şey bir struct olup içerisinde çeşitli değişkenler 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 yatay ve dikey eksende kaç piksel hareket ettiğini bir Vector2 olarak döndürür. O halde deltaPosition.x dediğimiz zaman, parmağın yatay eksende kaç piksel hareket ettiğini, deltaPosition.y dediğimiz zaman da parmağın dikey eksende kaç piksel hareket ettiğini bulmuş oluruz. Touch‘ın depoladığı bir başka önemli değişken ise phase değişkenidir. Bu değişken TouchPhase türündedir ve parmağın mevcut durumunu depolar. Daha açık konuşmak gerekirse, parmağın ekrana yeni mi dokunduğunu (TouchPhase.Began), yoksa ekranda hareket halinde olan bir parmak mı olduğunu (TouchPhase.Moved), ekranda hareketsiz bir şekilde basılı olarak duran bir parmak mı olduğunu (TouchPhase.Stationary) ya da ekrandan yeni kaldırılan bir parmak mı olduğunu (TouchPhase.Ended) depolar. Ekrana aynı anda beşten fazla parmağın dokunması gibi nadir olaylarda ise değeri TouchPhase.Canceled olur. Touch, bir başka önemli değişken daha depolar: fingerId. Bu değişken, ekrandaki o parmağa has bir int 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 istiyorsanız, 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 nasıl ulaşıyorduk? Evet, Input.GetTouch fonksiyonu ile. O halde Input.GetTouch ve Input.touchCount vasıtasıyla ekrandaki 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. Bunun için küp objesine atadığınız scripti açın ve Update() fonksiyonunu şöyle değiştirin:

int parmakSayisi = Input.touchCount;

for( int i = 0; i < parmakSayisi; i++ )
{
	Touch parmak = Input.GetTouch( i );
	
	if( parmak.phase == TouchPhase.Began )
	{
		transform.position = Camera.main.ScreenToWorldPoint( new Vector3( parmak.position.x, parmak.position.y, 10 ) );
	}
}

Sanıyorum bu kodu açıklamaya gerek yok, çünkü neyi niçin yaptığımızı zaten yukarıda öğrendik. Burada, PC için olan kodu Android’e uyarlamanın ne kadar kolay olduğuna dikkat ç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( int i = 0; i < parmakSayisi; i++ )
{
	Touch parmak = Input.GetTouch( i );
	
	if( parmak.phase == TouchPhase.Began )
	{
		transform.position = Camera.main.ScreenToWorldPoint( new Vector3( parmak.position.x, parmak.position.y, 10 ) );
	}
	else if( parmak.phase == TouchPhase.Moved )
	{
		transform.localScale += (Vector3) parmak.deltaPosition / 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, parmak.deltaPosition‘ı bir Vector3‘e dönüştürdük (typecast).

Evet, bitti! Buraya kadar gelmişseniz bir Android developer olma yolunda büyük bir basamak atladığınızı söyleyebilirim. Şimdi dilerseniz uygulamayı Android’e Build edip 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. hakan dedi ki:

    bunu unity kendi roll a ball a nasıl ekleyebilirim

    • yasirkula dedi ki:

      Şunun gibi olabilir:

      float moveHorizontal = Input.GetAxis (“Horizontal”);
      float moveVertical = Input.GetAxis (“Vertical”);

      if (Input.touchCount > 0)
      {
      Touch parmak = Input.GetTouch (0);

      moveHorizontal = parmak.deltaPosition.x;
      moveVertical = parmak.deltaPosition.y;
      }

  2. Muhammed dedi ki:

    Merhaba,
    şimdi siz bu dersi normal yazmışsınız iyi güzel ama hem yazsanız aynı anda da videosunu yapıp buraya koysanız daha iyi değil mi? 🙂

  3. Kübra dedi ki:

    Yasir Bey merhaba,

    Ben bir oyun yaptım ancak hareketlerim klavyedeki sağ sol yukarı ve aşağı tuşları ile oluyor. Bu da tabiki androide uyarlayınca çalışmıyor. Bu hareketleri sürükle bırak mantığıyla nasıl yapabilirim. Yani mesela topumu sağa götürmek istiyorsam sağa doğru sürükleyeceğim,sola götürmek istiyorsam sola,aynı şekilde yukarı ve aşağıya. Yardımcı olabilir misiniz? Bir türlü kafamda konduramadım.

    Rigidbody fizik;
    float horizontal = 0;
    float vertical = 0;
    Vector3 vec;
    public float karakterHizi;
    public float minX;
    public float maxX;
    public float minZ;
    public float maxZ;
    public float egim;

    void Start()
    {
    fizik = GetComponent();

    }

    void FixedUpdate()
    {

    horizontal = Input.GetAxis(“Horizontal”);
    vertical = Input.GetAxis(“Vertical”);
    vec = new Vector3(horizontal, 0, vertical);
    fizik.velocity = vec * karakterHizi;

    fizik.position = new Vector3
    (
    Mathf.Clamp(fizik.position.x, minX, maxX),
    0.0f,

    Mathf.Clamp(fizik.position.z, minZ, maxZ)
    );

    fizik.rotation = Quaternion.Euler(0, 0, fizik.velocity.x * -egim);
    }
    }

    Hareket kodlarım bu şekilde,bu kodları çevirerek dokunmatiğe uyarlayamaz mıyız acaba? Şimdiden çok teşekkür ederim.

    • yasirkula dedi ki:

      Bu sorunu hızlı bir şekilde çözmek için bence şu linkteki asset’imi projenize import edin: https://yasirkula.com/2017/07/19/unity-gelismis-input-sistemi-mobil-destekli/

      Ardından ekranı tamamen kaplayan bir UI Image objesi oluşturup renginin alpha’sını (saydamlığını) 0 yapın ve bu objeye Touchpad component’i ekleyin. Touchpad’in X Axis’inin “Horizontal”, Y Axis’inin “Vertical” olduğundan emin olun. Son olarak da, yazdığınız script’teki Input.GetAxis’leri SimpleInput.GetAxis ile değiştirin.

      • Kübra dedi ki:

        Merhaba,teşekkür ederim cevabınız için ancak simpleinputu bulamıyorum c# ta. Sebebi ne olabilir?

      • yasirkula dedi ki:

        Verdiğim linkteki unitypackage’ı projenize import ettikten sonra sorun yaşamamanız lazım.

      • Kübra dedi ki:

        Yasir Bey çok teşekkür ederim yardımınız için ancak bir sorunum var. Ben projede oyuncumun parmağımla sürükleyerek gitmesini istiyorum. Ancak şu an da bu şekilde olmuyor sizin vermiş olduğunuz yolu izlediğimde. Bununla ilgili ne önerirsiniz bana? Çok teşekkür ederim tekrar.

      • yasirkula dedi ki:

        SimpleInput işe yaramadıysa Update fonksiyonuna şöyle bir kod yazabilirsiniz:

        int parmakSayisi = Input.touchCount;
        
        for( int i = 0; i < parmakSayisi; i++ )
        {
            Touch parmak = Input.GetTouch( i );
             
            if( parmak.phase == TouchPhase.Moved )
            {
        		// parmak.deltaPosition'ı kullanarak karakteri hareket ettir
            }
        }
        
      • Kübra dedi ki:

        Sadece bu verdiğiniz kodu mu ekleyeceğim simpleinput kısmına

      • Kübra dedi ki:

        Sorunu hallettim. Çok sağolun. Bİr sorum daha olacak. Sitenizde aradım ancak bulamadım. Random olarak oluşan objelerime random olarak renkler atamak istiyorum. Bununla ilgili olarak ne yapabilirim?

      • yasirkula dedi ki:

        Objenin materyalinin rengini Random.ColorHSV(0f,1f,1f,1f,0.5f,1f); fonksiyonu ile verebilirsiniz (bu fonksiyon rastgele bir renk döndürür).

      • Kübra dedi ki:

        Objeye yeni bir script ekleyip söylediğiniz fonksiyonu mu yazacağım?

      • Kübra dedi ki:

        Farklı renkler ile inmesini sağladım teşekkür ederim. Peki bunu ben belli bir puana gelindiğinde renklerin değişmesini istiyorum bunu nasıl yapabilirim?

      • yasirkula dedi ki:

        Update fonksiyonunda puanı kontrol edip, eğer belli puana gelindiyse rengi o zaman değiştirebilirsiniz.

  4. teknolojidergisi dedi ki:

    Merhabalar Unity’de çok yeniyim yaptığım uygulamada iki kutudan hangisine önce dokunulduğunu kontrol etmek istiyorum. Benim iki küpe de atadığım kodlar şöyle:

    private void OnMouseDown()
    {
    // yapılacaklar
    }

    Fakat böyle olunca haliyle iki kutuya aynı anda basılınca bunların tam ortasını tek bir tıklama olarak algılıyor. Çok fazla yöntem denedim. Son olarak Update() komutunun altına belirttiğiniz şekilde kodu şöyle ekledim:

    for (var parmak : Touch in Input.touches)
    {
    if (parmak.phase == TouchPhase.Began)
    {
    //yapılacaklar
    }

    Ancak “for” olan satırı kırmızıyla çizerek kabul etmedi. Sanıyorum ki baştaki using kısmına eklemem gereken bazı şeyler var fakat dediğim gibi çok acemiyim. Yapamadım. Bu konuda yardım ederseniz çok sevinirim.

    Bir de fingerID olarak belirtmişsiniz. Benim projemde kullanılabilir. Neticede kutulardan birine önce dokunulduğunda zaten diğer kutuya dokunulmasının anlamı kalmıyor. Dolayısıyla sadece ilk dokunan parmağın geçerli olması işime gelebilir. Acaba bunları nasıl gerçekleştirebilirim?

  5. Yunus Emre dedi ki:

    Doğru konunun altına yazdığımı umut ediyorum 🙂
    Parmağımızla ekranda belli bir yöne doğru bir hareket yapsabilir ve bunu bool veya int değeri olarak kaydedebilir miyiz?
    Örnek,Parmağımızı sağa doğru kaydırdığımızda boolun true olması .

    Cevaplarsan çok sevinirim.. 🙂

    • yasirkula dedi ki:

      Touch’ın deltaPosition’ının x’i 0’dan büyükse parmak o frame sağa kayıyordur. Ama eğer diyelim ki parmak 50 pixel sağa kayınca boolean’ı true yapmak istiyorsanız “if(parmak.phase==TouchPhase.Began)”ın içinde parmak.position’ı bir Vector2 değişkene atabilir ve “if(parmak.phase==TouchPhase.Moved)”un içinde de parmak.position-degiskendekiDeger.x >= 50 diye kontrol edebilirsiniz.

  6. Muhammed dedi ki:

    Abi selamın aleyküm ben android icin korku oyunu yapiyorumda bir turlu ekrana tiklayip yerden nesne alma kapi acma gibi bir kod yapamadim kod bilgim az yardim edebilirmisin (: istediğim tam anlamıyla şu telefonda ekranda anahtarin ustune tikladigim zaman anahtari alsin kapiya tikladigim zamanda kapiyi acsin birde abicim mesela fener var feneride ekrana koydugum bir butona basinca acilsin istiyorum yardim edersen cok sevinirim raycast kodu falan var sistem hazir anahtari alip kapiyi aciyorsun fakat pc tuslariyla oluyor benim istedigim android icin ustune tiklandigi zaman olmasi her yerde aradim bulamadim tek carem sensin yasir abicim (:

    • yasirkula dedi ki:

      Collider’ı olan bir objeye OnMouseDown fonksiyonuna sahip bir script verirseniz o objeye dokununca bu fonksiyon otomatik olarak çağrılır. Anahtarın ve kapının üzerine tıklamayı bu şekilde algılayabilirsiniz. Fener butonu için ise bir UI-Button objesi oluşturabilir ve butonun sprite’ını fener sprite’ı yapabilirsiniz. Butona tıklayınca bir fonksiyon çağırmak için ise butonun On Click event’ini kullanabilirsiniz.

      • Muhammed dedi ki:

        Fazla aciklayici olmadi ama yinede tesekkurler biraz daha kurcalayim olmadi tekrar calarim kapini hakkini helal et abicim (:

  7. osman dedi ki:

    teşekkürler

  8. osman dedi ki:

    işime yaramadı peki butona bi tuş nasıl atarım bana lazım olan tuş şu page up ve page down un olduğu yerdeki sağ ve sol ok yön tuşları bunları ayrı ayrı 2 butona nasıl atarım mesela butona tıkladık sol tuşu tetikledi nasıl olur bu iş

    • yasirkula dedi ki:

      Ekrandaki bir butona tıklayınca Input.GetKeyDown’ı tetiklemek mümkün değil. Yapabileceğiniz tek şey, Input.GetKeyDown fonksiyonu A fonksiyonunu çağırıyorsa, ekrandaki butona tıklayınca da A fonksiyonunu çağırmak.

  9. osman dedi ki:

    hocam bi yanıt lütfen ya sağ ve sol buton olucak basınca karakter sağ sol yapıcak bi yardım lütfen ya

  10. osman dedi ki:

    yani şöyle olucak telefonda sağa dokununca sağa sola dokununca sola gitmesini istiyorum

  11. osman dedi ki:

    merhaba ben unity 5 de yeniyim bir oyun tasarladım karakterimiz yukarı doğru gidiyor ve engellere çarpmamaya çalışıyor karaktere sadece android de sağ sol komutu veremedim yardımcı olursanız sevinirim

  12. Onur dedi ki:

    Ben karakterimi zıplatmak istiyorum ama iki tuşa aynı anda bastığımda sapıtıyo değişik şeyler oluyor bu touch kodları ile nasıl yapabilirim?

  13. 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.

  14. 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.

  15. Mucahit dedi ki:

    Nasil bir kod olabilir bir tanesi icin bi ornek verebilir misin

  16. 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.

  17. 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”));

  18. 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.

  19. 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.

  20. 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.

  21. 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>()
  22. 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.

  23. 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.

  24. 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

  25. 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

  26. 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.)

  27. 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

  28. 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);
    }
    }
    }

  29. 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);

    }

  30. 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; }

  31. 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.

  32. 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.

  33. 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

  34. maliyazici dedi ki:

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

  35. 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ı

  36. 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.

  37. 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.

  38. 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.

  39. Yunus kara dedi ki:

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

  40. 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.

  41. 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.

  42. 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

  43. 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.

  44. Developer dedi ki:

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

  45. 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;

        }
        }

  46. 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ç

  47. 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

  48. yunusemre dedi ki:

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

  49. 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
        }

  50. 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;
      }
      }

  51. wilson dedi ki:

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

  52. wilson dedi ki:

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

  53. ç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.

  54. ç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;}}

  55. 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.

  56. 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.

  57. 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.

  58. 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)

  59. 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.

  60. 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.

  61. günay dedi ki:

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

  62. 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.

  63. günay dedi ki:

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

  64. 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

  65. 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 :/

  66. günay dedi ki:

    hocam facebookda kabul etseniz olurmu

  67. 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.

  68. günay dedi ki:

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

  69. 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

  70. 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 )

  71. 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ı

  72. 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 😛

  73. 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.

  74. 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;
        }

  75. 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.

  76. 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
      }
      }

  77. 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

  78. 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

  79. gökhan dedi ki:

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

  80. 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.

  81. 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

  82. 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

  83. 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.

  84. 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.

  85. 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.

  86. 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;

    }

    }
    }

  87. 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.

  88. Emre dedi ki:

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

  89. Emre dedi ki:

    Çok teşekkürler abi

  90. 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?

  91. 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.

  92. Furkan dedi ki:

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

  93. 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.).

  94. 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

  95. 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.

  96. 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.

  97. 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

  98. Berk Yaşar dedi ki:

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

  99. Berk Yaşar dedi ki:

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

  100. Enes dedi ki:

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

  101. 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..

  102. Berk Yaşar dedi ki:

    “Expecting }, found ” ” hatası verdi

  103. berk1966 dedi ki:

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

  104. 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

  105. 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.

  106. 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.

  107. 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.

  108. 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.

  109. 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.

  110. 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.

Bir Cevap Yazı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. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.