UNITY’de Hile Sistemi Oluşturmak (GTA Tarzı)

Yayınlandı: 05 Ağustos 2013 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde
Etiketler:, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Yine ve yeniden merhaba,

Bu derste GTA oyunlarında olduğu gibi (LEAVEMEALONE veya ASPIRINE tarzı) bir hile sistemi kodlamayı göstereceğim. Daha doğrusu çoktan kodladığım bu sistemin kaynak kodunu vereceğim. Dersin ilham kaynağı için tıklayın: http://unitynoobs.blogspot.co.uk/2012/05/sequences-like-cheat-codes-unity-3d.html#more

Kullanabileceğiniz iki farklı sistem oluşturdum. Bunların birbirine göre artıları ve eksileri bulunuyor. Yine de her iki sistem de üzerinde oynamalar yapılarak tam istediğiniz şekle dönüştürülebilir…

Birinci Yöntem (Tavsiye Edilir): Bu sistemi kullanırsanız hileniz sadece A-Z arası harflerden (Türkçe karakter desteği de var) ve 0-9 arası rakamlardan oluşabilir. Yani hilenizde nokta işareti gibi herhangi bir işaret veya boşluk karakteri bulunduramazsınız (yazdığım ufak bir kod sayesinde hilenizdeki noktalar, virgüller ve boşluklar otomatik olarak siliniyor ama bu durum ‘+’ veya ‘*’ gibi diğer karakterler için geçerli değil. Bu karakterleri kullanırsanız bu sistem işe yaramaz).

Sistemi test etmek için aşağıdaki kodu bir objenize JavaScript component olarak atayın ve Inspector’dan “Hile Kodu“na değer olarak birşeyler girin (örneğin 1adamvarmışcanısıkılan girebilirsiniz.):

#pragma strict

public var hileKodu : String;
public var ikiTusArasiMaxZaman : float = 1.0;

private var enSonTusaBasmaZamani : float;
private var basilmasiGerekenSiradakiHarf : int;

function Start()
{
	if( hileKodu == null || hileKodu.Length == 0 )
		Destroy( this );

	// Hile kodundaki tüm harfleri büyük harfe çevir
	hileKodu = hileKodu.ToUpper();

	// İ harflerini I harfiyle değiştir (yoksa işler karışabiliyor)
	hileKodu = hileKodu.Replace( 'İ', 'I' );

	// Hile kodundaki boşluk, nokta ve virgüllerden kurtul
	hileKodu = hileKodu.Replace( " ", "" );
	hileKodu = hileKodu.Replace( ".", "" );
	hileKodu = hileKodu.Replace( ",", "" );

	enSonTusaBasmaZamani = Time.time;
	basilmasiGerekenSiradakiHarf = 0;
}

function OnGUI()
{
	if( Input.anyKeyDown )
	{
		var e : Event = Event.current;

		if( e.type == EventType.KeyDown )
		{
			var tus : KeyCode = e.keyCode;

			if( tus != KeyCode.None )
			{
				if( tus == KeyCode.RightBracket )
					TusuIslemeAl( 'Ü'[0] );
				else if( tus == KeyCode.LeftBracket )
					TusuIslemeAl( 'Ğ'[0] );
				else if( tus == KeyCode.Quote )
					TusuIslemeAl( 'I'[0] );
				else if( tus == KeyCode.Semicolon )
					TusuIslemeAl( 'Ş'[0] );
				else if( tus == KeyCode.Backslash )
					TusuIslemeAl( 'Ç'[0] );
				else if( tus == KeyCode.Slash )
					TusuIslemeAl( 'Ö'[0] );
				else if( tus.ToString().Length == 6 && e.keyCode.ToString().Substring( 0, 5 ) == "Alpha" )
					TusuIslemeAl( tus.ToString()[5] ); // 0-9 arası rakamlar işleme alınır
				else if( tus.ToString().Length == 7 && e.keyCode.ToString().Substring( 0, 6 ) == "Keypad" )
					TusuIslemeAl( tus.ToString()[6] ); // 0-9 arası rakamlar işleme alınır
				else if( tus.ToString().Length == 1 )
					TusuIslemeAl( tus.ToString()[0] ); // A-Z arası harfler işleme alınır
			}
		}
	}
}

