Unity Sprite Renderer collider hatası

Mçınar

Kilopat
Katılım
5 Ağustos 2019
Mesajlar
464
Sa,enemy radar içerisine girdiğinde alarmlight adında Sprite render rengi yeşil iken kırmızı oluyor ama tekrar düşman çıktığında yeşil olmuyor ????

Ekran Görüntüsü (24).png


Turretscript;

Kod:
public class turret_Scriptss : MonoBehaviour.
{
 public float range;
 public Transform target;
 bool detected = false; // saptanmış = false;

 Vector2 direction;
 public GameObject alarmLight;
 void Start()
 {

 }
 void Update()
 {
 Vector2 targetPos = target.position;
 direction = targetPos - (Vector2)transform.position;
 RaycastHit2D rayInfo = Physics2D.Raycast(transform.position, direction, range);

 if (rayInfo)
 {
 if (rayInfo.collider.gameObject.tag == "enemy")
 {
 if (detected == false)
 {
 detected = true;
 alarmLight.GetComponent<SpriteRenderer>().color = Color.red;
 }
 }
 else.
 {
 if (detected == true)
 {
 detected = true;
 alarmLight.GetComponent<SpriteRenderer>().color = Color.green;
 }

 }
 }

 }

 private void OnDrawGizmosSelected()
 {
 Gizmos.DrawWireSphere(transform.position, range);
 }
}
 
Son düzenleme:
Else
İf(detected == true)
Detected= true demişsiniz. Ne için yazdığınız tam anlamadım fakat mantıken buranın = false olması gerekmez mi

Else
İf(detected == true)
Detected= true demişsiniz. Ne için yazdığınız tam anlamadım fakat mantıken buranın = false olması gerekmez mi
Burada çok fazla if else ve raycast kullanmışsınız. Bunun yerine şu şekil bir şey yapmanız daha mantıklı olur. Turretın etrafına bir collider atayın ve isTrigger ı açın. Ardından oncolliderenter olduğu zaman eğer bu obje düşmansa onu bir listeye ekleyin. Sonra ontriggerexit fonksiyonunda da sizin colliderınızdan çıkan düşmanı bu listeden çıkartın. Her zaman bu listedeki ilk düşmana ya da diğer düşmanlara ateş edin. Düşman öldüğünde de listeden çıkartmayı unutmayın
 
Else
İf(detected == true)
Detected= true demişsiniz. Ne için yazdığınız tam anlamadım fakat mantıken buranın = false olması gerekmez mi


Burada çok fazla if else ve raycast kullanmışsınız. Bunun yerine şu şekil bir şey yapmanız daha mantıklı olur. Turretın etrafına bir collider atayın ve isTrigger ı açın. Ardından oncolliderenter olduğu zaman eğer bu obje düşmansa onu bir listeye ekleyin. Sonra ontriggerexit fonksiyonunda da sizin colliderınızdan çıkan düşmanı bu listeden çıkartın. Her zaman bu listedeki ilk düşmana ya da diğer düşmanlara ateş edin. Düşman öldüğünde de listeden çıkartmayı unutmayın
hocam konuyu güncelledim____
Radarı yeni gamobject oluşturup ismini Turret koyup radar merkezi sorununu çözdüm yani Turret gameobjesini yenisi ile değiştirdim.
evet bende çok if kullanıldığının farkındayım video üzerinden aynısını yaptım hocam ama şu collider durumu nasıl olacak bilemedim ??
 
hocam konuyu güncelledim____
Radarı yeni gamobject oluşturup ismini Turret koyup radar merkezi sorununu çözdüm yani Turret gameobjesini yenisi ile değiştirdim.
evet bende çok if kullanıldığının farkındayım video üzerinden aynısını yaptım hocam ama şu collider durumu nasıl olacak bilemedim ??
Bir saniye beklerseniz örnek kod atacağım Unity açılsın

Öncelikle objeleri adıyla kontrol etmeyin. En ufak bir değişimde çok sıkıntı yaşarsınız. Bunun yerine objelere tag'ler verin
Kodu hem fotoğraf olarak hem de kod olarak paylaşayım ki net görebilin.


