UNITY Android – Ekranda Parmakla Çevrilebilir Direksiyon Örneği

Yayınlandı: 16 Eylül 2013 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde
Etiketler:, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

SON GÜNCELLEME (21.01.2015): Scriptin UI sisteminde çalışan versiyonu da eklendi.

Hepinize merhaba,

Bu dersimizde bir anlatım yapmayacağım ama yazdığım bir scripti sizinle paylaşacağım. Bu script sayesinde ekranda bir direksiyonu mouse ile ya da mobil cihazlarda parmak ile döndürebilir, scriptin döndürdüğü değeri kullanarak arabanıza yön verebilir ya da bir uçağı döndürebilirsiniz. Scripti olabildiğince comment’lemeye çalıştım.

Direksiyon scriptinin iki farklı versiyonu mevcut: eski GUI sistemini (OnGUI) destekleyen kod ve Unity 4.6 ile gelen yeni UI sistemini destekleyen kod. İkisini de ayrı ayrı paylaşıyorum:

OnGUI Üzerinde Çalışan Kod

Alttaki scripti projenize ekleyin. Ne zaman ki direksiyonun döndürdüğü değeri kullanmak istiyorsunuz, o zaman Direksiyon scriptinin EgimiAl() fonksiyonunu çağırın. Bu fonksiyon [-1,1] aralığında bir float döndürür; tıpkı Input.GetAxis(“Horizontal”) gibi.

#pragma strict

public var maksimumDonusAcisi : float = 500f; // Direksiyonun dönebileceği maksimum açı
public var direksiyonEbat : float = 256f; // Direksiyonun ekranda pixel cinsinden boyutu
public var deltaPivot : Vector2 = Vector2.zero; // Eğer direksiyon tam merkezinden dönmüyorsa pivotuyla oynayarak durumu düzeltebilirsin
public var direksiyonDuzelmeHizi : float = 200f; // Direksiyon bırakıldığında eski haline dönene kadar saniyede döneceği açı
public var direksiyonTexture : Texture2D; // Direksiyonun texture'si

private var direksiyonEgim : float; // Direksiyonun eğimi

private var direksiyonTutuluyor : boolean; // Direksiyonun elle tutulup tutulmamakta olduğunu depolayan değişken
private var direksiyonKonum : Rect; // Direksiyonun ekrandaki konumu
private var direksiyonMerkez : Vector2; // Direksiyonun ekran koordinatlarında (Rect değil) merkezi
private var direksiyonEskiEgim : float; // Gerekli bir değişken

// Bölüm başlayınca tek seferlik çalıştırılır
function Start()
{
    // Değişkenlere değer ata ve direksiyonun ekrandaki konumunu hesapla
    direksiyonTutuluyor = false;
    direksiyonKonum = new Rect( 25, Screen.height - direksiyonEbat - 25, direksiyonEbat, direksiyonEbat );
    direksiyonMerkez = new Vector2( direksiyonKonum.x + direksiyonKonum.width * 0.5f, Screen.height - direksiyonKonum.y - direksiyonKonum.height * 0.5f );
    direksiyonEgim = 0f;
}

// Direksiyonun eğimini döndürür. Bu değeri kullanarak arabayı döndürmek gibi işlemler yapılabilir
// Döndürülen değer -1 ile 1 arasındadır ve direksiyonu sola kırınca negatif değer,
// sağa kırınca pozitif değer döndürülür.
public function EgimiAl()
{
    return direksiyonEgim / maksimumDonusAcisi;
}

// Ekrana direksiyonu çizdir
function OnGUI()
{
    // Alttaki satırın başındaki comment'i silerek direksiyonu tutabileceğin alanı görebilirsin
    // GUI.Box( direksiyonKonum, "" );

    var eskiRotasyon : Matrix4x4 = GUI.matrix;
    GUIUtility.RotateAroundPivot( direksiyonEgim, direksiyonKonum.center + deltaPivot );
    GUI.Box( direksiyonKonum, direksiyonTexture, GUI.skin.label );
    GUI.matrix = eskiRotasyon;
}

#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_WEBPLAYER
/*
** Bu kod parçası sadece Unity editöründe, PC, MAC, Linux ve Web Player'da çalışır
*/
// Her frame'de (kare) bir kez çalıştırılır
function Update()
{
    // Eğer direksiyon mouse tarafından tutuluyorsa
    if( direksiyonTutuluyor )
    {
        var mouseKonum : Vector2;

        // Mousenin ekrandaki konumunu bul
        mouseKonum = Input.mousePosition;

        var direksiyonYeniEgim : float = Vector2.Angle( Vector2.up, mouseKonum - direksiyonMerkez );

        // Eğer mouse direksiyonun merkezine çok yakınsa işlem yapma
        if( Vector2.Distance( mouseKonum, direksiyonMerkez ) > 20f )
        {
            if( mouseKonum.x > direksiyonMerkez.x )
                direksiyonEgim += direksiyonYeniEgim - direksiyonEskiEgim;
            else
                direksiyonEgim -= direksiyonYeniEgim - direksiyonEskiEgim;
        }

        // Direksiyonun eğiminin maksimum dönme açısını aşmadığından emin ol
        if( direksiyonEgim > maksimumDonusAcisi )
            direksiyonEgim = maksimumDonusAcisi;
        else if( direksiyonEgim < -maksimumDonusAcisi )
            direksiyonEgim = -maksimumDonusAcisi;

        direksiyonEskiEgim = direksiyonYeniEgim;

        // Eğer mouse kaldırılırsa direksiyonu bırak
        if( Input.GetMouseButtonUp( 0 ) )
            direksiyonTutuluyor = false;
    }
    else // Eğer direksiyon tutulmuyorsa
    {
        // Eğer mouse direksiyonu tuttuysa durumu güncelle
        if( Input.GetMouseButtonDown( 0 ) && direksiyonKonum.Contains( new Vector2( Input.mousePosition.x, Screen.height - Input.mousePosition.y ) ) )
        {
            direksiyonTutuluyor = true;
            direksiyonEskiEgim = Vector2.Angle( Vector2.up, Input.mousePosition - direksiyonMerkez );
        }

        // Eğer direksiyon serbestse ve dönmüş durumdaysa onu direksiyonDuzelmeHizi ile eski haline döndür
        if( !Mathf.Approximately( 0f, direksiyonEgim ) )
        {
            var deltaEgim : float = direksiyonDuzelmeHizi * Time.deltaTime;

            if( Mathf.Abs( deltaEgim ) > Mathf.Abs( direksiyonEgim ) )
            {
                direksiyonEgim = 0f;
                return;
            }

            if( direksiyonEgim > 0f )
                direksiyonEgim -= deltaEgim;
            else
                direksiyonEgim += deltaEgim;
        }
    }
}
#else
/*
** Bu kod parçası sadece mobil cihazlarda çalışır
*/
private var parmakId : int = -1; // Dokunmatik ekranlarda kullanacağımız bir değişken