function TusuIslemeAl( tus : char )
{
	print( tus + " işleme alındı" );

	// Eğer bir önceki tuşa bastıktan sonra geçen zaman çok fazlaysa hileyi başa sar
	if( Time.time > enSonTusaBasmaZamani + ikiTusArasiMaxZaman )
		basilmasiGerekenSiradakiHarf = 0;

	if( tus == hileKodu[basilmasiGerekenSiradakiHarf] )
	{
		// Eğer doğru tuşa basarsak...
		basilmasiGerekenSiradakiHarf++;

		if( ( basilmasiGerekenSiradakiHarf ) >= hileKodu.Length )
		{
			basilmasiGerekenSiradakiHarf = 0;

			// Hile kodu başarıyla girildi! Yapılacakları buraya yaz...
			print( "Hile " + Time.time + " anında aktifleştirildi!" );
		}
	}
	else
	{
		// Eğer yanlış tuşa basarsak...
		if( hileKodu[0] == tus )
			basilmasiGerekenSiradakiHarf = 1;
		else
			basilmasiGerekenSiradakiHarf = 0;
	}

	enSonTusaBasmaZamani = Time.time;
}

İkinci Yöntem: Bu sistemin önceki sisteme göre artısı klavyenizdeki tüm tuşları destekliyor olmasıdır. Ama Unity’nin KeyCode yapısında Türkçe karakter desteği olmadığı için ğ, ü, ş gibi Türkçe karakterlerin uygun KeyCode karşılığını bilmelisiniz. Dediğim gibi, bu sistem klavyedeki tüm tuşları destekler ve bu yüzden hileyi girerken Tab veya NumLock tuşuna bile bassanız girmekte olduğunuz hile geçersiz hale gelir ve baştan girmeniz gerekir. Bir hilede ‘*’, ‘/’ veya boşluk gibi karakterlerin olmasına pek de gerek olmadığı için ben daha kullanışlı olan Birinci Yöntem’i tavsiye ediyorum.

Bu sistemi test etmek içinse alttaki kodu bir objenize JavaScript component olarak atayın ve Inspector’dan “Hile Kodu“nu genişletip “Size” değerini artırın ve “Element 0” gibi elemanlara sırayla hilenizi oluşturan tuş kombinasyonunu girin. Örneğin “MERHABA” kombinasyonunu deneyebilirsiniz:

#pragma strict

public var hileKodu : KeyCode[];
public var ikiTusArasiMaxZaman : float = 1.0;

private var enSonTusaBasmaZamani : float;
private var basilmasiGerekenSiradakiHarf : int;

function Start()
{
	if( hileKodu == null || hileKodu.Length == 0 )
		Destroy( this );

	enSonTusaBasmaZamani = Time.time;
	basilmasiGerekenSiradakiHarf = 0;
}

function OnGUI()
{
	if( Input.anyKeyDown )
	{
		var e : Event = Event.current;

		if( e.type == EventType.KeyDown )
		{
			var tus : KeyCode = e.keyCode;

			if( tus != KeyCode.None )
			{
				TusuIslemeAl( tus );
			}
		}
	}
}

function TusuIslemeAl( tus : KeyCode )
{
	print( tus + " işleme alındı" );

	// Eğer bir önceki tuşa bastıktan sonra geçen zaman çok fazlaysa hileyi başa sar
	if( Time.time > enSonTusaBasmaZamani + ikiTusArasiMaxZaman )
		basilmasiGerekenSiradakiHarf = 0;

	if( tus == hileKodu[basilmasiGerekenSiradakiHarf] )
	{
		// Eğer doğru tuşa basarsak...
		basilmasiGerekenSiradakiHarf++;

		if( ( basilmasiGerekenSiradakiHarf ) >= hileKodu.Length )
		{
			basilmasiGerekenSiradakiHarf = 0;

			// Hile kodu başarıyla girildi! Yapılacakları buraya yaz...
			print( "Hile " + Time.time + " anında aktifleştirildi!" );
		}
	}
	else
	{
		// Eğer yanlış tuşa basarsak...
		if( hileKodu[0] == tus )
			basilmasiGerekenSiradakiHarf = 1;
		else
			basilmasiGerekenSiradakiHarf = 0;
	}

	enSonTusaBasmaZamani = Time.time;
}

Tekrar görüşmek dileğiyle!

yorum
  1. celalqurbanov dedi ki:

    Eline saglik , cok guzel olmus !

  2. Hüseyin Turab Korkmaz dedi ki:

    Çok yararlı hemde türkçe

  3. Caner dedi ki:

    C++ İçin Olsaydı Daha Güzel Olurdu

Bir Yanıt Bırakın

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

WordPress.com Logosu

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

Twitter resmi

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

Facebook fotoğrafı

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

Google+ fotoğrafı

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

Connecting to %s