Geliştirici Günlüğü: Tema, İsim ve Mekanikler

Merhabalar bu konunun yazısını okumadan önce eğer hala okumadıysanız sizi bir önceki konuya alalım : Geliştirici Günlüğü: Platform ve Tarz Belirlemek

Bu yazıya kadar baya bir süre geçti bu süre içerisinde finallarle savaştık ve yaralıda olsak sağçıktık. Tema ve isim aslında bir birine çok bağlı iki değişken oyunun mekanik teması her ne kadar kaçmak/dodge üzerine kurulu olsa da görsel olarak da bir tema seçmemiz gerekiyordu bunun için aklımıza ilk gelen belkide hepinizin kanser ola ola oynadığı LoL. Bir önceki konudada paylaştığım görselde hepiniz ayşeyi görnüşsünüzdür. Görmeyenler için :
ashe9 bu ayşe
dreyvin buda dursun
fakat telif hakkı sıkıntılarından ve riot games’in bu konu için yayınladığı Legal Jibber Jabber yazısından yapabileceğimiz konusunda (yapabiliyoruzda reklam koyup para kazanma kısmı sıkıntılı) emin olmadığımız için bu fikrimizden R yaptık. Bir gece gene @zabzuro ile LoL oynarken ondan gelen Uzay-Roket anahtar kelimeleri aklımızda şimşek çaktı ve uzay temalı ve roketlerden kaçtığımız bir temaya dönüştürdük oyunu.

missilepix1 Ufopix4 shield
Sırasıyla Roketimiz UFO’muz ve Enerji kalkanımız oyun içi görüntü olarak ise


Tabi oyun içinde biriken para ile yeni görseller alınacak ama henüz onlar hazır değil. Durum böyle olunca ise oyun adı ise Dodge missles / Füzelerden Kaç oldu.

Gelelim mekanikler kısmına bir oyunu oynana bilir kılan (bana göre) en büyük etken oyuncuya sunulan mekanikler. Füzelerden bir joystick ile kaçmak bir mekanik sayılabilir ama bu yetersizdir oyuna zorluk katacak ve bu zorlukları dengeleyecek ek parçalar lazım temel olarak zorluk için bir LV sistemi getirdik ve her 20 puanda bir bu LV sistemi artıyor ekran dışında oluşan bu roket kalp enerji kalkanı ise bu LV’e bağlı olarak artıyor. Burada roket gelmesi oyunu zorlaştırırken kalp ve enerji kalkanı hem bunu dengeliyor hemde çeşitlilik sağlıyor.

