Unity Topu Double Jump Zıplatma Kodu

Katılım
8 Şubat 2023
Mesajlar
167
Çözümler
1
Daha fazla  
Sistem Özellikleri
r7 9800x3d
rtx 5070 ti 16gb
2x32gb ram
asus tuf gaming b850-plus wifi
Cinsiyet
Erkek
Unity'de yaptığım oyuna bir top ekledim ve bu kodu ekledim:

Kod:
using UnityEngine;

public class OyuncuHareketi : MonoBehaviour

{

 public float hareketHizi = 5.0f;

 public float ziplamaGucu = 8.0f;

 public float yuvarlanmaGucu = 2.0f;

 public int maksimumZiplamaSayisi = 2;

 public Transform zeminKontrolNoktasi;

 public LayerMask zeminLayer;

 private Rigidbody2D rb;

 private bool zemindeMi;

 private int ziplamaSayisi;

 private float zeminCapi = 0.3f;

 private void Awake()

 {

 rb = GetComponent<Rigidbody2D>();

 }

 private void Update()

 {

 // Zıplama

 if (zemindeMi && Input.GetKeyDown(KeyCode.W))

 {

 rb.velocity = new Vector2(rb.velocity.x, ziplamaGucu);

 ziplamaSayisi = 1;

 }

 else if (ziplamaSayisi < maksimumZiplamaSayisi && Input.GetKeyDown(KeyCode.W))

 {

 rb.velocity = new Vector2(rb.velocity.x, ziplamaGucu);

 ziplamaSayisi++;

 }

 // Sol ve sağ hareket

 float yatayHareket = Input.GetAxis("Horizontal");

 rb.velocity = new Vector2(yatayHareket * hareketHizi, rb.velocity.y);

 // dönme

 if (yatayHareket < 0)

 {

 transform.localScale = new Vector3(-1, 1, 1);

 }

 else if (yatayHareket > 0)

 {

 transform.localScale = new Vector3(1, 1, 1);

 }

 if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D))

 {

 rb.drag = 0; // Sürtünmeyi sıfırla, böylece yuvarlanma etkisi oluşur

 }

 if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D))

 {

 rb.drag = 3; // Sürtünmeyi geri yükle

 }

 }

 private void FixedUpdate()

 {

 // Zemin

 zemindeMi = Physics2D.OverlapCircle(zeminKontrolNoktasi.position, zeminCapi, zeminLayer);

 // Zeminde değilken zıplama sayısını sıfırla

 if (!zemindeMi)

 {

 ziplamaSayisi = 0;

 }

 }

}

Top hareket edebiliyor ve zıplayabiliyor ama sonsuz zıplayabiliyor. Ben sadece 2 defa zıplamasını ve yere tekrar değene kadar daha zıplayamamasını istiyorum yani double-jump gibi.
 
Unity'de yaptığım oyuna bir top ekledim ve bu kodu ekledim:

Kod:
using UnityEngine;

public class OyuncuHareketi : MonoBehaviour.

{

 public float hareketHizi = 5.0f;

 public float ziplamaGucu = 8.0f;

 public float yuvarlanmaGucu = 2.0f;

 public int maksimumZiplamaSayisi = 2;

 public Transform zeminKontrolNoktasi;

 public LayerMask zeminLayer;

 private Rigidbody2D rb;

 private bool zemindeMi;

 private int ziplamaSayisi;

 private float zeminCapi = 0.3f;

 private void Awake()

 {

 rb = GetComponent<Rigidbody2D>();

 }

 private void Update()

