Şimdi Ara

Unity 3d Hareket Sorunu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
21
Cevap
0
Favori
4.679
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Merhabalar, ben android 2d bir oyun yazıyorum hatta bitti bile denebilir sadece tek bir sıkıntım kaldı, oyun karakterim ekrana dokundukça uçuyor telefonu sağa sola çevirince sağa sola gidiyor ama ekranın dışına çıkıyor bunun için bir çok yol denedim ama bir türlü beceremedim.

    Collider ekledim olmadı rigidbody ekledim collider ile birlikte boş bir gameobje ye tüm ayarlarıyla tek tek oynadım araştırmalar yaptım olmadı.

    karakterin gidebileceği sınırları belirleyerek if komutu yazdım birçok kombinasyon denedim fakat bu sefer de ya hiç hareket etmedi yada belirlediğim sınırlara gelince takıldı hareket etmedi yardımcı olur musunuz hareket kodlarımı paylaşıyorum aşağıda;

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.Audio;

    public class CharacterFlying : MonoBehaviour {

    public float gravity;
    Vector3 bird_move = Vector3.zero;
    public Vector3 flyspeed;
    bool boolflapping;
    public float maxspeed;
    public static float speedforward;
    public float left = -2.38f;
    public float right = 2.43f;
    public float CharSpeed = 0.040f;
    public AudioSource jump;


    void Start()
    {

    }

    void FixedUpdate()
    {

    if (!UserSettings.GameStart)
    {
    if (!UserSettings.GameOver)
    {
    if (!UserSettings.Pause)
    {
    bird_move += new Vector3(0, /*-gravity*/-0.18f, 0);
    if (boolflapping == true)
    {
    boolflapping = false;
    bird_move += flyspeed;
    }
    if (bird_move.y > maxspeed)
    {
    bird_move = new Vector3(bird_move.x, maxspeed, bird_move.z);
    }
    bird_move = new Vector3(speedforward, bird_move.y, bird_move.z);
    /*float rot;
    if (transform.position.y < 0)
    {
    rot = Mathf.Lerp(0, 0, -bird_move.y / maxspeed);
    transform.rotation = Quaternion.Euler(0, 0, rot);
    }*/
    transform.position += bird_move * Time.deltaTime;
    }
    }
    }


    }

    void Update()
    {
    if (transform.position.x > left && transform.position.x < right)
    {
    transform.Translate(Input.acceleration.x, 0, 0); //Denenecek
    }
    if (Input.GetKeyDown(KeyCode.Space))
    {
    boolflapping = true;
    jump.Play();

    }
    if (Input.touchCount > 0)
    {
    boolflapping = true;
    jump.Play();
    }

    /*if (Input.acceleration.x > 0.25)
    { //sağ tarafa döndürürken yapılacak işlem
    transform.Rotate(5, 0, 0); // sağ tarafa (rotasyon.x'e) 5 ekle
    }
    if (Input.acceleration.x < -0.25)
    { //sol tarafa döndürürken yapılacak işlem
    transform.Rotate(5, 0, 0); // sol tarafa (rotasyon.x'e) 5 eksilt
    }*/

    /*if (Input.acceleration.x > 0.25)
    {

    if (transform.position.x < Screen.width * 0.3f)
    {
    if (transform.position.x > left)
    {
    transform.Translate(Vector3.right * CharSpeed);
    }
    }
    }else if (Input.acceleration.x < -0.25)
    {
    if (transform.position.x > Screen.width * 0.7f)
    {
    if (transform.position.x < right)
    {
    transform.Translate(Vector3.left * CharSpeed);
    }
    }
    }*/


    /* if(Input.acceleration.x > 0.25)
    {
    transform.Translate(Vector3.left * CharSpeed);
    }

    if (Input.acceleration.x > -0.25)
    {
    transform.Translate(Vector3.right * CharSpeed);
    }*/

    }
    }







  • Ekranın çıkılmaması gereken yerlerine uzunca box collider 2d ekle ve main cameraya sabitle. Kamera gittikçe boxcollider2d de onu takip edeceğinden karakterin de çok yukarı zıplarsa veya sağa falan giderse collidere çarpacağından ekranın dışına çıkamaz. Ayrıca karakterinde de collider2d olmalı. Yoksa içinden geçer



    < Bu mesaj bu kişi tarafından değiştirildi 1ht1baron -- 10 Mart 2017; 14:44:47 >
  • Karaktere normal collider koydum 2d koymadım normal collider de aynı işlevi görmez mi ?
  • quote:

    Orijinalden alıntı: sivasle

    Karaktere normal collider koydum 2d koymadım normal collider de aynı işlevi görmez mi ?

    Hayır, görmez. İkisine de collider2d koymalısın.
  • 1ht1baron 1 kullanıcısına yanıt
    3d collider ve rigidbody kullanıyorum normalde ama 2d kullan dediğiniz için denedim karakterdekini de 2d yaptım koymak istediğim sınıra da 2d ekledim z değerlerine hiç dokunmadan denedim yine çarpmıyor z değerlerini aynı yaptım yine değmiyor içinden geçip gidiyor
  • quote:

    Orijinalden alıntı: sivasle

    3d collider ve rigidbody kullanıyorum normalde ama 2d kullan dediğiniz için denedim karakterdekini de 2d yaptım koymak istediğim sınıra da 2d ekledim z değerlerine hiç dokunmadan denedim yine çarpmıyor z değerlerini aynı yaptım yine değmiyor içinden geçip gidiyor

    Mesela karaktere circle collider 2d ekledik. Ekranın en üst kısmına da uzunca bir box collider 2d ekledik. İki colliderda da "Is Trigger" kutucukları işaretli OLMAMALI. Ayrıca Z değerleri farklı olsa bile 2d'de çarpıyor.
    ----
    Yanlışlıkla olmalı yazmışım Is trigger kutucukları işaretli OLMAMALI.



    < Bu mesaj bu kişi tarafından değiştirildi 1ht1baron -- 10 Mart 2017; 15:22:49 >
  • 1ht1baron 1 kullanıcısına yanıt
    Is Trigger ları normalde işaretli değildi siz işaretli olmalı deyince işaretleyip denedim yine olmadı yani ikisinde de işaretli değilken bile çarpmıyor

    Unity 3d Hareket Sorunu
  • Yanlışlıkla yazmıştım. O kutucuk işaretli olunca içinden geçiyor. O yüzden işaretli olmaması gerek. Fakat yukarıya oluşturduğunuz box collider 2d'ye çarpması gerek. Şunun gibi düşünün. Bir tane kutu yaptınız ve buna box collider 2d verdiniz. Mantıken karakterin bu kutuya çarpması gerekiyor.
  • 1ht1baron 1 kullanıcısına yanıt
    Cidden sizi de yormak istemiyorum ama 2d boş bir proje oluşturdum 2 tane sprite oluşturdum birine rigidbody 2d ve box collider 2d ekledim diğerine box collider 2d ekledim hareket kodlarını ekledim ama çarpmadılar izlediğim tüm videolarda çarpıyor hareket kodlarını kaldırıp gravity kullandım yine alttakinin içinden geçip düştü triggerlar da işaretli değil. sonra 3d rigidbody ve collider ekledim ikisine de yerçekimini açtığımda alttakine çarpıp üstünde durdu bunu benim istediğim şekil olan sağ tarafa koydum aynı ayarlarda sağa götürdüğümde içinden geçiyor fakat durmuyor ve pozisyonları kaymaya başlıyor spritelar sağa sola savruluyor
  • Bu işte bir gariplik var. Çarpması gerekiyordu. Ben de unity'de baya bir acemiyim. Belki uzman arkadaşlar yardımcı olabilirler.
    Ayrıca bu videoyu izlemeni tavsiye ederim:
    https://www.youtube.com/watch?v=86Bgt--Ww7w
    Collider2d üzerinde karakteri yürütüyor mesela. Belki yardımcı olabilir.
  • 1ht1baron 1 kullanıcısına yanıt
    Çok teşekkür ederim ilginiz için artık çözeceğiz bir şekilde
  • quote:

    Orijinalden alıntı: sivasle

    Çok teşekkür ederim ilginiz için artık çözeceğiz bir şekilde

    Nasıl oluyor olay tam olarak yani ? Kamera ile karakterin bir ilgisi yok ki. Kamera çizimini yapar, sen GameObject'i hareket ettiriyorsun. Bunuda basit bir CameraScript ile çözebilirsin. Yani camera o karakteri takip etmesini istersin ve hiçbir zaman kamera dışına çıkmaz. Collider çarpışmalarını önlemek için de IsTrigger seçeneğini açman yeterlidir.

    Ekranının dışına çıkmaması için de X ve Y pozisyonlarına Clamp atman yeterlidir. Yani şu değerlerden az veya fazla olmasın mânâsında.
  • Dentrax D kullanıcısına yanıt
    Kamera sabit, oyun sabit bir sahnede geçiyor yukarı doğru zıplıyor ama ekran sınırları içerisinde ne kamera ne karakter çıkmıyor yukarı oyun bu şekilde, benim sorunum 2d collider koyduğumda karaktere ve istediğim sınıra hiçbir şekilde çarpışmıyorlar is trigger ları işaretli değil 3d collider koyduğumda ise temas ettiğinde rotasyonları kayıyor rotasyonları kilitlediğimde de içinden geçip gidiyor çok saçma sapan bir mesele ve bir türlü çözemedim
  • Dentrax D kullanıcısına yanıt
    Şöyleki detaylıca anlatayım yaptığım oyunu boşverelim 2d bir proje oluşturdum ve buna 3 tane 2d sprite oluşturdum birini karakter yaptım, birini alt tarafa birini sağ tarafa koydum karaktere 2d rigidbody ve 2d box collider ekledim, alttakine ve sağdakine 2d box collider ekledim ve hareket etme kodlarını yazıp karakter sprite ına koydum o kodları ve resimleri aşağıda paylaşacağım.

    Şimdi oyunu başlattım aşağı hareket ettim çarpmıyor içinden geçiyor, sağa hareket ettim sağdakinin de içinden geçiyor bu sefer yukarı çıkartıp karakterin yer çekimini açıyorum ve aşağıdaki sprite ın üstünde kalıyor, ama kendim hareket ettiğimde içinden geçiyor.

    Sonra hepsini siliyorum ve 3d rigidbody ve 3d colliderler ekliyorum yer çekimini açıyorum içinden geçip aşağı düşüyor yer çekimini kapayıp hareket ettiriyorum içinden geçiyor ve karakterimin rotasyonları kaymaya başlıyor yani kendi etrafında yukarı aşağı sağa sola dönmeye başlıyor. Rigidbody den rotasyonları kitliyorum bu sefer de sadece içinden geçip gidiyor.

    Bunlar sprite lar 2d colliderler varken;
    Unity 3d Hareket SorunuUnity 3d Hareket SorunuUnity 3d Hareket Sorunu

    Bu da hareket kodum;
     
    void Update()
    {
    if (Input.GetKey(KeyCode.A))
    {
    transform.Translate(Vector2.left * CharSpeed);
    }
    else if (Input.GetKey(KeyCode.D))
    {
    transform.Translate(Vector2.right * CharSpeed);
    }
    else if (Input.GetKey(KeyCode.S))
    {
    transform.Translate(Vector2.down * CharSpeed);
    }else if(Input.GetKey(KeyCode.W))
    {
    transform.Translate(Vector2.up * CharSpeed);
    }
    }




  • İçinden geçmesinin tek sebebi vardır o da Collider çalışmıyordur. 2D olsun 3D olsun fark etmez. Collider ve Rigidbody genellikle beraber kullanılır. Fakat sen burda Collider eklemişssin ama Rigidbody yok. Onlarada eklemen gerekiyor. Daha sonra yerçekimi vs. kapatman gerekiyor ki aşağı veya yukarı düşmesin.

    Buradan şuraya varıyoruz ki Collider'ı Rigidbody ile beraber kullanıyoruz. Çünkü nesnenin fiziği yok ama collideri var ? Mantık olarak fiziği yoksa içinden geçmesi gerekir ki tam da dediğin gibi oluyor. Şöyle düşün, bir nesne yapacaksın enini boyunu metre ile ölçtün (Collider) ama nesne ortada yok ? Teorik olarak olmayan nesnenin içinden geçebilirsin. Oraya resim koymak senin içinden geçemeyeceğin anlamına gelmiyor. (:
  • Dentrax D kullanıcısına yanıt
    Şöyle anlatayım buraya yazmadan önce tüm kombinasyonları denedim siz dediniz diye tekrar denedim hepsinde 2d collider ve rigidbody var hiçbir ayarlarına dokunmadan başlattığımda hepsi birbirinin içinden geçip gidiyor hepsinin yer çekimi kapalı, karaktere yer çekimi ekliyorum yine alttakinin içinden geçip gidiyor, alttaki sprite ın rigidbody sini kinematic yapıyorum yer çekimini açıyorum karakterin de yer çekimini açıyorum karakter alttakinin üstüne konuyor, sağdakini kinematik yapıyorum yer çekimini açıyorum aşağı doğu düşmeye başlıyor ama biraz önce alttakini kinematik yapıp yer çekimini açtığımda sabit kalıyordu yani çok garip bir hata var isterseniz teamviewer ile bağlanıp ne dediğimi daha iyi anlayabilirsiniz.
  • Youtube üzerinde Collider ve Rigidbody 'i anlatan inglizce videolar var. Detaylı bir şekilde anlatanı bulup bakmanı öneririm. Birşeyi ters yapıyorsun ki böyle bulmak biraz zor. (:
  • Çarpışabilir 2d sprite mı istiyorsunuz Bütün sprite lerde Rigidbody 2d ve Box collider 2d olması lazım ve hepsinde gravity scale 0 olması lazım başka bişeye gerek yok.Bu şekilde içinden geçmesine imkan yok.Mesela hepsi eşit seviyede olması için gravity scaleyi 0 yapmak yeterli ama sizin scriptin içinden de gravityi kontrol ettiğinizi görüyorum o karıştırıyor olabilir scriptden onu çıkarın veya 0a eşitleyin.



    < Bu mesaj bu kişi tarafından değiştirildi Bir internet kullanıcısı -- 11 Mart 2017; 23:10:5 >
  • Bir internet kullanıcısı B kullanıcısına yanıt
    Çok sağolasın hallettim dediğin gibi değil de simulated larını açtım ve x,y,z de hareket etmelerini engelledim çarpışmaya başladılar şuan karakterim ekran dışına çıkmıyor ama şöyle bir sorunum oluştu sağ ve sol sınırlara geldiğimde ve ekran dışına çıkmaya çalıştığımda titriyor içine girip girip çıkıyor yani, telefonda da çok hızlı sağa veya sola çevirdiğimde içinden geçip kayboluyor yavaş çevirince sıkıntı yok.
  • transform.Translate kullandığın için objelerin içinden geçiyorsun colliderlar ile bir alakası yok.
    Karakterini rigibody ile kontrol et. Örneğin rigidbody.MovePosition(), rigidbody.velocity vs..

    Karakterinin hareket edeceği alanı sınırlamak istiyorsan Mathf.Clamp komutunu kullanabilirsin.

    Örneğin rigidbody.position = new Vector2(Mathf.Clamp(rigidbody.position.x, -5, 5), Mathf.Clamp(rigidbody.position.y, -5, 5));

    İlk değer x pozisyonu -5 ila 5 arasında sınırlar. Sadece bu alan içeriside hareket eder. İkinci değerde y pozisyonunu -5 ila 5 arasında sınırlar
  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.