Unity 2D - karakter yönü değişince ışınlanıyor

140122

Hectopat
Katılım
10 Haziran 2019
Mesajlar
156
Çözümler
3
Daha fazla  
Cinsiyet
Erkek
Merhaba Udemy'den Unity öğrenmeye çalışıyorum bütün karakter movementlarını hallettim "a" ya basınca sola "D"ye basınca sağa dönmesini de hallettim fakat ne zaman yön değiştirsem karakter 1 birim döndüğü yöne ışınlanıyor kodlar bunlar;

C#:
void HareketEt()
    {
        float h = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(h* hareketHizi, rb.velocity.y);

        if(rb.velocity.x<0)
        {
            transform.localScale=new Vector3(-1,1,1);
        }
        else if (rb.velocity.x>0)
        {
            transform.localScale= Vector3.one;
        }
    }
Örneğide şöyle göstereyim;

1702499938458.png

Karakter burada duvara yapışık "D" tuşuna bir kez basacağım ve sonuç;

1702499968858.png

Mantıken olduğu yerde dönmesi gerekmekte değil mi?
 
C#:
SpriteRenderer spi;

void HareketEt()
    {
        float h = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(h* hareketHizi, rb.velocity.y);

        if(rb.velocity.x<0)
        {
            spi.flipX = true;
        }
        else if (rb.velocity.x>0)
        {
            spi.flipX = false;
        }
    }
SpriteRendereri scripte vermeyi unutmayın. Ters olursa true ve false yerlerini değiştirirsiniz.
 
C#:
SpriteRenderer spi;

void HareketEt()
 {
 float h = Input.GetAxis("Horizontal");
 rb.velocity = new Vector2(h* hareketHizi, rb.velocity.y);

 if(rb.velocity.x<0)
 {
 spi.flipX = true;
 }
 else if (rb.velocity.x>0)
 {
 spi.flipX = false;
 }
 }
Spriterendereri scripte vermeyi unutmayın. Ters olursa true ve false yerlerini değiştirirsiniz.

Kodları değiştirdim fakat animasyonlar gitti, dönmüyor ve hata alıyorum sanırım "SpriteRendereri scripte vermeyi unutmayın." dediğinizi yapmadığım için burada neyi kastettiğnizi tam anlayamadım daha birkaç saat oldu Unity kullanmaya başlayalı.
 
Kodları değiştirdim fakat animasyonlar gitti, dönmüyor ve hata alıyorum sanırım "SpriteRendereri scripte vermeyi unutmayın." dediğinizi yapmadığım için burada neyi kastettiğnizi tam anlayamadım daha birkaç saat oldu Unity kullanmaya başlayalı.
Karakterin üstüne geldiğinizde SpriteRenderer yazan bir pencere olması lazım sağ taraftaki hiyerarşide onu tutup bu scripte doğru sürükleyin. Zaten sprite renderer diye çıkması lazım sürükleyeceğiniz yerde doğru yaptıysanız.
 
1702501034686.png


Evet sağ tarafta görüyorum Sprite rendererı karakterimin scriptide alttaki dosya bu doysayı spireta mı atmamı istiyorsunuz.
 
Eki Görüntüle 2052003

Evet sağ tarafta görüyorum Sprite rendererı karakterimin scriptide alttaki dosya bu doysayı spireta mı atmamı istiyorsunuz.
Hareket scriptinin karakter üzerinde olması gerekiyor. Sonra Sprite renderer penceresini sağ tarafta scriptteki boş slota sürükleyin.

Olmazsa hareket scriptini buraya komple atın sürükle bırak yapmanızı gerektirmeyecek bir şekilde yazayım kodu.
 
Pencereyi scriptimin içine sürüklüyorum fakat sürüklediğim yerde dediğiniz kod gelmiyor VSCode kullanıyorum bu arada bundan kaynaklanıyor olabilir mi?
 
Pencereyi scriptimin içine sürüklüyorum fakat sürüklediğim yerde dediğiniz kod gelmiyor VSCode kullanıyorum bu arada bundan kaynaklanıyor olabilir mi?
Benden kaynaklı olmuş kodu düzelttim.
C#:
public SpriteRenderer spi;

void HareketEt()
    {
        float h = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(h* hareketHizi, rb.velocity.y);

        if(rb.velocity.x<0)
        {
            spi.flipX = true;
        }
        else if (rb.velocity.x>0)
        {
            spi.flipX = false;
        }
    }
 
Benden kaynaklı olmuş kodu düzelttim.
C#:
public SpriteRenderer spi;

void HareketEt()
 {
 float h = Input.GetAxis("Horizontal");
 rb.velocity = new Vector2(h* hareketHizi, rb.velocity.y);

 if(rb.velocity.x<0)
 {
 spi.flipX = true;
 }
 else if (rb.velocity.x>0)
 {
 spi.flipX = false;
 }
 }

Sonuç maalesef aynı kodlarımın hepsini atayım belki çakışan yerler vardır;

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

public class PlayerHareket : MonoBehaviour
{
    Rigidbody2D rb;

    [SerializeField]
    Transform ZeminKontrolNoktasi;
    [SerializeField]
    Animator anim;

    public LayerMask zeminMaske;


    public float hareketHizi;
    public float ziplamaGucu;
    bool zemindemi;
    bool ikincikezziplasinmi;

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

    private void Update()
    {
        HareketEt();
        ZiplaFNC();

        anim.SetBool("zemindemi", zemindemi);
        anim.SetFloat("hareketHizi", Mathf.Abs(rb.velocity.x));
    }

    void HareketEt()
    {
        float h = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(h* hareketHizi, rb.velocity.y);

        if(rb.velocity.x<0)
        {
            transform.localScale=new Vector3(-1,1,1);
        }
        else if (rb.velocity.x>0)
        {
            transform.localScale= Vector3.one;
        }
    }

    void ZiplaFNC()
    {
        zemindemi = Physics2D.OverlapCircle(ZeminKontrolNoktasi.position, .2F, zeminMaske);
        
        if (Input.GetButtonDown("Jump") && (zemindemi || ikincikezziplasinmi))
        {

            if (zemindemi)
            {
                ikincikezziplasinmi = true;
            }
            else
            {
                ikincikezziplasinmi = false;
            }
            rb.velocity=new Vector2(rb.velocity.x, ziplamaGucu);

            
        }
    }

}
 
Böyle deneyin bakalım. Sürükleme yapmanıza gerek yok.
C#:
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;

public class PlayerHareket : MonoBehaviour
{
    Rigidbody2D rb;
    SpriteRenderer renderer;

    [SerializeField]
    Transform ZeminKontrolNoktasi;
    [SerializeField]
    Animator anim;

    public LayerMask zeminMaske;


    public float hareketHizi;
    public float ziplamaGucu;
    bool zemindemi;
    bool ikincikezziplasinmi;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        renderer = GetComponent<SpriteRenderer>();
    }

    private void Update()
    {
        HareketEt();
        ZiplaFNC();

        anim.SetBool("zemindemi", zemindemi);
        anim.SetFloat("hareketHizi", Mathf.Abs(rb.velocity.x));
    }

    void HareketEt()
    {
        float h = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(h* hareketHizi, rb.velocity.y);

        if(rb.velocity.x<0)
        {
            renderer.flipX = false;
        }
        else if (rb.velocity.x>0)
        {
            renderer.flipX = true;
        }
    }

    void ZiplaFNC()
    {
        zemindemi = Physics2D.OverlapCircle(ZeminKontrolNoktasi.position, .2F, zeminMaske);
       
        if (Input.GetButtonDown("Jump") && (zemindemi || ikincikezziplasinmi))
        {

            if (zemindemi)
            {
                ikincikezziplasinmi = true;
            }
            else
            {
                ikincikezziplasinmi = false;
            }
            rb.velocity=new Vector2(rb.velocity.x, ziplamaGucu);

           
        }
    }

}
 

Geri
Yukarı