 {

 // Zıplama.

 if (zemindeMi && Input.GetKeyDown(KeyCode.W))

 {

 rb.velocity = new Vector2(rb.velocity.x, ziplamaGucu);

 ziplamaSayisi = 1;

 }

 else if (ziplamaSayisi < maksimumZiplamaSayisi && Input.GetKeyDown(KeyCode.W))

 {

 rb.velocity = new Vector2(rb.velocity.x, ziplamaGucu);

 ziplamaSayisi++;

 }

 // Sol ve sağ hareket.

 float yatayHareket = Input.GetAxis("Horizontal");

 rb.velocity = new Vector2(yatayHareket * hareketHizi, rb.velocity.y);

 // dönme.

 if (yatayHareket < 0)

 {

 transform.localScale = new Vector3(-1, 1, 1);

 }

 else if (yatayHareket > 0)

 {

 transform.localScale = new Vector3(1, 1, 1);

 }

 if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D))

 {

 rb.drag = 0; // Sürtünmeyi sıfırla, böylece yuvarlanma etkisi oluşur.

 }

 if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D))

 {

 rb.drag = 3; // Sürtünmeyi geri yükle.

 }

 }

 private void FixedUpdate()

 {

 // Zemin.

 zemindeMi = Physics2D.OverlapCircle(zeminKontrolNoktasi.position, zeminCapi, zeminLayer);

 // Zeminde değilken zıplama sayısını sıfırla.

 if (!zemindeMi)

 {

 ziplamaSayisi = 0;

 }

 }

}

Top hareket edebiliyor ve zıplayabiliyor ama sonsuz zıplayabiliyor. Ben sadece 2 defa zıplamasını ve yere tekrar değene kadar daha zıplayamamasını istiyorum yani double-jump gibi.

Havadayken her seferinde zıplayabilme sayısını sıfır yaptığın için oluyor. Sen her space tuşuna bastığında 0 kere zıplamış olarak oluyor.
 
Havadayken her seferinde zıplayabilme sayısını sıfır yaptığın için oluyor. Sen her space tuşuna bastığında 0 kere zıplamış olarak oluyor.
nasıl düzeltebilirim onu görmüştüm bazı şeyler denedim ama düzeltememiştim.
 
nasıl düzeltebilirim onu görmüştüm bazı şeyler denedim ama düzeltememiştim.
C#:
using UnityEngine;

public class OyuncuHareketi : MonoBehaviour

{

 public float hareketHizi = 5.0f;

 public float ziplamaGucu = 8.0f;

 public float yuvarlanmaGucu = 2.0f;

 public Transform zeminKontrolNoktasi;

 public LayerMask zeminLayer;

 private Rigidbody2D rb;

 private bool zemindeMi;

 private float zeminCapi = 0.3f;
 
 bool doubleJump;

 private void Awake()

 {

 rb = GetComponent<Rigidbody2D>();

 }

 private void Update()

 {
        //Zıplamıyorsa double jump yapabilmeyi engeller
        if (IsGrounded() && !Input.GetButton("Jump"))
        {
            doubleJump = false;
        }

        if (Input.GetButtonDown("Jump"))
        {
            //yerdeyse veya double jumptaysa zıplama işlemi gerçekleşir.
            if (IsGrounded() || doubleJump)
            {
                rb.velocity = new Vector2(rb.velocity.x, jumpingPower);
                //eğer ilk defa zıpladıysa double jump aktif olur. eğer zaten 1 kere zıpladıysa, tekrar zıplarsa double jump false olur. 
                doubleJump = !doubleJump;
            }
        }

        if (Input.GetButtonUp("Jump") && rb.velocity.y > 0f)
        {
            rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
        }
 




 // Sol ve sağ hareket

 float yatayHareket = Input.GetAxis("Horizontal");

 rb.velocity = new Vector2(yatayHareket * hareketHizi, rb.velocity.y);

 // dönme

 if (yatayHareket < 0)

 {

 transform.localScale = new Vector3(-1, 1, 1);

 }

 else if (yatayHareket > 0)

 {

 transform.localScale = new Vector3(1, 1, 1);

 }

 if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D))

 {

 rb.drag = 0; // Sürtünmeyi sıfırla, böylece yuvarlanma etkisi oluşur

 }

 if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D))

 {

 rb.drag = 3; // Sürtünmeyi geri yükle

 }

 }
    //Zeminde olup olmadığını kontrol edip ona göre değer gönderir
    private bool zemindeMi()
    {
        return Physics2D.OverlapCircle(zeminKontrolNoktasi.position, 0.2f, zeminCapi);
    }



}


