Soru Unity karakter kontrollerini devre dışı bırakma

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 zıplıyonmu;
  


    public Rigidbody2D rb;


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


        

    }

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


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

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

        if (Input.GetKeyDown(KeyCode.W) && zıplıyonmu == false)
        {

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

            





        }


    }



    private void OnCollisionEnter2D(Collision2D other)
    {

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

            zıplıyonmu = false;


        }


        if (other.gameObject.CompareTag("flag"))
        {
            Destroy(other.gameObject);
        }




    }



    private void OnCollisionExit2D(Collision2D other)
    {

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

            zıplıyonmu = true;


        }

      








    }



  








}

Kodum böyle. Yapmak istediğim şey şu: Bu karakter oyun başlamadan önce oyunun tanıtımı gibi bir panel açıkken veya oyun bitmişken panel kapanana kadar hareket etmesin istiyorum. Bunu nasıl yapabilirim?
 

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
Bir bool değişkeni ile tüm olayları bir "if" yapısına alabilirsiniz. Oyun tanıtımı panelinde "Ui" elemanlarına dokunulduğu anda değişken "true" yaparsınız ve if bloğu çalışır.
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
İlk olarak panele basıldı mı diye boolean oluşturdum. sonra bütün eylemleri if(panelclicked == true) yaptım. Sonra ne yapacağım?
 

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
Basılmasını istediğiniz nesne/ui elemantine basıldığında tanımladığınız bool değişkenini true yapabilirsiniz.
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Basılmasını istediğiniz nesne/ui elemantine basıldığında tanımladığınız bool değişkenini true yapabilirsiniz.
peki onu butonun inspector kısmında çıkan onclick komutu ile mi yapacağız? Bir empty oluşturdum, içine kodu attım onclick kısmına atınca yazdığım boolu nasıl göstereceğim?

yoksa boolu public mi yapacağım, şu an private çünkü.
 

neptün yüksel

Asistan
Cezalı
Katılım
5 Haziran 2023
Mesajlar
257
Reaksiyon puanı
100
Puanları
43
Yaş
23
IEnumertor ve bool kullan.

bir script oluştur;
C#:
bool play = false;
float sure = 3f; //istersen başına public yada Serializedfield koyarak editörden de verebilirsin süreyi

void Start()
{
    StartCoroutine(oyunuBaslat(sure));
}


void Update()
{
    if(play)
    {
        karakterKontorlleri();
    }
}

private IEnumerator oyunuBaslat(float sure)
{
    yield return new WaitForSeconds(sure);
    play = true;
  
}

IEnumerator metotları ile bir olayı geciktirebilirsin böyle. Benim yaptığım olay, 3 sn. sonra play değişkenini true yap demekti.
 

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
Öncelike biraz başa dönmek gibi olacak ancak tam olarak ne istediğinizi açık bir şekilde anlatır mısınız?
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Şöyle:


Oyunun başında tanıtım paneli çıkacak altında buton olacak ben butona basana kadar kontroller açık olmayacak. Butona bastığımda ise kontroller açık olacak.



C#:
public class hareketbenim : MonoBehaviour
{

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


    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ıplıyonmu == false)
         {

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

            
         }

       }

    }



    private void OnCollisionEnter2D(Collision2D other)
    {

        if (panelclicked == true)
        {
            if (other.gameObject.CompareTag("yer"))
            {

            zıplıyonmu = false;


            }


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

            Destroy(other.gameObject);
            
            }

        }


    }



    private void OnCollisionExit2D(Collision2D other)
    {

        if (panelclicked == true)
        {
            if (other.gameObject.CompareTag("yer"))
            {

            zıplıyonmu = true;


            }

      

        }






    }



  








}

bütün olaylara böyle if ekledim fakat bu boolu falsedan true yapmak için ne yapacağım?
Mesaj otomatik birleştirildi:

Güncelleme: panelcontroller adında bir void oluşturdum:

C#:
public class hareketbenim : MonoBehaviour
{

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


    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ıplıyonmu == false)
         {

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

            
         }

       }

    }



    private void OnCollisionEnter2D(Collision2D other)
    {

        if (panelclicked == true)
        {
            if (other.gameObject.CompareTag("yer"))
            {

            zıplıyonmu = false;


            }


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

            Destroy(other.gameObject);
            
            }

        }


    }



    private void OnCollisionExit2D(Collision2D other)
    {

        if (panelclicked == true)
        {
            if (other.gameObject.CompareTag("yer"))
            {

            zıplıyonmu = true;


            }

      

        }






    }

    public void ControllerOpener()
    {


        panelclicked = true;




    }

  








}