// Her frame'de (kare) bir kez çalıştırılır
function Update()
{
    // Eğer direksiyon parmak tarafından tutuluyorsa
    if( direksiyonTutuluyor )
    {
        var parmakKonum : Vector2;

        // Parmağın ekrandaki konumunu bul
        for( var parmak : Touch in Input.touches )
        {
            if( parmak.fingerId == parmakId )
            {
                parmakKonum = parmak.position;

                // Eğer parmak ekrandan kaldırılıyorsa bir sonraki frame'de direksiyonu serbest bırak
                if( parmak.phase == TouchPhase.Ended || parmak.phase == TouchPhase.Canceled )
                {
                    direksiyonTutuluyor = false;
                }
            }
        }

        var direksiyonYeniEgim : float = Vector2.Angle( Vector2.up, parmakKonum - direksiyonMerkez );

        // Eğer parmak direksiyonun merkezine çok yakınsa işlem yapma
        if( Vector2.Distance( parmakKonum, direksiyonMerkez ) > 20f )
        {
            if( parmakKonum.x > direksiyonMerkez.x )
                direksiyonEgim += direksiyonYeniEgim - direksiyonEskiEgim;
            else
                direksiyonEgim -= direksiyonYeniEgim - direksiyonEskiEgim;
        }

        // Direksiyonun eğiminin maksimum dönme açısını aşmadığından emin ol
        if( direksiyonEgim > maksimumDonusAcisi )
            direksiyonEgim = maksimumDonusAcisi;
        else if( direksiyonEgim < -maksimumDonusAcisi )
            direksiyonEgim = -maksimumDonusAcisi;

        direksiyonEskiEgim = direksiyonYeniEgim;
    }
    else // Eğer direksiyon tutulmuyorsa
    {
        // Eğer bir parmak direksiyonu yeni tuttuysa durumu güncelle
        for( var parmak : Touch in Input.touches )
        {
            if( parmak.phase == TouchPhase.Began )
            {
                if( direksiyonKonum.Contains( new Vector2( parmak.position.x, Screen.height - parmak.position.y ) ) )
                {
                    direksiyonTutuluyor = true;
                    direksiyonEskiEgim = Vector2.Angle( Vector2.up, parmak.position - direksiyonMerkez );
                    parmakId = parmak.fingerId;
                }
            }
        }

        // Eğer direksiyon serbestse ve dönmüş durumdaysa onu direksiyonDuzelmeHizi ile eski haline döndür
        if( !Mathf.Approximately( 0f, direksiyonEgim ) )
        {
            var deltaEgim : float = direksiyonDuzelmeHizi * Time.deltaTime;

            if( Mathf.Abs( deltaEgim ) > Mathf.Abs( direksiyonEgim ) )
            {
                direksiyonEgim = 0f;
                return;
            }

            if( direksiyonEgim > 0f )
                direksiyonEgim -= deltaEgim;
            else
                direksiyonEgim += deltaEgim;
        }
    }
}
#endif

Yeni UI Sistemi Üzerinde Çalışan Kod

Alttaki scripti projenize ekleyin ve istediğiniz bir objeye component olarak ekleyin. Ardından UI canvas‘ınızda bir Image oluşturun, Image’i istediğiniz gibi konumlandırın ve Image’e direksiyon sprite‘sini atayın. Image’a Event Trigger component‘i eklemeyin yoksa script düzgün çalışmayabilir. Son olarak, scripti verdiğiniz objeyi seçin ve UI_Element değişkenine değer olarak direksiyon Image’ini verin.

Ne zaman ki direksiyonun döndürdüğü değeri kullanmak istiyorsunuz, o zaman SteeringWheel scriptinin GetClampedValue() fonksiyonunu çağırın. Bu fonksiyon [-1,1] aralığında bir float döndürür; tıpkı Input.GetAxis(“Horizontal”) gibi.

NOT: Bu kod C# ile yazılmıştır ve İngilizce’dir.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using System.Collections;

public class SteeringWheel : MonoBehaviour
{
	public Graphic UI_Element;

	RectTransform rectT;
	Vector2 centerPoint;

	public float maximumSteeringAngle = 200f;
	public float wheelReleasedSpeed = 200f;

	float wheelAngle = 0f;
	float wheelPrevAngle = 0f;

	bool wheelBeingHeld = false;

	public float GetClampedValue()
	{
		// returns a value in range [-1,1] similar to GetAxis("Horizontal")
		return wheelAngle / maximumSteeringAngle;
	}

	public float GetAngle()
	{
		// returns the wheel angle itself without clamp operation
		return wheelAngle;
	}

	void Start()
	{
		rectT = UI_Element.rectTransform;

		InitEventsSystem();
		UpdateRect();
	}

	void Update()
	{
		// If the wheel is released, reset the rotation
		// to initial (zero) rotation by wheelReleasedSpeed degrees per second
		if( !wheelBeingHeld && !Mathf.Approximately( 0f, wheelAngle ) )
		{
			float deltaAngle = wheelReleasedSpeed * Time.deltaTime;
			if( Mathf.Abs( deltaAngle ) > Mathf.Abs( wheelAngle ) )
				wheelAngle = 0f;
			else if( wheelAngle > 0f )
				wheelAngle -= deltaAngle;
			else
				wheelAngle += deltaAngle;
		}

		// Rotate the wheel image
		rectT.localEulerAngles = Vector3.back * wheelAngle;
	}

	void InitEventsSystem()
	{
		// Warning: Be ready to see some extremely boring code here :-/
		// You are warned!
		EventTrigger events = UI_Element.gameObject.GetComponent<EventTrigger>();

		if( events == null )
			events = UI_Element.gameObject.AddComponent<EventTrigger>();

		if( events.triggers == null )
			events.triggers = new System.Collections.Generic.List<EventTrigger.Entry>();

		EventTrigger.Entry entry = new EventTrigger.Entry();
		EventTrigger.TriggerEvent callback = new EventTrigger.TriggerEvent();
		UnityAction<BaseEventData> functionCall = new UnityAction<BaseEventData>( PressEvent );
		callback.AddListener( functionCall );
		entry.eventID = EventTriggerType.PointerDown;
		entry.callback = callback;

		events.triggers.Add( entry );

		entry = new EventTrigger.Entry();
		callback = new EventTrigger.TriggerEvent();
		functionCall = new UnityAction<BaseEventData>( DragEvent );
		callback.AddListener( functionCall );
		entry.eventID = EventTriggerType.Drag;
		entry.callback = callback;

		events.triggers.Add( entry );

		entry = new EventTrigger.Entry();
		callback = new EventTrigger.TriggerEvent();
		functionCall = new UnityAction<BaseEventData>( ReleaseEvent );//
		callback.AddListener( functionCall );
		entry.eventID = EventTriggerType.PointerUp;
		entry.callback = callback;

		events.triggers.Add( entry );
	}

	void UpdateRect()
	{
		// Credit to: mwk888 from unityAnswers
		Vector3[] corners = new Vector3[4];
		rectT.GetWorldCorners( corners );

		for( int i = 0; i < 4; i++ )
		{
			corners[i] = RectTransformUtility.WorldToScreenPoint( null, corners[i] );
		}

		Vector3 bottomLeft = corners[0];
		Vector3 topRight = corners[2];
		float width = topRight.x - bottomLeft.x;
		float height = topRight.y - bottomLeft.y;

		Rect _rect = new Rect( bottomLeft.x, topRight.y, width, height );
		centerPoint = new Vector2( _rect.x + _rect.width * 0.5f, _rect.y - _rect.height * 0.5f );
	}

	public void PressEvent( BaseEventData eventData )
	{
		// Executed when mouse/finger starts touching the steering wheel
		Vector2 pointerPos = ( (PointerEventData) eventData ).position;

		wheelBeingHeld = true;
		wheelPrevAngle = Vector2.Angle( Vector2.up, pointerPos - centerPoint );
	}

