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);
}
}
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.
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);
}
}
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 ?
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
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.