Böylece onclick kısmına o voidi ekledim, böylece butona basınca kontroller true oluyor ve karakter hareket edebiliyor.

Fakat şöyle bir sorunum var ki karakterim zıplamıyor, zıplamasını nasıl sağlayabilirim?
 
Son düzenleme:

neptün yüksel

Asistan
Cezalı
Katılım
5 Haziran 2023
Mesajlar
257
Reaksiyon puanı
100
Puanları
43
Yaş
23
Şöyle:


Oyunun başında tanıtım paneli çıkacak altında buton olacak ben butona basana kadar kontroller açık olmayacak. Butona bastığımda ise kontroller açık olacak.
Tamam işte IEnumerator metotlarını kullan. Sana attığım yöntem.
İstern onClick ile Start yap ister onClick yaptığında sahne yükle oradan start metodu çalışsın. Yol sana kalmış.
 

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
Öncelikle Button oluşturup, butonun onClick methodu için kodda bir method yazmalısınız. Sonrasında yazdığınız onClick methodunda bool tanımlanmış değişkeni "true" yapmalısınız.
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Güncelleme: panelcontroller adında bir void oluşturdum:

C#:
public class hareketbenim : MonoBehaviour
{

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


    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ıplıyonmu == false)
         {

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

           
         }

       }

    }



    private void OnCollisionEnter2D(Collision2D other)
    {

        if (panelclicked == true)
        {
            if (other.gameObject.CompareTag("yer"))
            {

            zıplıyonmu = false;


            }


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

            Destroy(other.gameObject);
           
            }

        }


    }



    private void OnCollisionExit2D(Collision2D other)
    {

        if (panelclicked == true)
        {
            if (other.gameObject.CompareTag("yer"))
            {

            zıplıyonmu = true;


            }

     

        }






    }

    public void ControllerOpener()
    {


        panelclicked = true;




    }

 








}

Böylece onclick kısmına o voidi ekledim, böylece butona basınca kontroller true oluyor ve karakter hareket edebiliyor.

Fakat şöyle bir sorunum var ki karakterim zıplamıyor, zıplamasını nasıl sağlayabilirim?
Üstte o dediğinizi yapmıştım zaten fakat dediğim gibi basınca hareket ediyor fakat bu sefer de zıplamıyor.
 

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
Sadece update methodunda tanımladığınız bool değişkeni kontrol etseniz yeter.
 

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
Sadece bir bool değişkenini "if" ile kontrol etmeye başladığınız da zıplama olayı gerçekleşmemeye mi başladı?
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Zıplama olayı önceden çalışıyordu, üstte yazdığım kodu onclicke atıp metodu koyduktan sonra gerçekleşmemeye başladı. Buna sizin sonda dediğiniz sadece update metodundakileri alma önerisi de dahil.
 

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
Öncelikle kod yapısında gözden birşey kaçırmadıysam bir hata yok. Öncelikle hatayı yakalamak için private olan "zıplama" değişkenini public yaparım. Ardından oyun oynanırken inspector panelinde değişkenin aldığı/almadığı değerleri kotrol ederim.
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Öncelikle kod yapısında gözden birşey kaçırmadıysam bir hata yok. Öncelikle hatayı yakalamak için private olan "zıplama" değişkenini public yaparım. Ardından oyun oynanırken inspector panelinde değişkenin aldığı/almadığı değerleri kotrol ederim.
Hocam sıkıntıyı çözdüm sorun zıplama seviyesindeymiş 16 olunca hiç zıplamıyor. 300 yaptım zıplıyor, teşekkür ederim.
Mesaj otomatik birleştirildi:

Hocam sıkıntıyı çözdüm sorun zıplama seviyesindeymiş 16 olunca hiç zıplamıyor. 300 yaptım zıplıyor, teşekkür ederim.
Güncelleme: Şimdi de karakter çoklu zıplama yapıyor onu nasıl çözeceğim?
 
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
Hocam öncelikle kodunuzda sıkıntı olduğunu düşünüyorum.
Aşağıda vericeğim kodu dener misiniz?