// hadi teknik kısma girelim :slight_smile:
MobSpawn kodunun tamamı(yampiri aslında enerji kalkanı lol temasından kalan bir adlandırma =D

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MobSpawn : MonoBehaviour
{
    public Text scoreTxt, kronometre;
    public GameObject Player, Hp, Yampiri;
    public GameObject[] Mob, Wepon;
    private int MobChose, WeponChose;
    private float MobSize, PlayerSize, StartTime, t, minutes, seconds;
    private int HpChance, YampiriChance, score = 0, highScore, money, bolge, hangisi, i, lv = 0, seccpy = 0, lastscore;
    private bool lvbl;
    
    void Start()
    {
        StartTime = Time.time;
        MobSize = PlayerPrefs.GetFloat("MobSize",1);
        MobChose = PlayerPrefs.GetInt("MobChose", 0);
        WeponChose = PlayerPrefs.GetInt("WeponChose", 0);
        HpChance = PlayerPrefs.GetInt("HpChance", 1);
        PlayerSize = PlayerPrefs.GetFloat("PlayerSize",1);
        YampiriChance = PlayerPrefs.GetInt("YampiriChance", 1);
        money = PlayerPrefs.GetInt("money");
        highScore = PlayerPrefs.GetInt(("highscore"));
    }

    // Update is called once per frame
    void Update()
    {
        Player.transform.localScale = new Vector2(PlayerSize, PlayerSize);
        t = Time.time - StartTime;
        minutes = (int) (t / 60);
        seconds = (t % 60);
        score = int.Parse(scoreTxt.text);

        if (Player.activeInHierarchy == false)
        {
            PlayerPrefs.SetInt("lastscore", score);
            money += (score*lv);
            PlayerPrefs.SetInt("money", money);
            
            if (score > highScore)
                PlayerPrefs.SetInt("highscore",score);
            Application.LoadLevel("StartScenes");
        }
        else
        {
           kronometre.text = "LV : " + lv + " - " + minutes.ToString() + ":" + seconds.ToString();
            if (int.Parse(scoreTxt.text) % 20 == 0 && lvbl)
            {
                lvbl = false;
                lv++;
            }
            if (int.Parse(scoreTxt.text) % 20 != 0)
                lvbl = true;
// lvbl ilk mod almada 1 den fazla Lv i arttırdığı için bu sorunu engellemek için konuldu.

            if ((int)seconds != seccpy) // her saniye başında mob spawn ediliyor sürekli oluşturmayı engellemek için
            {
                seccpy = (int)seconds;
                for (i = 0; i < Random.Range(1,lv); i++) // lv ile 1 arasında rastgele sayı üretim ona göre mob spawn ediyor bu sayede zorluk sürekli artıyor.
                {
                    hangisi = Random.Range(0, 101); // her for döngüsünde hangi seçeneği oluşturacağını buradan seçiyor böylece lv arttıkça kalp ve enerji kalkanı gelme olasılığı da artmış oluyor.
                    if (hangisi <= HpChance)
                        Createor(Hp,MobSize);
                    else if (hangisi <= HpChance + YampiriChance)
                        Createor(Yampiri,MobSize);
                    else
                    {
                        Createor(Wepon[WeponChose],(MobSize*2)); // ileride eklekecek olan yeni roket temaları için
                    }
                }

            }
        }
    }
    void Createor(GameObject which, float size) //mobların oluşturulduğu kod.
    {
        GameObject go = Instantiate(which);
        bolge = Random.Range(0, 4);
        switch (bolge)// bölge ekran dışındaki sağ sol üst ve altı temil ediyor. 
        {
            case 0:
                go.transform.position = new Vector2(Random.Range(-3, 4), 6);
                break;
            case 1:
                go.transform.position = new Vector2(Random.Range(-3, 4), -6);
                break;
            case 2:
                go.transform.position = new Vector2(-4, Random.Range(-5, 6));
                break;
            default:
                go.transform.position = new Vector2(4, Random.Range(-5, 6));
                break;
        }
        go.transform.localScale = new Vector2(size,size);
    }
}

Bundan sonraki yazılar artık daha çok teknik kısma değinen bilgilendirici rehber gibi olacak sıradaki yazılar ise Gelir ve Yayınlamak üzerine olacak. Merak ettiğiniz şeyleri yada önerilerinizi yazabilirsiniz

4 Beğeni

Yine geldim ve bir kaç tavsiyem daha var :smiley: İlk olarak UI kısmından başlıyayım. UI textler aşırı büyük ve çok basit. Font boyutunu biraz daha küçülterek minimalleşmesi gerekli bence. Pixel-art font kullanıyosanız şahsi görüşüm kesinlikle fontlarda çerçeve olması yönünde. Can göstergesine direk kalp koymak yerine parçalı bir can barı olabilir. Aynı şekilde füzelerde çok büyük duruyor. Füzeleri biraz daha küçülterek hem daha hoş bir görüntü elde edebilir hemde oyunu biraz daha heycanlı hale getirebilirsin. Çünkü küçük füze ekranda daha fazla füzeye izin vermek demek.

Gelelim kod kısmına.
Burda da ilk olarak gözüme çarpan çok falza PlayerPref kullanmanız olmuş. PlayerPref’ın amacı çok az sayıda datayı saklamaktır. Burda size bir data class lazım ve bu data classı save dosyası olarak kullanabiliriniz. Data classı save dosyayı olarak kullanmak için serialize-deserialize işlemlerini kullanmanız gerekecek. Burda da bir kaç seçeneğiniz var. En yaygınları xml, json veya binary serialize kullanmak. Tabi kendi serialize sistemini de yazabilirsin :smiley: Onun haricinde bu script özelinde konuşmak gerekirse gereğinden fazla iş yapıyor. Hem puan tutup, hem spam yapıp, hemde UI güncelliyo mesela. Bunların ayrı ayrı yazılması çok daha iyi olur.

Şimdilik gördüklerim bunlar ama ilk deneme için iyi gittiğinizi söylemem lazım :clap:

3 Beğeni

UI konusunda hala değişiklikler olacak özellikle oyun dışı alanların tasarımı bittikten sonra. Roket boyu ise markette geliştirme olarak bulunuyor oyun oynadıkça topladığımız puanlar ile roketleri UFO’yu küçülte biliyoruz UFO yu hızlandırıp kalp ve enerji kalkanının çıkma olasılığını arttırılabiliyor. kalp kısmında birden fazla kalp kullanmamızın sebebi oyuncu yanmadan çok sayıda kalp toplarsa oraya sığmaya bilir, belli bir sayıya kadar kalbi arttırıp daha fazlasında +5 gibi yazabiliriz. buna ek olarak oradaki saniye 4 basamaklı onu 2 ye kısmamız gerekecek çok dikkat dağıtıyor =D.

PlayerPref’i internette ararken karşıma gelen ilk seçenek olduğu için kullandım =D diğer kısımlar için ise çoğu scrpitte o bölmeyi yaptım ilk başlangıçta gamebrain diye tek bir scrpitten oluşuyordu =D az daha böleyim madem =D

Uçuşu hissettirmesi için zeminde yıldız gibi görünen noktalar akabilir.

Kayan yıldızdan çok yanıp sönen yıldızlar aklıma gelmişti :thinking: kayma olayı da mantıklı tabi ui çevresinden geniş bir arka plan hazırlayıp roketi gittiği yönün tersine kaydırabiliriz

Roketler filan arka plana ayak uyduramıyor eğer roketler için aklıma bir fikir gelirse tekrar masaya koyacağım ama

2 Beğeni

Olayın çokta roketlerin yada playerin hareket etmesi ile alakası yok. Arkaplanı çok doğru kullanmıyorsun. 2 önerim olacak.

  1. Arka planını daha büyüt bu sorununa çözüm olacaktır ama büyüyeceği için istediğin görüntüyü yakalayamayabilirsin.
  2. Genellikle kullanılan çözüm bu. Arkaplanını yerleştirirken biraz hile yapıcaz. Normalde sen direk arka planı ekranın en arkasında kalacak çekilde koymuşsun. Onun yerine 2 satır 3 sutundan oluşan arkaplanlar koy. Yanı bu arkaplanı üste 3 altta 3 olacak şekilde yeniden oyun ekranına yerleştir. Daha sonra playerın konumu ile bu 6lının konumlarını karşışatır. Kenarına yaklaştığın kısıma kenarından uzaklaştığın kısmın kenarlarını kaydır. Bu şekilde sorunun çözülecek.

arka plan canvas’ın 2 katı boyutunda zaten ufak bir kontrol kodu koymam lazım sadece. orada ekrandan çıkma sebebi küçük olmasından kaynaklı değil :slight_smile: @Anatolia ya göstermek için kabaca yapmıştım. Benim asıl dediğim roketler normalden hızlı gidiyormuş yada duruyormuş hissiyatı veriyor

Benim düşündüğüm kayan cisimler burada yaptığımız kar yağmasına benziyor. Uzaydaki serbest dolaşan cisimlerin arasında gidiyormuş gibi bir görüntü olacaktı. Zemin de siyah olacak. Roket sabit dursa bile onlar akmaya devam etmeli. Teknik olarak mümkün mü bilmiyorum.



şurdaki gibi arkada gezekenlerastroidler vs kayacak yani ufodan bağımsız olarak

1 Beğeni


UI tam oturmaya başladı artık en azından düz renk kullanımı bitti.
Ana Menü / Devam Et(başla) / Belki birde market butonları evrensel ikonlar olacak . Benim düşüncem çeviri ile az uğraşmak bunun yanındada mümkün olduğunca oyunu evrensel olarak anlaşılabilir yapmak ondan ikonlara taktım =D ondan dolayı @LobbyLobster’ı da bu konuda zorluyorum =D

@zabzuro oyun içindeki üst kısma işte bu dediğimiz bir şeyi oturta bilirsek o senin dediğin kalp sayısını arttırmayı da yapacam

@Anatolia senin önerdiğin arka plan işini en sona bıraktım diğer tüm UI’lar oturunca arkada gezegenler yada astroidler gezecek Ufo haraketine göre de azıcık sağ/sol yukarı / aşşağı kayacak.

1 Beğeni

Bunu söylemek için geç kalmış olabilirim ama piksel tasarım yerine kenarları yumuşak bir tasarım daha iyi olmaz mıydı? Artık çoğu kişi yüksek piksel yoğunluğuna sahip telefonlar kullanıyor.

Şahsen bende aynı görüşe sahibim fakat @LobbyLobster bu şekilde daha güzel olacağını savundu ve asılında ayşe yaparkende pixel art tasarım çok tatlı olmuştu o ayşeyi gördükten sonra bende tamam demiştim :slight_smile: