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 :
bu ayşe
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.
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
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