Kod:

C#:
using UnityEngine;

public class CharacterController2D : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float jumpForce = 10f; 
    private Rigidbody2D rb;
    private bool panelClicked = false; 

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        if (panelClicked)
        {
            float horizontalInput = Input.GetAxis("Horizontal");

            Vector2 movement = new Vector2(horizontalInput * moveSpeed, rb.velocity.y);
            rb.velocity = movement;

            if (horizontalInput < 0)
            {
                transform.localScale = new Vector3(-1, 1, 1);
            }
            else if (horizontalInput > 0)
            {
                transform.localScale = new Vector3(1, 1, 1);
            }

            if (Input.GetKeyDown(KeyCode.Space))
            {
                Jump();
            }
        }
        else
        {
            rb.velocity = Vector2.zero;
        }
    }

    private void Jump()
    {
        if (Mathf.Abs(rb.velocity.y) < 0.01f)
        {
            rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse); 
        }
    }

    public void ControllerOpener()
    {
        panelClicked = true;
    }
}
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
kodunuzu denedim ve kendi koduma yaptıklarımın aynısını yaptım fakat "there is no Rigidbody attached to the movingempty(onclicke atmak için oluşturduğum empty) game object but a script is trying to access it" diye hata verdi.

Düzenleme: Peki hocam bu sıkıntı ne tür bir sıkıntı olabilir?
 
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
Verdiğim kodun çalışabilmesi için Rigibody2D compenenti gereklidir. Eğer ekli değilse ekleyin. Hiç bir değişiklik yapmadan benim kodum çalışıyor mu?
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
Verdiğim kodun çalışabilmesi için Rigibody2D compenenti gereklidir. Eğer ekli değilse ekleyin. Hiç bir değişiklik yapmadan benim kodum çalışıyor mu?
Zaten ekliydi. Hata veriyor işte çalışmıyor. Hatta sizin yazığınız rbyi public yapıp kendi rigidbodymi içine attım yine olmadı.
 

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
İnternette hatanın RigiBody2D olmamasından kaynaklandığını söylüyor. Neden rb'yi public yaparak, kendi yönteminizi uyguladınız?
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
kendi yöntemimi uygulamadan önce kodun kendisini de uyguladım, rbyi public yapmamın sebebi kodun rigidbody componentine ulaşamamasıydı.
Mesaj otomatik birleştirildi:

Screenshot_848.png
 

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
Attığım kodda Scripts in yerleştirildiği gameObject ile RigiBody2D compenentinin aynı gameObjectte olması ile rb'ye erişim sağlanır. Erişim sağlanamadı derken nerden anlıyorsunuz?
 

ColosusYEB

Öğrenci
Katılım
10 Şubat 2023
Mesajlar
55
Çözümler
1
Reaksiyon puanı
11
Puanları
8
kodunuzu denedim ve kendi koduma yaptıklarımın aynısını yaptım fakat "there is no Rigidbody attached to the movingempty(onclicke atmak için oluşturduğum empty) game object but a script is trying to access it" diye hata verdi.

Düzenleme: Peki hocam bu sıkıntı ne tür bir sıkıntı olabilir?
Çünkü burada denen şey anlam olarak ona tekabül ediyor.


Scriptsin yerleştirildiği game object ile rb2d componentininki aynı zaten. Hatta rb2dyi o yüzden sonradan public yaptım, private olunca inspectorde gözükmüyordu ben de rb2dyi içine atamıyordum.
 

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
Scriptte Start methodunda yazan "rb = GetComponent<Rigidbody2D>();" ifadesi Rb2D'yi çekmek için kullanılan bir yöntemdir. Bunu kullanarak inspector panelinde Rb2D'yi içine atmazsınız.
Kodunuzdan çok başka şeylerde hata olduğunu düşünmeye başladım. Tüm greksinimleri kontrol ederseniz iyi olabilir.
Çünkü burada denen şey anlam olarak ona tekabül ediyor.


Scriptsin yerleştirildiği game object ile rb2d componentininki aynı zaten. Hatta rb2dyi o yüzden sonradan public yaptım, private olunca inspectorde gözükmüyordu ben de rb2dyi içine atamıyordum.
 

Son mesajlar

Üst