Yardım Unity'de karakter bir kere zıplayıp yere değince bir daha zıplamıyor

Bu konuyu okuyanlar

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class hareketbenim : MonoBehaviour
{

    public float hız = 8f;
    public float zıplama = 16f;
    private float horizontal;
    private bool panelclicked = false;
    private bool zıplamaYapabilir = true;



    public Rigidbody2D rb;


    // Start is called before the first frame update
     void Start()
     {
       

       

     }

    // Update is called once per frame
    void Update()
    {


       if (panelclicked == true)
       {

            horizontal = -Input.GetAxis("Horizontal");

           rb.velocity = new Vector2(hız * horizontal, rb.velocity.y);

         if (Input.GetKeyDown(KeyCode.W) && zıplamaYapabilir == true)
         {

            rb.AddForce(new Vector2(rb.velocity.x, zıplama));
                zıplamaYapabilir = false;
               

           
         }

       }

    }



    private void OnCollisionStay2D(Collision2D other)
    {

       
            if (other.gameObject.CompareTag("yer"))
            {

            zıplamaYapabilir = true;


            }


            if (other.gameObject.CompareTag("flag"))
            {

            Destroy(other.gameObject);
           
            }

       


    }



    private void OnCollisionExit2D(Collision2D other)
    {

       
            if (other.gameObject.CompareTag("yer"))
            {

            zıplamaYapabilir = false;


            }

     

       






    }






    public void ControllerOpener()
    {


        panelclicked = true;




    }

 








}


Bu kodu karakterime yolladım ama karakter yukarıda belirttiğim gibi bir kere zıplayıp yere değince bir daha zıplamıyor nasıl çözeceğim?
 

Emnn

Jet Sesi, Özgürlüğün Sesidir!
Emektar
Katılım
3 Mayıs 2021
Mesajlar
2,207
Çözümler
8
Reaksiyon puanı
1,848
Puanları
113
OnCollisionStay kullanmanızda ki amaç nedir?
Onun yerine OnCollisionEnter dener misiniz?
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
OnCollisionStayi sonradan kullandım zaten başka bir foruma yazdım onu önerdiler.
Mesaj otomatik birleştirildi:

Şimdi isteğiniz üzerine denedim, çalışmadı.
 

Emnn

Jet Sesi, Özgürlüğün Sesidir!
Emektar
Katılım
3 Mayıs 2021
Mesajlar
2,207
Çözümler
8
Reaksiyon puanı
1,848
Puanları
113
Kodunuzda orada sıkıntı var ki değişkeniniz true olmuyor.
"OnCollisionEnter2D" ile çalışması lazım. Oyununuzda ki herşeyi kontrol edin Debug log yaparak temasları kontrol edin.
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class hareketbenim : MonoBehaviour
{

    public float hız = 0f;
    public float zıplama = 0f;
    private float horizontal;
    private bool panelclicked = false;
    private bool zıplamaYapabilir = true;



    public Rigidbody2D rb;


    // Start is called before the first frame update
     void Start()
     {
        
        if(panelclicked == false)
        {

            hız = 0f;
            zıplama = 0f;

            Debug.Log("Kontroller sıfırda");


        }


     }

    // Update is called once per frame
    void Update()
    {


      
       if(panelclicked == true)
       {
            horizontal = -Input.GetAxis("Horizontal");

           rb.velocity = new Vector2(hız * horizontal, rb.velocity.y);

         if (Input.GetKeyDown(KeyCode.W) && zıplamaYapabilir == true)
         {

            rb.AddForce(new Vector2(rb.velocity.x, zıplama));
                zıplamaYapabilir = false;
                

            
         }

       }

    }



    private void OnCollisionEnter2D(Collision2D other)
    {

        
            if (other.gameObject.CompareTag("yer"))
            {

            zıplamaYapabilir = true;

            Debug.Log("Yere degiyor.");

            }


            if (other.gameObject.CompareTag("flag"))
            {

            Destroy(other.gameObject);
            
            }

        


    }



    private void OnCollisionExit2D(Collision2D other)
    {

        
            if (other.gameObject.CompareTag("yer"))
            {

            zıplamaYapabilir = false;


            }



        Debug.Log("Yere degmiyor");






    }






    public void ControllerOpener()
    {


        panelclicked = true;

        hız = 8f;
        zıplama = 300f;

        Debug.Log("Kontroller geldi.");


    }

  








}


hocam yere değince değmedi, değmeyince değdi yazıyor.

Bir de eğer -InputGetAxis("Horizontal") kısmını eksisiz yaptım yine aynı şey oluyor(Oyunda karakter ters hareket ediyor)
 

Emnn