Kodu bu şekilde yapıp dener misiniz?
 
@Syntax Error

Assets\hareketetmektop.cs(104,18): error CS0102: The type 'OyuncuHareketi' already contains a definition for 'zemindeMi'

@Syntax Error benim hatam biliyorum ama sizin verdiğiniz kodu yazınca hata verdi önceki kodda gitti ortada kaldım yardım edebilir misin
 
Son düzenleme:
Şu an hareket kodunda ne yazıyorsa onu atabilir misiniz?
using UnityEngine;

public class OyuncuHareketi : MonoBehaviour

{

public float hareketHizi = 5.0f;

public float ziplamaGucu = 8.0f;

public float yuvarlanmaGucu = 2.0f;

public Transform zeminKontrolNoktasi;

public LayerMask zeminLayer;

private Rigidbody2D rb;

private bool zemindeMi;

private float zeminCapi = 0.3f;

bool doubleJump;

private void Awake()

{

rb = GetComponent<Rigidbody2D>();

}

private void Update()

{
//Zıplamıyorsa double jump yapabilmeyi engeller
if (IsGrounded() && !Input.GetButton("Jump"))
{
doubleJump = false;
}

if (Input.GetButtonDown("Jump"))
{
//yerdeyse veya double jumptaysa zıplama işlemi gerçekleşir.
if (IsGrounded() || doubleJump)
{
rb.velocity = new Vector2(rb.velocity.x, jumpingPower);
//eğer ilk defa zıpladıysa double jump aktif olur. eğer zaten 1 kere zıpladıysa, tekrar zıplarsa double jump false olur.
doubleJump = !doubleJump;
}
}

if (Input.GetButtonUp("Jump") && rb.velocity.y > 0f)
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
}





// Sol ve sağ hareket

float yatayHareket = Input.GetAxis("Horizontal");

rb.velocity = new Vector2(yatayHareket * hareketHizi, rb.velocity.y);

// dönme

if (yatayHareket < 0)

{

transform.localScale = new Vector3(-1, 1, 1);

}

else if (yatayHareket > 0)

{

transform.localScale = new Vector3(1, 1, 1);

}

if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D))

{

rb.drag = 0; // Sürtünmeyi sıfırla, böylece yuvarlanma etkisi oluşur

}

if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D))

{

rb.drag = 3; // Sürtünmeyi geri yükle

}

}
//Zeminde olup olmadığını kontrol edip ona göre değer gönderir
private bool zemindeMi()
{
return Physics2D.OverlapCircle(zeminKontrolNoktasi.position, 0.2f, zeminCapi);
}



}
 
Using unityengine;

Public class oyuncuhareketi: Monobehaviour.