C#:
    public List<GameObject> enemyObjects;
    public SpriteRenderer alarmSprite;

    private void Update()
    {
        if (enemyObjects.Count > 0)
            alarmSprite.color = Color.red;
        else
            alarmSprite.color = Color.green;
        /* bu if - else'i daha şık yazmanın bir yolu var kısaca = den sonra yazdığım ifade doğru ise ? den sonraki değeri değilse : den sonraki değeri verir*/
       // alarmSprite.color = enemyObjects.Count > 0 ? Color.red : Color.green;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Enemy") && enemyObjects.Contains(collision.gameObject) == false)
        {
            enemyObjects.Add(collision.gameObject);
        }
    }
    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Enemy") && enemyObjects.Contains(collision.gameObject) == true)
        {
            //Düşman öldüğü zaman da yine bu listeden silmeyi unutmayın
            enemyObjects.Remove(collision.gameObject);
        }
    }

1665510079686.png


enemyObjects.Contains metotlarını şunun için kullanıyorum. Daha önce listede olan bir objeyi boş yere bir daha eklemeyeyim. Ayrıca listede olmayan bir elemanı da boşuna çıkartmaya çalışıp hata verdirtmeyeyim diye var orada.
 
Son düzenleme:
Bir saniye beklerseniz örnek kod atacağım Unity açılsın

Öncelikle objeleri adıyla kontrol etmeyin. En ufak bir değişimde çok sıkıntı yaşarsınız. Bunun yerine objelere tag'ler verin
Kodu hem fotoğraf olarak hem de kod olarak paylaşayım ki net görebilin.


C#:
    public List<GameObject> enemyObjects;
    public SpriteRenderer alarmSprite;

    private void Update()
    {
        if (enemyObjects.Count > 0)
            alarmSprite.color = Color.red;
        else
            alarmSprite.color = Color.green;
        /* bu if - else'i daha şık yazmanın bir yolu var kısaca = den sonra yazdığım ifade doğru ise ? den sonraki değeri değilse : den sonraki değeri verir*/
       // alarmSprite.color = enemyObjects.Count > 0 ? Color.red : Color.green;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Enemy") && enemyObjects.Contains(collision.gameObject) == false)
        {
            enemyObjects.Add(collision.gameObject);
        }
    }
    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Enemy") && enemyObjects.Contains(collision.gameObject) == true)
        {
            //Düşman öldüğü zaman da yine bu listeden silmeyi unutmayın
            enemyObjects.Remove(collision.gameObject);
        }
    }

Eki Görüntüle 1541464

enemyObjects.Contains metotlarını şunun için kullanıyorum. Daha önce listede olan bir objeyi boş yere bir daha eklemeyeyim. Ayrıca listede olmayan bir elemanı da boşuna çıkartmaya çalışıp hata verdirtmeyeyim diye var orada.
hocam gördüğüm kadarıyla komple değişim yapmışsınız copy past yapıp eklemem gereken başka birşey var mı ?Hocam mesela radarı tanımlamamışsınız sanırım.
yoksa circle collider ile radarı mı yapar dediniz ?
 
Son düzenleme:
hocam gördüğüm kadarıyla komple değişim yapmışsınız copy past yapıp eklemem gereken başka birşey var mı ?Hocam mesela radarı tanımlamamışsınız sanırım
Bunları direkt kopyalarsanız çalışmaz. Yapmanız gereken bunu oyun mantığına yedirmek. Bu sadece o radar trigger'ının içine giren objeleri bir listede tutar ve bu sayıya göre verdiğiniz sprite rengini değiştirir
 
Bunları direkt kopyalarsanız çalışmaz. Yapmanız gereken bunu oyun mantığına yedirmek. Bu sadece o radar trigger'ının içine giren objeleri bir listede tutar ve bu sayıya göre verdiğiniz sprite rengini değiştirir
hocam daha yeniyim uyarlamakta gerçekten zorluk çekiyorum radarı nasıl uyarlıcam onu düşünüyorum
 
hocam daha yeniyim uyarlamakta gerçekten zorluk çekiyorum radarı nasıl uyarlıcam onu düşünüyorum
Radarın üzerindeki script bu benim attığım şekilde kendisiyle çarpışan düşmanları alıcak hocam. Bunu uygularsanız artık o esnada mevcut alanınızın içindeki tüm düşmanların listesine sahip olursunuz. Sonra düşman listesinin boyu 0 dan büyük olduğu sürece yani içeride düşman olduğu sürece 0. elemana (mevcut listede ilk giren düşmana) turret'ı ateş ettirirseniz sorun tamamen hallolur.
 

Technopat Haberler

Yeni konular

Geri
Yukarı