	public void DragEvent( BaseEventData eventData )
	{
		// Executed when mouse/finger is dragged over the steering wheel
		Vector2 pointerPos = ( (PointerEventData) eventData ).position;

		float wheelNewAngle = Vector2.Angle( Vector2.up, pointerPos - centerPoint );
		// Do nothing if the pointer is too close to the center of the wheel
		if( Vector2.Distance( pointerPos, centerPoint ) > 20f )
		{
			if( pointerPos.x > centerPoint.x )
				wheelAngle += wheelNewAngle - wheelPrevAngle;
			else
				wheelAngle -= wheelNewAngle - wheelPrevAngle;
		}
		// Make sure wheel angle never exceeds maximumSteeringAngle
		wheelAngle = Mathf.Clamp( wheelAngle, -maximumSteeringAngle, maximumSteeringAngle );
		wheelPrevAngle = wheelNewAngle;
	}

	public void ReleaseEvent( BaseEventData eventData )
	{
		// Executed when mouse/finger stops touching the steering wheel
		// Performs one last DragEvent, just in case
		DragEvent( eventData );

		wheelBeingHeld = false;
	}
}

Scripti projelerinizde credit vermeden kullanabilirsiniz ama eğer credit verirseniz elbette ki memnun olurum.

Scripti kullanarak oluşturduğum örnek projeyi Web Player üzerinden test etmek isterseniz (OnGUI versiyonunu kullandım): http://yasirkula.freeiz.com/Projects/SimpleCarProject.html

Örnek projeyi indirmek isterseniz (Unity 5 desteklemez): https://www.dropbox.com/s/ex1yagax4k236p7/SimpleCarProject.rar?dl=0

Başka derslerde görüşmek dileğiyle!

