Wpis z mikrobloga

Mireczki spod tagów #programowanie #csharp i #unity3d

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ś?
  • 21
Mam ambicję napisać skrypt eksplozji.


@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;

void explosion () {
Vector3 explosionPos = transform.position;
Collider[] colliders = Physics.OverlapSphere(explosionPos,
@Ofacet: wybacz, nie zauważyłem że chodzi o 2D ( ͡º ͜ʖ͡º)

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
@ktos12356: Prawdopodobnie czegoś nie do końca zrozumiałem :P A mianowicie nie ma obrażeń :(

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;

}
}
}
@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.
@ktos12356: zrobiłem jak zasugerowałeś ale nie działało. Kminiłem sprawę aż mnie szlag trafił i poszedłem do łóżka :P

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 player;
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 ==