İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Sinema Dizi Akıllı Ev Motosiklet Mikromobilite Kripto Para Sağlık Teknolojileri Son dakika Yazarlar
  1. Ana sayfa
  2. SDN Forum
  3. Soru / Cevap
Soru / Cevap

Unity karakter kontrollerini devre dışı bırakma

Konu bilgisi

27cevap
2.825görüntüleme
08.2023açıldı
24.08.2023son cevap

#1
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?
Cevaplar
#2
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.
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#3
İlk olarak panele basıldı mı diye boolean oluşturdum. sonra bütün eylemleri if(panelclicked == true) yaptım. Sonra ne yapacağım?
#4
Basılmasını istediğiniz nesne/ui elemantine basıldığında tanımladığınız bool değişkenini true yapabilirsiniz.
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#5
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ü.
ColosusYEB Konuyu açan
#6
Lütfen ne yapmam gerektiğini söyleyebilir misiniz?
neptün yüksel Yasaklı
#7
IEnumertor ve bool kullan.

bir script oluştur;
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.
#8
Öncelike biraz başa dönmek gibi olacak ancak tam olarak ne istediğinizi açık bir şekilde anlatır mısınız?
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#9
Şö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.
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?
Güncelleme: panelcontroller adında bir void oluşturdum:

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?
düzenlendi
neptün yüksel Yasaklı
#10
Şö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ış.
#11
Ö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.
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#12
Güncelleme: panelcontroller adında bir void oluşturdum:
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.
#13
Sadece update methodunda tanımladığınız bool değişkeni kontrol etseniz yeter.
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#14
Sadece update methodunda tanımladığınız bool değişkeni kontrol etseniz yeter.
Bu kodu buraya attıktan sonra sizin gibi düşünüp onu da denedim yine olmadı.
#15
Sadece bir bool değişkenini "if" ile kontrol etmeye başladığınız da zıplama olayı gerçekleşmemeye mi başladı?
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#16
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.
#17
Ö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.
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#18
Ö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.
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?
düzenlendi
#19
Hocam öncelikle kodunuzda sıkıntı olduğunu düşünüyorum.
Aşağıda vericeğim kodu dener misiniz?

Kod:
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;
    }
}
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#20
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?
düzenlendi
#21
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?
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#22
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ı.
#23
İnternette hatanın RigiBody2D olmamasından kaynaklandığını söylüyor. Neden rb'yi public yaparak, kendi yönteminizi uyguladınız?
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#24
kendi yöntemimi uygulamadan önce kodun kendisini de uyguladım, rbyi public yapmamın sebebi kodun rigidbody componentine ulaşamamasıydı.
Screenshot_848.png
#25
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?
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#26
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.
#27
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.
Jet Sesi, Özgürlüğün Sesidir!!
ColosusYEB Konuyu açan
#28
Bir yerde bir eksiklik var mı diye baktım gözükmüyor.

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.

Reklam