yorum
  1. Berke dedi ki:

    Merhaba Hocam Şimdi Ben Bu scripti Uyguladim Androide Sorunsuz Emeginiz İçin Teşekkürler Ama bu scriptte Terrainin İçine giriyor Aracim .Bunu nasil engelleriz Vede Kendi olusturdugum Aracimin Scriptinde Degisikliklere Gerek VArmidir ?

    Teşekkürler 🙂

    Not: Sitenizi Yeni Ögrendim Konulariniza Takipte Vede Azicik katkim Bulunmasi İçin Reklamlariniza basiyorum 🙂 .

    • yasirkula dedi ki:

      Teşekkür ederim ama reklamlara tıklamayın. Onları WordPress kendisi veriyo yani bana katkısı yok. Araba oyunu yapmadığım için iki sorunuz için de fikrim yok malesef.

  2. Berke dedi ki:

    Teşekkürler peki Egim almasini nasil engelleriz Bir Bilginiz Varmi ? Teşekkürler

  3. kamuran sönecek dedi ki:

    Hocam çok büyük bir sıkıntı yaşıyorum.
    var ileriR = new Rect(4,(Screen.height-255),120,120);
    GUI.DrawTexture (ileriR,ileri);

    /*Bu kısım dokunmatik ekran bölümü*/

    for(var t: Touch in Input.touches )
    {

    if ( ileriR.Contains(t.position)){
    transform.animation.Play(“Yuruyus”);
    curSpeed = speed *1;
    controller.SimpleMove(forward*curSpeed);
    }
    }
    /*bitimi*/

    kodlarım bu şekil ancak şöyle bir şey söz konusu oluyor. Texture ekranda istediğim yerde çıkıyor. Ancak dokunmatik alan onun üzerinde değil. Y kordinatının tam zıt kısmında çıkıyor. Ekranın en üstüne dokununca yürüyor. başka bir Rect oluşturup eksi bir ile çarpıp onu dokunmatik alanı olarak kullanmak istedim ancak oda hiç bir tepki vermedi. Çıldırmak üzereyim acaba buna bir çözüm bulmak mümkünmü. Şunuda denedim ; t nin pozisyonunu recti belirlediğim pozisyonlarla karşılaştırdım gene aynı hatayı aldım.

    • yasirkula dedi ki:

      Sizin yaşadığınız bu sorunu ben de yaşamıştım birkaç kez. Ancak “sizde başarılı olmayan” ikinci bir Rect oluşturma yöntemi bende işe yaradı. Siz diğer Rect’i şöyle tanımlamadınız mı:

      var digerR = new Rect(4, 255,120,120);

      Bence böyle olması lazım.

      • kamuran sönecek dedi ki:

        Teşekkürler çalıştı, simetrik olarak alıyormuş ekseni. Çok teşekkürler tekrar. Blogu takip etmeye devam edeceğim.

    • hasereilaclamasi dedi ki:

      ek olarak şunu farkettim, t.touch Y eksenini simetrik olarak değerlendirdiğini gördüm.

      • hasereilaclamasi dedi ki:

        evet çok teşekkürler bende tam onu deniyordum şimdi umarım çalışır durumu paylaşıcam.

      • yasirkula dedi ki:

        GUI elemanlarını yerleştirirken kullanılan Y koordinatı ile Input komutundaki Y koordinatı dediğiniz gibi birbirine simetrik. Sorunu çözmenize sevindim.

      • Alperen dedi ki:

        Kardeş bu scripti asset store daki car tutorial e ekleyip buraya atarmısın

  4. Unity3D dedi ki:

    Merhaba çok güzel bir script ama bunda multi touch özelligi yok sanırım ekranda başka bir yere tıkladıgımda (android cihazda) direksiyon bozuluyor bunun bir çözümü varmı bizimle paylaşırmısınız

    • Unity3D dedi ki:

      yanlış script i kullanırsan tabi olmaz android için olanı sorunsuz mükemmel bir script ellerinize saglık hocam birde bağış butonu yapın sitenize , çok güzel bir hizmet mutlaka ödeme yapanlar olacaktır .)

  5. Hakan dedi ki:

    Hocam multi touch sorununu çözemezmiyiz android için. Direksiyonu çeviriken diğer butonlar devre dışı kalıyor. Bunu nasıl halledebiliriz?

    • yasirkula dedi ki:

      Direksiyonda multi touch desteğini disable eden bir komut yok. Sorun şundan kaynaklanıyor büyük olasılıkla: diğer butonları if( GUI.Button( blabla ) ) BirşeylerYap(); şeklinde oluşturdunuz. Unity (veya işletim sisteminin kendisi de olabilir) birden çok parmağı ekranda görünce bu parmakların pozisyonlarının tam ortasını hesaplıyor ve buraya etki ediyor. Yani diyelim sağ parmak ekranın en sağında, sol parmak ekranın en solunda. Bu durumda eğer tam ortada bir GUI.Button’unuz varsa anlamsız şekilde bu ortadaki GUI.Button çalışacaktır ama soldaki çalışmayacaktır. Yapabileceğiniz şey basılmasını istediğiniz butonların Rect konumlarını değişkenlere kaydedip Input.touches’taki tüm parmakların pozisyonuna ve TouchPhase’ine bakmak; eğer bir butonun konumu bu parmağı içeriyorsa (Rect.Containts() kullanılacak) ona göre gerekli işlemleri yaptırmak.

      Sorunu çözmek için başka bir yol bulursanız söyleyin.

      • Hakan dedi ki:

        Kod bilgim çok olmadığı için bunu koda nasıl dökerim.

      • yasirkula dedi ki:

        Rect’i değişkene kaydetmek:

        var butonKonum : Rect;
        
        function Start()
        {
          butonKonum = new Rect( 0, 0, 100, 100 );
        }
        
        function OnGUI()
        {
          GUI.Button( butonKonum, "Buton" );
        }
        

        Bir Rect’in parmağın konumunu içine alıp almadığına bakmak:

        for( var t : Touch in Input.touches )
        {
          if( butonKonum.Contains( t ) )
            Debug.Log( "Bu butonun üzerinde bir parmak var" );
        }
        
  6. Hakan dedi ki:

    Şöyle bir hata veriyor unity: “No appropriate version of ‘UnityEngine.Rect.Contains’ for the argument list ‘(UnityEngine.Touch)’ was found.”

  7. berati dedi ki:

    Scripti aynen kullanıyorum unityde test ederken calısıyor exe ye build yaptıgım zaman çalışıyor fakat androide cevirdiğim zaman ilk 1 sn ekranda görünüyor sonra kayboluyor direksiyon çok sacma bi hata diger tüm guı ları sildim hala aynı neden olabilir?

    • berati dedi ki:

      Sorunu buldum benim oyunum yan ekranda oynanıyor yan ekran yapma kodunu silince düzeldi direksiyonu yan ekranda çalışır hala nasıl getirebilirim?

  8. berati dedi ki:

    start () fonksiyonuna start() fonksiyonuna Screen.orientation = ScreenOrientation.LandscapeLeft; yazıp build edip tlfda denermisiniz tek bende olmuyordur heralde

    • yasirkula dedi ki:

      Ben de şimdi bu sorunu yaşadım ve çözümünü buldum. Ama önce sorunun kaynağından bahsedeyim:

      Siz Start fonksiyonunda ekranı yatay çeviriyorsunuz. Bu işlem oyun başladıktan çok kısa bir süre sonra gerçekleşiyor ama hemen gerçekleşmiyor. Ekran yatay çevrilmeden önce direksiyon scriptinin Start fonksiyonu çalıştırılıyor ve direksiyonKonum değişkeni düz ekrana göre bir değer alıyor. Düz ekranda sağ alt tarafı temsil eden koordinatlar yatay ekranda direksiyonun kaybolmasına sebep oluyor çünkü direksiyon aşağıda kalıyor, yatay ekranın yüksekliği direksiyonu göstermeye yetmiyor.

      Çözüm yolları şöyle:

      1) Player Settings’ten Default Orientation’ı Landscape Left yapabilirsiniz.
      2) Şu iki satırı direksiyon scriptinin Start fonksiyonundan çıkarıp Update fonksiyonuna koyabilirsiniz:

      direksiyonKonum = new Rect( Screen.width – direksiyonEbat – 75, Screen.height – direksiyonEbat – 75, direksiyonEbat, direksiyonEbat );

      direksiyonMerkez = new Vector2( direksiyonKonum.x + direksiyonKonum.width * 0.5f, Screen.height – direksiyonKonum.y – direksiyonKonum.height * 0.5f );

      Umarım sorunu çözer, kolay gelsin.

      NOT: Eğer oyun sırasında yatay ekran-düz ekran arasında geçiş yapmayacaksanız ilk yöntemi kullanın, performanstan kazanın.

  9. turgay dedi ki:

    Teşekkürler scripti kullanıyorum çok işime yaradı, fakat bir türlü arabanın sağ ve sol ön tekerleklerini döndürmek için uyarlayamadım bi fikriniz var mı ? paylaşırsanız sevinirim.

    • yasirkula dedi ki:

      Araba oyunu yapmadığından direksiyon nasıl dönmelidir onu bilmiyorum ama direksiyonun dönme miktarını EgimiAl() fonksiyonun döndürdüğü değere göre belirlemelisiniz.

  10. turgay dedi ki:

    Normalde WheelFL.steerAngle = 30; , WheelFR.steerAngle = 30; bu şekilde döndürüyorum tekerleri. WheelFL.steerAngle=direksiyon.EgimiAl(); WheelFR.steerAngle=direksiyon.EgimiAl(); diye çağırdığım zaman araç olduğu gibi bazen havaya kalkıyor gaza basınca tekerlerde dönmüyor, uğraşıyorum anlayamadım bi türlü.

  11. turgay dedi ki:

    gaza basınca araba havaya kalkıyor sadece, direksiyonun hiç bir etkisi yok.
    Şu şekilde araba kontrol scriptinin içine direksiyon = GameObject.Find( “Direksiyon” ).GetComponent( “Direksiyon” ); yazıyorum bundan dolayı araba havalanıyor.

  12. turgay dedi ki:

    Neyse hocam bir arkadaşın sayesinde çok rahat hallettim, izde çok saolun kodlar çok yardımcı oldu, ayrıca vitesi ileri ve geri alma gibi bir örnekte paylaşırsanız gerçekten çok iyi olur, çok teşekkürler.

  13. Alperen dedi ki:

    Kardeş bunu asset store daki car tutoriale ekleyip buraya koyarmısın

    • yasirkula dedi ki:

      Malesef bu direksiyon örneğini yaptım ama araba oyunlarında kodlar nasıl çalışır hiç bilgim yok. Siz biraz araştırarak kendiniz bulmalısınız yöntemi.

  14. RedySkyunders dedi ki:

    Örnek Proje linki gitmiş hocam.Zahmet olmazsa yenilermisiniz?

  15. isim dedi ki:

    Bu sistemi arabanın tekerleklerine nasıl entegre edebilirim ?

  16. Ali dedi ki:

    Script çok iyi android versiyonu için baya bir inceledim hem yeni şeyler öğreniyorum hem de kullanabildim. Ancak script dışında bir sıkıntım var 😦 Araba için gaz ve fren yaptım. Gaza basıyorum araba hareket ederken elimi gazdan kaldırınca direksiyonu döndürebiliyorum ayrıca arabada dönüyor bu durumda. Ancak 2 parmakta yani biri gaz biri direksiyon olunca ikiside çalışmıyor. Bir yorumda yazmışınız okudum onu orta noktasını alıyor diye dediğiniz çözümü uygulamaya çalıştım pek başarılı olamadım. Gaz, fren scripti aynı direksiyon scripti ise ayrı bunları birleştirerek mi kullanmalıyım multi touch için? Basit bir öneri verirseniz sevinirim. Teşekkür ederim.

    • yasirkula dedi ki:

      Heralde bir GUITexture var gaz pedalı şeklinde ve bunun OnMouseDrag’ını kullanıyorsunuz. Öyle yapmak yerine Update() fonksiyonunda ekrandaki her Touch için şu komutu kullanın:

      if( guiTexture.HitTest( t.position ) )
      {
      // gaza basılıyor
      }

      Multitouch için bkz.: https://yasirkula.com/2013/07/17/unity-ile-androide-uygulama-gelistirmek-1-dokunmatik-ekran-entegrasyonu/

      • OZ dedi ki:

        Merhaba bu sorunu ben de yaşıyorum.
        Paylaştığınız scripti kullanıyorum. Direksiyon ve gaz ayrı scriptler. GUI.DrawTexture olarak kullandığınız metodu GUITexture’a çevirip iki scripti birleştireyim ve sorundan kurtulayım dedim ama o zaman da GUITexture’un rotasyon desteklemediğini farkettim. GUI.DrawTexture ise HitTest desteklemiyor. Anlayacağınız sorun aynı şekilde devam ediyor.

        Önerebileceğiniz çözüm var mı acaba? Bu arada çok teşekkürler script için.

      • yasirkula dedi ki:

        guiTexture.HitTest’in GUI.DrawTexture için karşılığı şöyle:

        direksiyonKonum.Contains( new Vector2( parmak.position.x, Screen.height – parmak.position.y ) )

  17. OZ dedi ki:

    Araştırdıktan sonra farkettim ve dediğiniz gibi uygulamıştım ama hala aynı. Bir kaç platformda daha sordum umarım cevap alabilirim. Teşekkürler.

  18. Yavuz dedi ki:

    Selamünaleyküm ,
    Teşekkür Ederim.
    Scripti ve modeli üzerinde modifiye yaparak kullandım. Bazı eklemelerle o sakin havada yüzen adamı bir yokediciye çevirdim 🙂 Modelin sadeliği hoşuma gitti aynısını yapıp koyacaktım ya da olduğu gibi kullanacaktım. Sanırım aynısını yapmak gereksizdi.
    Güzel bir oyun projesi fikri geldi aklıma ve yaptım. Umarım arkadaşlarım beğenirler. iyi Günler.

  19. Erenmuslu dedi ki:

    hocam direksiyon attığım kuş modelini takip etmiyor

  20. Elcibey dedi ki:

    Unity’ye yeniyim
    Bu scripte oyuna attigimizda calismasi icin neler yapmaliyiz ?

    • yasirkula dedi ki:

      Kodlama bilginiz olmadan direksiyonun bir objeye yön vermesini sağlayamazsınız. Önce kod yazma konusunda deneyim kazanın; gerisi kendiliğinden gelir.

      • Elcibey dedi ki:

        Bilgim var ama arabayi ben suan baska kodlama ile donduruyorum. Ben sizin verdiginiz scripti arabama atsam ve egim’e suanki kullandigim scripti atsam olurmu sizce ?

      • yasirkula dedi ki:

        Denemek lazım. Daha önce araba oyunu yapmadım, üzerinde de hiç uğraşmadım. Kesinlikle bu konuda sıfır bilgiye sahibim. Beni araba oyununuza daha da bulaştırmayın lütfen 🙂

  21. Serhat Akgul dedi ki:

    Bu site bi harika Dostum 😀

  22. altugtunca dedi ki:

    hocam sizce bu araba koduna bu direksiyonu nasıl ekleyebilirim

    *Kod çok uzun olduğundan yönetici tarafından silindi*

  23. altugtunca dedi ki:

    hocam kod uzun olduğu için bu siteye koydum bu araba scriptine nasıl direksiyon ekleyebilirim.

    http://www.mediafire.com/view/7ryn0l5ib84bw2d/wheelScriptPC.js

  24. Ahmet dedi ki:

    hocam ilerisi hep yeşil bulamadım bırturlu nasıl düzeltcem yani uzağı gosterdıkçe yeşilleniyo görüntü anlatamadıysam ss alıyım nasıl cozebılırım

  25. murat dedi ki:

    Hocam selamlar bir sorum olacktı, bu direksiyon olayını kullanarak bi araç simulasyon uygulaması yaptım yalnız araç modellerinde tekerlkleri oluştururken haliyle uygun pozisyon için rotate yapıyoruz fakat oyun içinde ( unitynin hazır scriptlerini kullanıyorum bu arada ) tekerlerin rotatei sıfırlanıyor yani teker yan yatıyor saçma bi dönme şekli ortaya çıkıyor bunu nasıl düzeltebilirim unity içinde normal halde modeli attığım zaman mevcut halin hiç rotate yapılmamış gibi 0 derece olmasını nasıl gösterebilirim

    not: hocam hakkaten şuraya bi donate butonu koyda bi çay kahve ısmarlıyalım yada kocaeli taraflarındaysan gel bi çayımı iç 🙂

    • yasirkula dedi ki:

      Gerçekten araba oyunları konusunda hiç bilgim yok. Direksiyonu nasıl yaptın o zaman diyebilirsiniz elbet. Bununsa cevabı şöyle ki direksiyon yapmak için araba oyunu yapmayı bilmek zorunluluk değil. Bu konuda malesef kendi başınızasınız.

      Gösterdiğiniz ilgi için teşekkür ederim 🙂

  26. Azizi dedi ki:

    Merhaba, bu kodlar arabanın tekerleğini döndürmede nasıl kullanabilirim? Çok defa denedim ama yapamadım!!!

    • yasirkula dedi ki:

      Arabanın tekeri nerede dönüyor onu bulun. Genelde Input.GetAxis kullanılır klavye ile tekerlek döndürmek için. Orada klavye yerine direksiyonu kullanın (nasıl olduğu size kalmış).

      • osman dedi ki:

        Azizi arkadaşmın sorunu bende de var…
        1. sorum:Bu kodlarda Input.GetAxis dediğim yere direksiyonu nasıl kulanacağım ? yardımcı olurmusunuz.

        function FixedUpdate () {

        currentSpeed = (Mathf.PI*2*wheelFL.radius)*wheelFL.rpm*60/1000;
        currentSpeed = Mathf.Round(currentSpeed);

        if (((currentSpeed> 0) && (Input.GetAxis(“Vertical”) <0 )) || ((currentSpeed 0 ))){
        isBraking = true;
        }
        else{
        isBraking = false;
        wheelRR.brakeTorque =0;
        wheelRL.brakeTorque =0;
        }
        if (isBraking ==false){
        if ((currentSpeed (maxBackwardSpeed*-1))){

        wheelRR.motorTorque = maxTorque * Input.GetAxis(“Vertical”);
        wheelRL.motorTorque = maxTorque * Input.GetAxis(“Vertical”);
        }
        else {
        wheelRR.motorTorque = 0;
        wheelRL.motorTorque = 0;
        }
        }

        else{
        wheelRR.brakeTorque = maxBrakeTorque;
        wheelRL.brakeTorque = maxBrakeTorque;
        wheelRR.motorTorque = 0;
        wheelRL.motorTorque = 0;
        }
        if (Input.GetButton(“Vertical”)==false){
        wheelRR.brakeTorque = decellarationSpeed;
        wheelRL.brakeTorque = decellarationSpeed;
        }
        else{
        wheelRR.brakeTorque = 0;
        wheelRR.brakeTorque = 0;
        }
        wheelFL.steerAngle = maxsteerAngle * Input.GetAxis(“Horizontal”);
        wheelFR.steerAngle = maxsteerAngle * Input.GetAxis(“Horizontal”);

        GuiSpeed.text = currentSpeed.ToString();
        SetCurrentGear();
        GearSound();
        }

        2.sorum:direksiyon scriptini arabanın içine mi atacağım?
        3.sorum:unity 4,6,1 de gui texture yok.onu nasıl yapacağım?
        şimdiden teşekkürler…

      • yasirkula dedi ki:

        Bir nevi arabanın hareket scriptini sizin için benim yazmamı istiyorsunuz. Bunu yapmayacağım ama ipuçları vereceğim:

        1- Input.GetAxis(“Vertical”) yazan yerler gaz pedalı ile alakalı.
        2- Input.GetAxis(“Horizontal”) yazan yerlerde ise direksiyonScripti.EgimiAl() komutunu kullanacaksınız.

        2. sorunuzun cevabını bilmiyorum.

        3. sorunuzun çözümü ise bir Empty GameObject oluşturup Component-Rendering-GUITexture yolunu izlemek.

  27. osman dedi ki:

    bu arada Sneaky Snake oyunu da çok güzel

  28. azizi dedi ki:

    Osman arkadaşım, sorunu çözdüm. Aşağıdaki kodları script’ine kopyala yapıştır, yeter. Tekerleğin sağa ve sola dönmesi mümkün oluyor.

    public function EgimiAl()
    {
    wheelFL.steerAngle=direksiyonEgim / 10;
    wheelFR.steerAngle=direksiyonEgim / 10;

    return direksiyonEgim;
    }

    • osman dedi ki:

      Azizi kardeşim tam olarak anlamadım…bana verdiğin kodları hangi scriptime kopyalayayım.benim yazdığım kodlarn olduğu yere mi?
      Benim yazdığım kodlara yazacaksam eğer.siz benim kodların üzerinde değişiklik yaparak kopyalayım buraya yazabilirmisiniz.Teşekkür ederim

    • osman dedi ki:

      Bide direksiyon kodunu arabanın içine mi atacağız.

      • Azizi dedi ki:

        Merhaba osman kardeşim. Yukarıda belirttiğim kodları arabayı kontrol ettiğiniz scriptin içine yazın yani herhangi bir fonksiyonun içine değil de normal fonksiyon tanımlar gibi bu kodları da yazın. Örneğin:
        function Start()
        {
        //
        }

        function Update()
        {
        //
        }

        public function EgimiAl()
        {
        wheelFL.steerAngle=direksiyonEgim / 10;
        wheelFR.steerAngle=direksiyonEgim / 10;

        return direksiyonEgim;
        }

        gibi yazabilirsiniz. Yine de sıkıntı çıkarsa elimden geldiği kadar yardımcı olmaya çalışacağım. Kolay gelsin…

  29. osman dedi ki:

    azizi arkadaşım teşekkür ederim yardımın için.sorunum halloldu galiba.Bi sıkıntı olursa sorarım…

  30. Kadir dedi ki:

    Merhaba kardeş. Bu verdiğin örnekteki scriptleri başka bir arabaya uyguluyorum , her komut çalışıyor fakat oyun başladığında araba fırlıyor. Bunu nasıl engelleyebiliriz.

  31. Nihat Yıldız dedi ki:

    hocam elinize sağlık bi sorum olcak

    biz bunu canvasdaki butonları kullanarak yapabilirmiyiz

    yani aracımız butona tıkladıkça hareket edecek yani butonlarla kontrol vericez

    hocam lütfen yardım edin

  32. SEFA dedi ki:

    Hocam öncelikle programlamadan pek anlamadığımı belirtiyim

    edy’s vehicle physics scriptini aldım ama adama nasıl mobil kontrol ekleyeceğimi soruyorum bişeler saçmalıyor

    neyse carmain scriptinde şu şekilde bişeler var :

    var steerValue = Mathf.Clamp(Input.GetAxis(“Horizontal”), -1, 1);
    var forwardValue = Mathf.Clamp(Input.GetAxis(“Vertical”), 0, 1);
    var reverseValue = -1 * Mathf.Clamp(Input.GetAxis(“Vertical”), -1, 0);
    var handbrakeValue = Mathf.Clamp(Input.GetAxis(“Jump”), 0, 1);

    buradaki vertical kısmına direksiyon scriptini nasıl uygulayacağım

    yardımcı oludrsanız çok sevinirim

    • yasirkula dedi ki:

      carmain scripti ile Direksiyon scriptinin aynı objede olduğunu varsayalım. Bu durumda:

      var steerValue = GetComponent(Direksiyon).EgimiAl();

      • SEFA dedi ki:

        Assets/EdyVehiclePhysics/CarMain.js(292,26): BCE0020: An instance of type ‘UnityEngine.Component’ is required to access non static member ‘GetComponent’.

        şeklinde bir hata alıyorum

        unity sürümüm 4.6.2

      • yasirkula dedi ki:

        Component.GetComponent yazamazsınız. Ama mesela transform.GetComponent veya direkt GetComponent yazabilirsiniz.

  33. SEFA dedi ki:

    siz bana

    “carmain scripti ile Direksiyon scriptinin aynı objede olduğunu varsayalım. Bu durumda:

    var steerValue = GetComponent(Direksiyon).EgimiAl();”

    dediniz bunu yapınca aldım hatayı

    • yasirkula dedi ki:

      3 sebepten çıkmış olabilir:

      1- C# yazıyor olabilirsiniz, benim verdiğim kod JS için.
      2- Scriptin adı Direksiyon olmayabilir, benim verdiğim kodda Direksiyon olmak zorunda.
      3- Benim bilmediğim başka sebepler.

      Bu çok basit bir sıkıntı, bunu kendinizin görmesi gerekirdi. Bence temel Java ya da C# dersleri araştırın biraz (Unity versiyonları olmasına gerek yok), bu diller hakkında bolca Türkçe kaynak da vardır.

      • SEFA dedi ki:

        Sanirim c#dan dolayi peki c# da nasil yapicam

      • yasirkula dedi ki:

        Ya direksiyon scripstinin imi Direksiyon değil ya da Direksiyon scripti, araba scripti ile aynı objede değil. Attığınız kod JS, C# ile alakası yok. Bu sorunu kendiniz çözmelisiniz.

  34. Kandemir Polat dedi ki:

    Anlatım ve kaynaklar için teşekkürler dostum. Bi sorum olacaktı, direksiyonu kodu ile birlikte kendi projeme aldım ancak.. Direksiyonu döndürdüğüm zaman aracım dönmüyor.yani direksiyon olması gerektiği gibi dönüyor ancak aracı hareket ettirmiyor.Aracımı direksiyonla beraber nasıl hareket ettirebilirim yardımcı olabilir misiniz.

    • yasirkula dedi ki:

      Araba hareket kodlarınızda Input.GetAxis(“Horizontal”) veya Input.GetAxisRaw(“Horizontal”) yazan yerlerde direksiyon scriptinin EgimiAl() veya GetClampedValue() fonksiyonunu kullanacaksınız.

  35. Emrah dedi ki:

    Merhaba Yasir bey,
    Bir projemde sizin direksiyon kodunuzu kullanıyorum. Her şeyiyle çalışıyor sıkıntı yok. Bir çok telefonda da denedim gayet iyi ama tüm telefonlarda çok az kayıyor, bazı telefonlarda, özellikle ekran boyutu büyük telefonlarda direksiyonun merkezi oldukça kayıyor. Zaten sizin demo olarak gösterdiğiniz oyunda da direksiyon tam ortalı dönmüyor.

    Kodlarda belirtmişsiniz, eğer direksiyon tam merkezli dönmüyorsa pivotuyla oynayarak bu durumu düzeltebilirsiniz demişsiniz ama saatlerdir uğraşıyorum malesef düzeltemedim ya da ben beceremiyorum.

    Direksiyonun tam merkezli dönmesi için hangi değerleri girmemiz gerekiyor ya da eklememiz gereken bir şeyler var mı? Şimdiden teşekkür ederim. Kolay gelsin

    • yasirkula dedi ki:

      UI sistemini kullanıyorsanız pivotun konumunu elle ayarlayabilirsiniz. Pivot bir kere ortalandı mı hep ortada kalacaktır.

      OnGUI sistemini kullanıyorsanız kodu hiç düzenleyip düzenlemediğinizi bilmem lazım. Örneğin, direksiyonun boyutunun cihazdan cihaza otomatik değişmesi için bir kod yazmış olabilir misiniz? Böyle bir durumda o eklediğiniz satırı buraya yapıştırırsanız yardımcı olabilirim.

  36. Ömer dedi ki:

    Arabaya rigidbody ekliyorum x rotation ı kitlemezsem araba titriyor dönerken birden ön kaldırıyor felan ama eğer x i kitlersem sorunsuz çalışıyor ama x i kitleyince araba yokuş yukarı çıkmıyor ben bunun olmasını istemiyorum ne yapmam gerekli ?

  37. tuna dedi ki:

    Öncelikle script için teşekkürler fakat bir sorum olacaktı bu scripti ben dümen olarak kullanmak istiyorum ve dümeni çevirdiğimde(yani sizin scriptle direksiyonu çevirdiğimde) fare ile yada dokunma ile benim kendi gemi hareketimi uygulamasını istiyorum bunu nasıl düzenleyebilirim sizin script üzerinde?

  38. Mehmet dedi ki:

    Örnek Projeyi İndirdim eskiden Unity 4 te rahatlıkla açılıyordu fakat unity 5 de kodlar le lgili hata veriyor .. Nası Çözebilirim
    NOT : Sizin Projedeki hiç bir yeri ellemedim..

    • yasirkula dedi ki:

      Projeyi açıp gelen soruya “I made a backup, go ahead” deyince bir hata ile karşılaşmadım. Arabanın hareket etmemesinin sebebini bilmiyorum, fizik sistemi değişmiş herhalde. Aslında gaza basarken arabayı resetleyince araba hareket ediyor ama çok saçma hareketler yapıyor.

  39. ahmet dedi ki:

    Hocam merhabar. Kusura bakmayın bir sorum olacaktı.Hocam ben unity 5.2.2 sürümünü kullanıyorum.Hocam APK dosyası almaya çalıştığımda şu hatayı alıyorum hep
    (Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details.
    E:\Eclipsekurulum\eclipse-sdk\build-tools\24.0.0-preview\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “E:/Eclipsekurulum/eclipse-sdk\platforms\android-23\android.jar” -F bin/resources.ap_

    stderr[

    ]
    stdout[

    ])

    sıkıntı nerde acaba. Hocam yarımcı olabilirseniz çok iyi olur.Android için SDK’ları kurdum.Android için kurduğum SDK’ ların yolunu unity de verdim JDK yolunuda verdim.Sıkıntı nerden kaynaklanıyor olabilir.Şimdided Teşekkürler.

    • yasirkula dedi ki:

      Şu derste “NOT2″de paylaştığım çözüm önerilerini deneyebilirsiniz. İlaveten, Android SDK’daki herşeyi güncellemeyi ve de projeye giden path’te Türkçe karakter var ise projeyi, içinde Türkçe karakter bulunmayan bir klasöre kopyalamayı deneyin.

  40. ahmet dedi ki:

    Hocam Merhaba.Hocam Bir sorum olacaktı.Hocam ben bir karekterin materialini değiştirip başka sahnede değiştirdiğim material ile karekteri kullanmak istiyorum

    #pragma strict

    var skirtMaterialOne:Material;
    var skirtMaterialTwo:Material;
    private var skirt:int;
    private var skinMaterial:Material[];
    var btnTexture: Texture;
    function Start () {

    }

    function Update () {
    skinMaterial=GetComponent(SkinnedMeshRenderer).materials;
    if(skirt==1)skinMaterial[0]=skirtMaterialOne;
    if(skirt==2)skinMaterial[1]=skirtMaterialTwo;
    GetComponent(SkinnedMeshRenderer).materials=skinMaterial;

    if(skirt>2)skirt=2;
    }
    function OnGUI()
    {

    if (GUI.Button(new Rect(10, 10, 50, 50), btnTexture))
    skirt=1;
    if (GUI.Button(new Rect(10, 70, 50, 30), “Click”))
    skirt=2;
    if (GUI.Button(new Rect(10, 10, 50, 50), btnTexture))
    skirt=1;
    if (GUI.Button(new Rect(10, 130, 50, 30), “bas”))
    Application.LoadLevel(“sahne2”);

    }

    hocam bu şekilde karekterin üzerindeki materiali değiştiriyorum bunu nasıl kaydedip seçtiğim material ile ikinci sahneye geçebilirim.Birinci sahnede karekterin materialini değiştrip sahne ikiye geçme butonuna tıkladığımda sahne 2 de seçtiğim material ile devam etmek istiyorum.Bunu nasıl kaydedebilirim.Hocam kodu yazma imkanınız varmı.Şimdiden teşekürler.

    • yasirkula dedi ki:

      public static var secilenMateryal : Material; şeklinde static bir değişken oluşturun. Sahne 2’ye gitmesini istediğiniz materyali bu değişkene değer olarak verin. Sahne 2’ye geçtiğinizde ise ScriptinAdi.secilenMateryal vasıtasıyla bu materyale erişip onu karaktere atayın.

  41. ahmet dedi ki:

    Hocam nasıl olacağını tam olarak anlamadım.Yazma imkanınız varmı acaba.Tam olarak mantığını kuramadım.Teşekürler

    • yasirkula dedi ki:

      Attığınız scriptin adı A ise ve bu scriptte b isminde public static bir değişken varsa, bu değişkene herhangi bir yerden A.b şeklinde erişebiliyoruz. Bundan faydalanarak da “A.b = materyal;” şeklinde bu değişkene ne zaman değer vereceğiniz veyahutta “GetComponent(Renderer).material = A.b;” şeklinde ne zaman bu değişkenin değerini çekeceğiniz size kalmış.

  42. Mehmet dedi ki:

    Hocam ekranda klavye üzerindeki yön tuşları yada wasd ile hareket eden bir obje var,
    normalde Input.GetAxis ile objeyi hareket ettiriyorum, unity paneli üzerinden objenin ekranda gidebileceği max ve min değerleri tespit ettim, şöyle ki obje yatayda -5 ve 5 dikeyde -4 ve 10 arasında hareket edebiliyor. pozisyon kontrolü ile bu değerlerin dışına çıkmasını engelliyorum.

    şimdi android üzerinde dokunmatik ile hareket ettirmek istediğimde işler sarpa sarıyor. pozisyonu alıyorum gelen değer pixel üzerinden yatayda 250 gibi oluyor. bu durumda benim en başta belirlediğim max ve min değerler işe yaramıyor ve obje ekran dışına gidiyor.

    dokunmatik kısmında objeyi belirlediğim ekran sınırları içinde nasıl tutabilirim? obje ekrana dokunan parmağı takip etesin istiyorum

    • yasirkula dedi ki:

      Ekran çözünürlüğü değiştikçe yatay eksendeki sınırlar değişebiliyor (ama dikey eksendekiler sabit kalıyor). Benim tavsiyem yatay eksenin sınırlarını şu kod ile bulmanız:

      var sagSinir : float = Camera.main.ViewportToWorldPoint( new Vector3( 1f, 0.5f, 5f ) ).x;
      var solSinir : float = Camera.main.ViewportToWorldPoint( new Vector3( 0f, 0.5f, 5f ) ).x;

  43. Barış dedi ki:

    Unity web player üzerinden test ettim ama araba neden geri gitmiyor?
    Unity 5 den projeyi çalıştirdım onda da araba tamamen hareketsiz.

    • yasirkula dedi ki:

      Araba sadece ileriye, sağa ve sola gidebiliyor; çünkü bu örnek sadece direksiyonu göstermek amaçlıydı. Ciddi bir araba oyununda kaliteli bir araba fiziği plugini kullanmanızı öneririm.

      Unity 5’te oyun başlayınca araba neden hareketsiz kalıyor ben de anlamadım. Ama oyunu başlattıktan sonra arabanın Transform’unu biraz ileri ve yukarı oynatınca araba artık hareket edebiliyor.

  44. Efraim dedi ki:

    Hocam bir şey sormak istiyorum. Unity ile amatörce ilgileniyorum. Birazcık C# kodlama bilgim var. Androide araba park etme tarzı bir oyun yapmak istiyorum. Bilgisayar için araba kontrollerini yapabiliyorum(w,a,s,d ile) ama buton ekleyip o butona hangi kodları yazacağımı bilmiyorum yani arabanın ileri gitmesi için gibi. Örnek amaçlı bu projenizi açmaya çalıştım ama açamadım. UI sistemi ile bu nasıl yapılabilir elinizde hazır scriptler varsa verme şansınız varmı. Cevabınızı bekliyorum şimdiden teşekkürler..

    • yasirkula dedi ki:

      UI-Image’lar ile istediğiniz butonları oluşturup bu butonlara Event Trigger component’i ekleyebilirsiniz. Ardından PointerDown ve PointerUp event’lerini harmanlayarak, bu butona basılı tutuldukça bir fonksiyonun çağrılmasını sağlayabilirsiniz (örnek kod için bkz: https://yasirkula.com/2015/01/21/unity-ui-arayuz-sistemi/). UI-Button kullanmayın zira onun On Click event’i sadece butona tıklayınca (tek seferlik) çalışır.

  45. Efraim dedi ki:

    Elinizde hazır buton scriptleri varsa verebilir misiniz inceleyip bakmak için. Bide bu örnekteki direksiyon yapımı Unity’nin son sürümünde açılmıyor nasıl açabilirim yada yeniden konu oluşturma şansınız var mı Unity 5 için.

    • yasirkula dedi ki:

      Kodların Unity 5’te de çalışması lazım. Örnek proje ise malesef Unity 5’te çalışmıyor :/ Elimde hazır UI kodu yok ama önceki mesajımdaki UI dersim işinize yarayabilir.

      • Efraim dedi ki:

        UI konusunu incelicem ama bu örnekteki kodları denemedim proje halinde açmaya çalıştım error veriyor. Kodları alıp nasıl kullanabilirim yeniden bir örnek yapmak için detaylandırırsanız sevinirim. Cevaplarınız için teşekkürler.

      • yasirkula dedi ki:

        Eğer projeyi açarken “I made a backup, go ahead” seçeneğinin olduğu bir pencere gelirse o butona tıklayın. Onun haricinde bir hata aldığımı hatırlamıyorum ben.

  46. Efraim dedi ki:

    Hocam bir şey daha sormak istiyorum. Ben şimdi projemdeki aracımı w,a,s,d tuşları ile hareket ettirebiliyorum. Arabada kullandığım bu scripti gaz butonu yapıp onun içine atarsam çalışır mı yada ne gibi eklemeler yapmalıyım bu konuda bilgilendirebilir yada örnek verebilir misiniz..

    • yasirkula dedi ki:

      Gaz butonunun içine (gaz butonuna basılı tutulunca çalışan fonksiyonun içine) sadece W tuşuna basınca çalışan kodları geçirmeniz lazım. Butona basılı tutunca kod çalıştırmayı UI dersimde görmüşsünüzdür zaten.

      • Efraim dedi ki:

        Anladığım kadarıyla araba Script’i yine arabanın içinde olacak ama hareket etmesi gereken kodlarını(yani W ile ileri gitme ise), butonun fonksiyon kod kısmına atmamız lazım. Aynı şekilde yönlendirme kodlarını da A ve D tuşlarını birer butonlara eklersek çalışır dimi. Yanlışım varsa düzeltin. Tekrardan teşekkürler..

      • yasirkula dedi ki:

        Evet W tuşuna basılı tutunca Event Trigger vasıtasıyla arabadaki “Gazla” fonksiyonunu çağıracaksınız ve “Gazla” fonksiyonunun içine ise W tuşuna basınca çalışan kodları atacaksınız. Aynı şeyi A tuşu (“SolaGit”) ve D tuşu (“SagaGit”) için de yapacaksınız.

  47. Murat dedi ki:

    Hocam yazdığım bir araba kontrol Script’i var. Kodlarda sıkıntı yok gibi duruyor hatada vermiyor ama bu Script’i arabaya attığımda arabayı kontrol edemiyorum. Tekerler kendince hareket ediyor. Ön tekerler sağa sola gidiyor, arka tekerlerde daire çiziyor yani kısacası araba hareketsiz tekerler hareketli. Bu sorunu nasıl çözebilirim yardım ederseniz sevinirim. Şimdiden teşekkürler.

    Kodların Resmi: http://i.hizliresim.com/v5063v.png
    Projenin Resmi: http://i.hizliresim.com/LAJlkV.png

  48. Murat dedi ki:

    Hocam “LANCEREVOX” dışındaki bütün childlerdeki Rigidbodyleri kaldırdım. Ama sorun hala aynı düzelmedi malesef.

    • Murat dedi ki:

      Bir çözüm yolu yok mu ya. Bir türlü çözemedim. Yardım edin lütfen. Veya elinizde hazır araba Script’i varsa paylaşır mısınız. Teşekkürler.

      • yasirkula dedi ki:

        Bende araba scripti yok malesef. Belki bu yorumu görüp konu hakkında bilgi sahibi olan biri size yardımcı olabilir.

  49. Murat dedi ki:

    Umarım biri görür ve yardım eder. Umutla bekliyorum..

  50. Gökhan dedi ki:

    Güzel çalışma teşekkürler öncelikle yardım almak istediğim bir konu var yaptığım bir oyunda playerı Input.GetAxis’i kullanarak pc de normal hareket ettirebiliyorum ama Androidde(sadece sağ ve sol gidecek şekilde) iki button yaptım ancak onlardan herhangi birine tıkladığımda player istediğim yöne velocity alıyor elimi buttondan çekince durmasını sağlayamıyorum. Bu pcde normal çalışan kod:

    void FixedUpdate()
    {
    float moveHorizontal = Input.GetAxis(“Horizontal”);
    Vector3 movement = new Vector3(moveHorizontal, 0.0f, 0.0f);
    rb.velocity = movement * (speed + speedA);
    }

    buda unity panelinden Ui event sisteminde OnClick fonksiyonu ile çağırdığım kod

    public void Touched(string ontouch)
    {

    Vector3 movement = new Vector3(0.0f, -move, 0.0f);

    rb.velocity = movement * speed;
    }

  51. Gökhan dedi ki:

    hocam sizin ui eiğitim konunuzda sorumun cevabını buldum event trigger dan pointer up da
    Vector3 zero = new Vector3(0.0f,0.0f,0.0f);
    rb.velocity = zero; yapınca porblem çözüldü sağolun yeniden

  52. Dilay dedi ki:

    Ya telefonda oyun oynarken araba oyunu düz gidiyor sağa veya sola dönmüyor sorunumu çözebilecek biris varmı 😦

  53. Kaan Naçar dedi ki:

    Multitouch destekliyor mu?

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