UNITY’de Pong Oyunu Tasarlamak (Çeviri Ders)

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

Herkese merhaba,

Bu derste Unity oyun motorunu kullanarak klasik Pong oyununu bir de kendimiz oluşturacağız. Ders çeviri olup orijinal derse gitmek için linke tıklayabilirsiniz: http://noobtuts.com/unity-2d-pong-game-step-1-introduction

Orijinal sitenin felsefesi “Benimle 5 yaşımdaymışım gibi konuş!“. Bu yüzden de dersleri ayrıntılı anlatmaya çalışmışlar ve başlangıçta bunu başarmışlar da. Ancak tutorialin ilerleyen kısımlarından verim almak için daha önceden programlama tecrübenizin olması şart (Bunun için Çaylaklar İçin UnityScript dersini okuyabilirsiniz: https://yasirkula.wordpress.com/2011/08/09/caylaklar-icin-unityscripte-javascript-baslangic-kilavuzu-hicbir-programlama-gecmisi-gerekmez/ ). Dersi hiç kesmeden tamamen çevirdim, bu yüzden başta Unity’nin arayüzü tanıtılıyor olup ilerleyen aşamalarda oyunun yapımına başlanmaktadır.

Ne dersiniz, başlayalım mı!

DÜZENLEME (06.05.2014): Dersin yazarı yaşadığı teknik bir aksaklığın ardından sorunu çözmek için çeviriyi siteden kaldırmamı rica etti. Bu yüzden şu an için dersi PDF olarak paylaşıyorum: https://app.box.com/s/yo39t2p3y2l35001rlal

İleride yazar isterse dersi tamamen silmek durumunda da kalabilirim. Anlayışınız için teşekkürler.

yorum
  1. Mustafa dedi ki:

    ellerine sağlık ne kadarda hızlı çevirmişsin. Birde tower defense nasıl yapıl onu öğrenebilsek 🙂

    • yasirkula dedi ki:

      Bunu çevirmek benim için de bir zevkti ama Tower Defense oyununu çevirip çevirmeyeceğimden emin değilim. Göz attım ama kalitesinden şüpheliyim bu yüzden kesin birşey demiyorum.

  2. orhan dedi ki:

    Kardeşim keşke kodları farklı bi metin göstergeci ile yayınlasaydın adamı fitil ediyo ya sana zahmet.

    • yasirkula dedi ki:

      Aslına bakarsanız özellikle bu şekilde yayınlıyorum kodları. Sanki koda bir script editoründen bakıyormuş gibi kod düzenli çıkıyor. Sizde nasıl bir sorun teşkil ediyor?

  3. eren dedi ki:

    Bende ki tek problem raketler hareket etmiyor bütün kodları tek tek yazdım yanlış yer yok fakat w-s eklediğimde öylece duruyor. yardım edebilirmisiniz acaba ?

    • yasirkula dedi ki:

      Eğer herşeyi aynı yaptıysanız hatanın nereden kaynaklandığını bilmiyorum. Eğer yukarı ve aşağı ok tuşları çalışmıyorsa gerçekten bir sorun vardır, çalışıyorsa sorun yoktur.

  4. oyun gemisi dedi ki:

    flash oyunlar

  5. aziz bayraktar dedi ki:

    merhaba iki raket içinde ayrı bir js dosyası oluşturdum RaketSola (“w”) ve (“s”) verdim RaketSag içinse (“up”) ve (“dowm”) verdim sonuc olara ikisi birden aynı şekilde hareket ediyor konuyu anlatırken buna değinmediniz galiba bu konuda rica etsem bir paylaşım yapabilirmisiniz.

    • aziz bayraktar dedi ki:

      benım asıl sormak istedigim tek bir raket.js de iki farklı raket için nasıl işlem yapabiliriz FixedUpdate için value değer verip value.tostrin==”solRaket” gibi bişi denemedim ama çözüm bulamadım

      • yasirkula dedi ki:

        Sorunuzu gerçekten tam anlayamadım kusura bakmayın. Biz bir tek raket.js scripti yazıp bunu 2 farklı rakete atıyoruz ve ikisinde de ayrı ayrı çalışıyor. Bunun nasıl böyle olduğunu mu soruyorsunuz?

  6. sunalorhon dedi ki:

    Merhaba hocam paylaşımlar için saolun çok teşekkürler
    sormak istediyim bir soru var takılı kaldım birincisi bu topun hızını nasıl arttırırız ikincisi
    Oyunun başında topu bir yöne doğru hareket ettirmek başlığının altında yaptım hareket ettirdim topu ama yukarı doğru gidiyor ben rotation değiştirdim 90 derece yaptım ama hala yukarı doğru gidiyor vector3 yerine 2 yaptım ona rağmen değişmiyor napmalıyım yardımcı olurmusunuz.
    iyi çalışmalar

    • yasirkula dedi ki:

      Topun hızını değiştirmeye çalıştım ben bu oyunda. İlginçtir ki başarılı olamadım. Top hızlandı ama rakete çarpınca hareket etmeyi kesti. Birebir çeviri yaptığım için kodlarda hiç oynama yapmadım ve yazarın kodlarında nasıl bir oynama yaparak sorunsuz bir şekilde topu hızlandırırız bunu ben de bilmiyorum artık.

      İkinci sorunuz için Start() fonksiyonunu şöyle değiştirmeyi deneyin:

      // Use this for initialization
      void Start () {
          // oyunun başında sağa hareket et
          rigidbody.velocity = Vector3.up;
      }
      
      • Emre dedi ki:

        Merhaba raketler ekranın dışına çıkıyor. Yaptığımız alanın içinde kalmasını nasıl sağlarım?

  7. sunalorhon dedi ki:

    yasir kardeşim cevap için saol denedim kodu bu sefer hareket ettiremedim yanlış yamadım kodları tekrar tekrar değiştiriyorum.

  8. sunalorhon dedi ki:

    çok saol kardeşim şimdi oldu teşekkürler mantığınıda hafiften aldım eyvallah

  9. malik dedi ki:

    Merhaba… Merak ettiğim bir unsurvar. Velocity uygulamak. Ekstra bir güç kazancı demek bunu anladım. Fakat diğer kazançların aksine benim algıladığım, Velocity 10 birimlik bir güç verilmiş ise. Daha sonra 10 dan geriye doğru bir düşün söz konusu gibi.Fade oluyor da denemebilir. Bir şekilde bunu debug edemedim, yani ekrana yazdıramadım. Velocity bir hassasiyet kazandırıyor gibi geldi bana. Sizcede izlenimim doğrumu.

    • yasirkula dedi ki:

      AddForce komutu güç vermeye yarıyor. Velocity ise objenin hızını değiştirmeye yarıyor. Eğer ortamda sürtünme varsa velocity dediğiniz gibi 0’a doğru fade olur.

    • Fırat dedi ki:

      Arkadaşım verdiğin tüm kodlar hatalı hiçbiri çalışmıyor Unity 4.3 kullanıyorum

      • yasirkula dedi ki:

        C# script oluşturmalısınız. Eğer scriptlerinizde “<span" ile başlayan ibareler varsa, WordPress'in bir bug'ından dolayı sitede scriptler öyle hatalı gözüküyordu ama artık düzeldi. Sitedeki scriptleri yeniden gözden geçirin.

  10. Oğuzhan dedi ki:

    Reyiz ben adam akıllı kod yazmasını bilmiyorum hızı 1 de sabitle filan demişsinde ben nasıl o nu kod halinde yazıcagımı bulamadım o kodları bana verebilirmisin cok yavas hareket ediyorlar sinirim bozuldu. 😀

    • yasirkula dedi ki:

      Aynı şey bende de oldu. Top çok yavaş gerçekten. Topu hızlandırmakla hatırı sayılır bir şekilde uğraştım ama hep bir arıza çıktı. Yani bu konuda yardımcı olamayacağım ama topu hızlandırmayı başaran biri varsa çözüm yolunu paylaşması sizi ve de beni çok memnun edecek.

      • burak duman dedi ki:

        void Update () {
        // hızı 1’de sabitle
        rigidbody.velocity = rigidbody.velocity.normalized * 10;
        }

        ile topu hızlandırdım ama top durdu sonra

        yan duvarlara rigidbody yaptım ve mass: 20 verdim raketlere rigid body mass:0,05 verip top sarsmasın diye move x freze ve rotation xyz freeze işaretledim. topun massını 0,0001 yaptım top şuanda durmadan hareket ediyor.

      • yasirkula dedi ki:

        Ne diyim elinize sağlık 😀

  11. Fırat dedi ki:

    Benim topum İlerliyor ama çarptığı anda sekmiyor

    yardım edebilir misiniz?

    • yasirkula dedi ki:

      Herşeyi birebir yapınca sekmesi lazım, bende sekiyordu. Gerçekten şu anda hatanın kaynağını bulabileceğimi sanmıyorum.

      • Fırat dedi ki:

        evet dün gece tam uykuya dalacakken farkettim özür dileyecektim ben JS açıyodum birde bu oyunu androide uyarlayabiliyor muyuz?

      • yasirkula dedi ki:

        Örneğin raket scriptindeki if-else if’li kısmı silip yerine şunu yazmayı deneyebilirsiniz:

        foreach( Touch t in Input.touches )
        {
        transform.position = new Vector3(pos.x, pos.y, pos.z + t.deltaPosition.y * 0.1f );
        }

        Bu kod iki raketi birden aynı anda oynatır. Ekranın sol yarısına dokununca sol raketin, sağ yarısına dokununca sağ raketin hareket etmesi için kodda biraz değişiklik yapmanız gerekecek muhakkak.

  12. Fırat dedi ki:

    bence önce bilgisayar için tasarlayıp ondan sora androide geçirmeli

  13. Serk dedi ki:

    dersler çok yardımcı oldu ellerine sağlık ben 2 şeyde takıldım yardımcı olabilirsen sevinirim, top sag veya sol duvara eğer aşağı doğru gidiyorsa çarptığı anda hiç sekmeden dümdüz inmeye veya yukarı dogru çıkıyorsa yine sag yada sol duvara çarptığında dümdüz çıkmaya başlıyor diğer üst alt duvarlarda sekmede sorun yok sadece sag sol duvarlara değer değmez yapışık şekilde gitmeye başlıyor, ikincisi raketlere değdiğinde öylece kalıyor raketi başka yere götürsem bile hareketsiz kalmaya devam ediyor uğraştım ama beceremedim yardımcı olabilirsen cok sevinirim

    • yasirkula dedi ki:

      Yorum spam’lerin arasına karışmış, yeni gördüm.

      Raketlerin isimlerinin RacketLeft (soldaki raket) ve RacketRight (sağdaki raket) olduğundan emin olun.

      Sağ ve sol duvarlara çarpınca öyle kalması normal çünkü kodda o duvarlara çarpınca yapılacaklar yazılmamış. Mesela topun o duvarlara çarpınca sahanın ortasına ışınlanmasını istiyorsunuz diyelim. O zaman yapmanız gereken Start fonksiyonundan önce “Vector3 baslangicNoktasi;” adında bir değişken tanımlamak ve Start fonksiyonunun içine şu satırı eklemek:

      baslangicNoktasi = transform.position;

      Ardından OnCollisionEnter’da eğer top BorderLeft’e veya BorderRight’a çarpmışsa şu kodu yazacaksınız:

      transform.position = baslangicNoktasi;
      rigidbody.velocity = Vector3.right;

  14. Emre dedi ki:

    Merhaba ben bir menü butonu ekledim oyunun içine ama bununla sahne değiştirmek istiyorum. Nasıl yaparım?

    void OnGUI()
    {
    GUI.Button(new Rect(0,0,50,50),”Menu”);
    }

    Bunun ile buton ekledim ama nasıl bunun ile menu adlı sahneye dönerim bilmiyorum.

  15. Ali Tarık dedi ki:

    Merhaba ilk 10-15 yorumu okudum ve topun çok yavaş olduğunu ve çözemediğinizi görünce şaşırdım aslında tek yapmanız gereken
    rigidbody.velocity = rigidbody.velocity.normalized;
    kısmını rigidbody.velocity = rigidbody.velocity.normalized * 2;
    yapmaktı.Bende Çalışıyor.Bu arada bende bunu yaklaşık 5-10 deneme başardım 🙂 İyi Kodlamalar

  16. Mustafa Emektar dedi ki:

    Teşekkürler Hocam

  17. Havva dedi ki:

    Selamlar…
    Bir oyuncunun toplayacağı nesnelerin , oyuncu onu yok ettikten sonra yine oluşmasını istiyorum. sürekli oyunda olması , rastgele bir yerlerden çıkması lazım…
    Bir de bir nesneye bağlı scriptin üye fonksiyonunu, başka nesnenin scriptinden nasıl çağırabilirim C# da.

    • yasirkula dedi ki:

      Rastgele olarak yollama işini nasıl yaparsınız bilmiyorum ama bu rastgele konuma yollama kodunu OnCollisionEnter’a veya OnTriggerEnter’a yazabilirsiniz. Böylece o nesneye temas edince rastgele konuma ışınlanma olayı gerçekleşir.

      İkinci sorunuzun cevabı şöyle: GameObject.Find(“ObjeAdi”).GetComponent().fonksiyonAdi();

      Eğer C#’tan Javascript’e erişiyorsanız bu kod sorun çıkarabilir. Scriptlerden birini özel bir klasöre taşımanız gerekir bu durumda. Bilgi şurada mevcut: http://docs.unity3d.com/Manual/ScriptCompileOrderFolders.html

  18. Enes dedi ki:

    Merhaba ben Air hokey tarzında bi oyun yapıyorum bir silindir cismim var bu silindire top değdiği anda geri sekmesi gerekiyo ama cisimlerin ikiside yuvarlak olduğu için sabit bi yere deği değdiği noktaya göre hareket etmesi gerekiyo topun yardımcı olursanız çok sevinirim.
    teşekkürler..

    • yasirkula dedi ki:

      Bence Rigidbody’nin AddForce fonksiyonundan faydalanın ve topun collider’ına yeni bir Physics Material verip Bounciness değerini full yapın.

      • Enes dedi ki:

        GetComponent.().AddForce (transform……….*500);
        boşlukların olduğu yere up koyarsam yukarı left koyarsam sağa gidiyo değdiğinoktaya göre gitmesi için ne koymamm lazım?

      • yasirkula dedi ki:

        Physics Material verince düzgün yönde sekmesi işi otomatik olarak hallediliyor. Siz AddForce’u sadece oyunun başında topun hız kazanması için verin sonra başka güç vermeyin. Topun Drag ve Angular Drag değerlerini de 0 yapın.

  19. Enes dedi ki:

    Çok teşekkür ederim .. Birde topsilindire değdiğinde vurma butonuna basılırsa *2 daha hızlı gitmesini istiyorum bunun için ne yapmalıyım?

    • yasirkula dedi ki:

      Topun OnCollisionEnter fonksiyonunda temas edilen obje silindir mi diye bakın. Eğer öyle ise Input.GetKey(KeyCode.T) ile o esnada vurma butonuna basılıp basılmadığını kontrol edin (ben T olarak verdim vurma tuşunu, siz değiştirirsiniz). Eğer tuşa basılıyorsa GetComponent(Rigidbody).velocity = 2 * GetComponent(Rigidbody).velocity; yapmayı deneyin. Ne kadar düzgün çalışır onu şu an bilemiyorum.

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 )

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 )

Google+ fotoğrafı

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

Connecting to %s