{

Public float harekethizi = 5.0F;

Public float ziplamagucu = 8.0F;

Public float yuvarlanmagucu = 2.0F;

Public transform zeminkontrolnoktasi;

Public layermask zeminlayer;

Private rigidbody2D rb;

Private bool zemindemi;

Private float zemincapi = 0.3F;

Bool doublejump;

Private Void Awake()

{

Rb = GetComponent<Rigidbody2D>();

}

Private Void Update()

{
//Zıplamıyorsa double jump yapabilmeyi engeller.
İf (IsGrounded() && !Input.GetButton("Jump"))
{
Doublejump = false;
}

İf (ınput. Getbuttondown("jump"))
{
//Yerdeyse veya double jumptaysa zıplama işlemi gerçekleşir.
İf (IsGrounded() || doubleJump)
{
Rb. Velocity = New Vector2(rb. Velocity. X, jumpingpower);
//Eğer ilk defa zıpladıysa double jump aktif olur. Eğer zaten 1 kere zıpladıysa, tekrar zıplarsa double jump false olur.
Doublejump =!doublejump;
}
}

İf (ınput. Getbuttonup("jump") && rb. Velocity. Y > 0F)
{
Rb. Velocity = New Vector2(rb. Velocity. X, rb. Velocity. Y * 0.5F);
}

// Sol ve sağ hareket.

Float yatayhareket = ınput. Getaxis("horizontal");

Rb. Velocity = New Vector2(yatayhareket * harekethizi, rb. Velocity. Y);

// Dönme.

İf (yatayhareket < 0)

{

Transform. Localscale = New Vector3(-1, 1, 1);

}

Else if (yatayhareket > 0)

{

Transform. Localscale = New Vector3(1, 1, 1);

}

İf (ınput. Getkeydown(keycode. A) || ınput. Getkeydown(keycode. D))

{

Rb. Drag = 0; // sürtünmeyi sıfırla, böylece yuvarlanma etkisi oluşur.

}

İf (ınput. Getkeyup(keycode. A) || ınput. Getkeyup(keycode. D))

{

Rb. Drag = 3; // sürtünmeyi geri yükle.

}

}
//Zeminde olup olmadığını kontrol edip ona göre değer gönderir.
Private bool zemindeMi()
{
Return physics2D. Overlapcircle(zeminkontrolnoktasi. Position, 0.2F, zemincapi);
}

}

C#:
using UnityEngine;

public class OyuncuHareketi : MonoBehaviour.

{

 public float hareketHizi = 5.0f;

 public float ziplamaGucu = 8.0f;

 public float yuvarlanmaGucu = 2.0f;

 public Transform zeminKontrolNoktasi;

 public LayerMask zeminLayer;

 private Rigidbody2D rb;

 private float zeminCapi = 0.3f;

 bool doubleJump;

 private void Awake()

 {

 rb = GetComponent<Rigidbody2D>();

 }

 private void Update()

 {

 //Zıplamıyorsa double jump yapabilmeyi engeller.

 if (IsGrounded() && !Input.GetButton("Jump"))

 {

 doubleJump = false;

 }

 if (Input.GetButtonDown("Jump"))

 {

 //yerdeyse veya double jumptaysa zıplama işlemi gerçekleşir.

 if (IsGrounded() || doubleJump)

 {

 rb.velocity = new Vector2(rb.velocity.x, jumpingPower);

 //eğer ilk defa zıpladıysa double jump aktif olur. eğer zaten 1 kere zıpladıysa, tekrar zıplarsa double jump false olur.

 doubleJump = !doubleJump;

 }

 }

 if (Input.GetButtonUp("Jump") && rb.velocity.y > 0f)

 {

 rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);

 }

 // Sol ve sağ hareket.

 float yatayHareket = Input.GetAxis("Horizontal");

 rb.velocity = new Vector2(yatayHareket * hareketHizi, rb.velocity.y);

 // dönme.

 if (yatayHareket < 0)

 {

 transform.localScale = new Vector3(-1, 1, 1);

 }

 else if (yatayHareket > 0)

 {

 transform.localScale = new Vector3(1, 1, 1);

 }

 if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D))

 {

 rb.drag = 0; // Sürtünmeyi sıfırla, böylece yuvarlanma etkisi oluşur.

 }

 if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D))

 {

 rb.drag = 3; // Sürtünmeyi geri yükle.

 }

 }

 //Zeminde olup olmadığını kontrol edip ona göre değer gönderir.

 private bool zemindeMi()

 {

 return Physics2D.OverlapCircle(zeminKontrolNoktasi.position, 0.2f, zeminCapi);

 }

}

Kusura bakmayın dalgınlığıma gelmiş. Bu şekilde kodu yaparsanız olacaktır.
 

Technopat Haberler

Yeni konular

Geri
Yukarı