Mam ambicję napisać skrypt eksplozji. A mianowicie chcę aby przeciwnik podczas śmierci eksplodował, zadając obrażenia sile żywej w zasięgu rażenia. Poszukałem na google, ale nie znalazłem rozwiązania a to głównie dlatego że grę robię na silniku 2D a nie 3D i nie mam zielonego pojęcia jak się za to wziąć :(
@Ofacet: Ależ ambicja. ( ͡°͜ʖ͡°) Przecież to jest banalne i można zaimplementować na wiele sposobów. Np. puszczasz pętlę sprawdzającą wszystkich "żywych" w scenie i jeśli odległość między ich pozycją, a pozycją wybuchu jest mniejsza niż dana wartość, to zadajesz obrażenia. To, czy to jest 2D, czy 3D nie ma praktycznie żadnego znaczenia.
Hmmm, pomyslmy. Robisz tak metode w ktorej sprawdzasz czy jest wybuch, w zmiennej przechowujesz wartosc false dla nie wybuchu. Gdy przeciwnik eksploduje zmieniasz na true i odpalasz funkcje boxColiderEntered, i w niej odwolujesz sie do hp bohatera w tym przypadku odejmujesz mu zycie
@Ofacet: marnie widzę te programowanie jak nie chce Ci się sprawdzić jak działają collidery ( ͡°͜ʖ͡°) Standardowe collidery mogą być dość kłopotliwe bo wykrywają jednocześnie tylko 1 obiekt (ostatni jaki wszedł w jego obręb). Idzie sobie z tym poradzić ale jest lepsze rozwiązanie:
public float radius = 5.0F; public float power = 10.0F;
@Ofacet: utwórz sobie jakąś funkcje do odpalania wybuchu i wklej tam:
explosionPos = transform.position; Collider2D[] colliders = Physics2D.OverlapCircleAll (explosionPos, radius); foreach (Collider2D hit in colliders) { if (hit.gameObject.tag == "Player") { PlayerHealthManager playerHealth = hit.gameObject.GetComponent(); playerHealth.currentHealth -= damage; } }
skrypt pobiera wszystkie obiekty w obrębie wybuchu. Musisz się do nich odwoływać przez hit, przez sam gameObject odwołujesz się do obiektu w którym masz dodany ten skrypt.
@Kiv: chyba ktoś skomentował ale nie przeczytał o co chodzi autorowi ( ͡°͜ʖ͡°) Po pierwsze autor korzysta z 2D a nie 3D więc Rigibody nie zda egzaminu. Po drugie nie chodziło mu o symulacje samego odrzutu a o zadanie obrażeń obiektom znajdującym się w promieniu rażenia.
// Use this for initialization void Start() { EnemyHealthManager boomer = gameObject.GetComponent(); health = boomer.currentHealth; }
// Update is called once per frame void OnTriggerEnter2D(Collider2D circle) { if (health <= 0) { Vector2 explosionPos = transform.position; Collider2D[] colliders = Physics2D.OverlapCircleAll(explosionPos, radius); foreach (BoxCollider2D hit in colliders) { Debug.Log(hit.gameObject.name); if (hit.gameObject.tag ==
Mam ambicję napisać skrypt eksplozji. A mianowicie chcę aby przeciwnik podczas śmierci eksplodował, zadając obrażenia sile żywej w zasięgu rażenia. Poszukałem na google, ale nie znalazłem rozwiązania a to głównie dlatego że grę robię na silniku 2D a nie 3D i nie mam zielonego pojęcia jak się za to wziąć :(
Ktoś? Coś?
@Ofacet: Ależ ambicja. ( ͡° ͜ʖ ͡°) Przecież to jest banalne i można zaimplementować na wiele sposobów. Np. puszczasz pętlę sprawdzającą wszystkich "żywych" w scenie i jeśli odległość między ich pozycją, a pozycją wybuchu jest mniejsza niż dana wartość, to zadajesz obrażenia. To, czy to jest 2D, czy 3D nie ma praktycznie żadnego znaczenia.
Uczę się tego przeklętego programowania :P I wcale mi dobrze nie idzie.
@Duze_blekitne_oczko: A w jaki sposób byś proponował to rozwiązać? Bo tyle to sam wymyśliłem ale nie miałem pojęcia jak to cudo zaimplementować.
public float radius = 5.0F;
public float power = 10.0F;
void explosion () {
Vector3 explosionPos = transform.position;
Collider[] colliders = Physics.OverlapSphere(explosionPos,
@Duze_blekitne_oczko: Akurat wróciłem z biegania i powoli siadam do tego spowrotem. Jak coś tam naskrobię to na pewno się odezwę :D
void Update () {
Vector2 explosionPos = transform.position;
Collider2D[] colliders = Physics2D.OverlapCircleAll (explosionPos, radius);
foreach (Collider2D hit in colliders) {
//tu Twój kod
}
}
obiekt musi mieć jakiegoś collidera 2D aby został wykryty
void Update()
{
if (health <= 0)
{
Vector3 explosionPos = transform.position;
Collider2D[] colliders = Physics2D.OverlapCircleAll(explosionPos, radius);
foreach (Collider2D hit in colliders)
{
Debug.Log(hit.gameObject.name);
if (gameObject.tag == "Player")
{
PlayerHealthManager playerHealth = gameObject.GetComponent();
currentPlayerHealth = playerHealth.currentHealth;
currentPlayerHealth = currentPlayerHealth - damage;
}
}
}
explosionPos = transform.position;
Collider2D[] colliders = Physics2D.OverlapCircleAll (explosionPos, radius);
foreach (Collider2D hit in colliders) {
if (hit.gameObject.tag == "Player")
{
PlayerHealthManager playerHealth = hit.gameObject.GetComponent();
playerHealth.currentHealth -= damage;
}
}
skrypt pobiera wszystkie obiekty w obrębie wybuchu. Musisz się do nich odwoływać przez hit, przez sam gameObject odwołujesz się do obiektu w którym masz dodany ten skrypt.
(https://docs.unity3d.com/ScriptReference/Rigidbody.AddExplosionForce.html)
Komentarz usunięty przez autora
teraz jak wróciłem do skryptu to dopiero zauważyłem że mam błąd. InvalidCastException: Cannot cast from source type to destination type.
Szukam w internecie właśnie sugestii co z tym fantem zrobić :D
EDIT: Ale ze mnie debil. Nie zrobiłem public GameObject z przeciwnikiem który ma wybuchać xD. Co nie zmienia faktu że wciąż nie
public GameObject explosionPos;
public Collider2D circle;
public float radius;
public float damage;
private float health;
private float currentPlayerHealth;
// Use this for initialization
void Start()
{
EnemyHealthManager boomer = gameObject.GetComponent();
health = boomer.currentHealth;
}
// Update is called once per frame
void OnTriggerEnter2D(Collider2D circle)
{
if (health <= 0)
{
Vector2 explosionPos = transform.position;
Collider2D[] colliders = Physics2D.OverlapCircleAll(explosionPos, radius);
foreach (BoxCollider2D hit in colliders)
{
Debug.Log(hit.gameObject.name);
if (hit.gameObject.tag ==