Jet Sesi, Özgürlüğün Sesidir!
Emektar
Katılım
3 Mayıs 2021
Mesajlar
2,207
Çözümler
8
Reaksiyon puanı
1,848
Puanları
113
Kod denemesi:
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class hareketbenim : MonoBehaviour
{
    public float hız = 0f;
    public float zıplama = 0f;
    private float horizontal;
    private bool panelclicked = false;
    private bool zıplamaYapabilir = true;
    public Rigidbody2D rb;

    void Start()
    {
        if (panelclicked == false)
        {
            hız = 0f;
            zıplama = 0f;
            Debug.Log("Kontroller sıfırda");
        }
    }

    void Update()
    {
       if (panelclicked == true)
       {
            horizontal = -Input.GetAxis("Horizontal");
            rb.velocity = new Vector2(hız * horizontal, rb.velocity.y);

            if (Input.GetKeyDown(KeyCode.W) && zıplamaYapabilir == true)
            {
                rb.AddForce(new Vector2(rb.velocity.x, zıplama));
                zıplamaYapabilir = false;
            }
       }
    }

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("yer"))
        {
            zıplamaYapabilir = true;
            Debug.Log("Yere değiyor.");
        }

    }

    private void OnCollisionExit2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("yer"))
        {
            zıplamaYapabilir = false;
            Debug.Log("Yere değmiyor");
        }
    }

    public void ControllerOpener()
    {
        panelclicked = true;
        hız = 8f;
        zıplama = 300f;
        Debug.Log("Kontroller geldi.");
    }
}

Debug loglarda çıktıları tam olarak söyler misiniz?
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Karakter oyuna yerden yüksekte başlıyor

sırasıyla Kontroller sıfırda

Yere değiyor(yerde değiken)
Yere değmiyor(yerde)
Kontroller geldi(panele bastım)

Zıpladım

Yere değmiyor(yerde değilken)
Yere değiyor(yerdeyken)

panele basmadan önce tersi oluyor, bastıktan sonra zıplayınca düzeliyor fakat bir kere zıplayınca bir kere daha zıplamıyor.
 

neptün yüksel

Asistan
Cezalı
Katılım
5 Haziran 2023
Mesajlar
257
Reaksiyon puanı
100
Puanları
43
Yaş
23
Kısa devre oluyor ve kodun patlıyor kanki.

Bir sürü bool değişken kullanmışın. Tahminimce şurada patlıyor;
C#:
 if (Input.GetKeyDown(KeyCode.W) && zıplamaYapabilir == true)
         {

            rb.AddForce(new Vector2(rb.velocity.x, zıplama));
                zıplamaYapabilir = false;
                

            
         }
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Oradaki boolu sildim çoklu zıplama yapıyor.
 

neptün yüksel

Asistan
Cezalı
Katılım
5 Haziran 2023
Mesajlar
257
Reaksiyon puanı
100
Puanları
43
Yaş
23
Oradaki boolu sildim çoklu zıplama yapıyor.
Update metodu içinde yapar.

Time sınıfının deltaTime nesnesini kullanman gerekir belirli yerlerde. Çünkü Update metodu kodunu defalarca çalıştırtırır ama nesnelerin float değerlerini Time.deltaTime ile işleme tabi tutarsan 1 kere çalıştırır.

bool kullanmakta bir yöntem ama genelde karmaşıklığa yol açıyor.

Olmadı Input Manager ile dene istersen.
 
Son düzenleme:

Emnn

Jet Sesi, Özgürlüğün Sesidir!
Emektar
Katılım
3 Mayıs 2021
Mesajlar
2,207
Çözümler
8
Reaksiyon puanı
1,848
Puanları
113
Karakterin oyuna havadan düşerek başlaması olmaması gereken bir durum. Bunu değiştiriniz. Bu kodu dener misiniz?

C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class hareketbenim : MonoBehaviour
{
    public float hız = 0f;
    public float zıplama = 0f;
    private float horizontal;
    private bool panelclicked = false;
    private bool zıplamaYapabilir = true;
    public Rigidbody2D rb;

    void Update()
    {
       if (panelclicked)
       {
            horizontal = Input.GetAxis("Horizontal");
            rb.velocity = new Vector2(hız * horizontal, rb.velocity.y);
            
            if (Input.GetKeyDown(KeyCode.W) && zıplamaYapabilir)
            {
                rb.velocity = new Vector2(rb.velocity.x, zıplama);
                zıplamaYapabilir = false;
            }
       }
    }

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("yer"))
        {
            zıplamaYapabilir = true;
            Debug.Log("Yere değiyor.");
        }
        else
        {
            zıplamaYapabilir = false;
            Debug.Log("Yere değmiyor");
        }
    }


    public void ControllerOpener()
    {
        panelclicked = true;
        hız = 8f;
        zıplama = 300f;
        Debug.Log("Kontroller geldi.");
    }
}
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Bu kod da çalışmıyor. Bir de her şey bir tanıtım paneli koyduktan sonra başladı, öncesinde sıkıntı yoktu.
 

Emnn

Jet Sesi, Özgürlüğün Sesidir!
Emektar
Katılım
3 Mayıs 2021
Mesajlar
2,207
Çözümler
8
Reaksiyon puanı
1,848
Puanları
113
Tanıtım paneli dediğiniz şeyi başka bir Sahnede yapıp sahne geçişleri kullanabilirsiniz.
 
Üst