OnTriggerEnter2D (Collider2D other) ... доступ к множеству внешних функций скрипта - PullRequest
0 голосов
/ 05 мая 2018

Итак, у меня есть этот скрипт, который отлично влияет на другой скрипт. Он прикреплен к игровому объекту (блоку атаки), который наносит урон другому игровому объекту (врагу). Это заставляет врага GameObject выполнять анимацию (это становится больно) и забирает определенное количество здоровья. Это все работает нормально.

Что я застрял в том, что я пытаюсь заставить его делать то же самое для более чем одного типа врагов, поэтому получаю доступ к нескольким сценариям. Сценарии относительно одинаковы, и я протестировал их по отдельности, и оба прекрасно работают. Но когда я пытаюсь установить свой блок атаки, к которому привязан скрипт, воздействовать более чем на один скрипт, я ничего не получаю Я думаю, что это просто так, как он напечатан, и я уже пробовал несколько способов. Но я вернул его обратно в его самую простую форму, чтобы отобразить его здесь. Как заставить этот сценарий работать для обоих, чтобы мне не нужно было подключать несколько сценариев к одному хитбоксу?

Я должен отметить, что в этом скрипте он получает доступ к первому скрипту, упомянутому в функции OnTriggerEnter2D. Он просто не делает этого для любых других скриптов, упомянутых впоследствии.

using UnityEngine;
using System.Collections;

public class slicer : MonoBehaviour {

public int damage = 5;
private foeHP foe;
private goblin gobby;
public float timer;



void Update()
{
    Destroy ();
    timer -= Time.deltaTime;

}

public void OnTriggerEnter2D (Collider2D other)
{

    if (other.gameObject.tag == "Enemy") {

        other.gameObject.GetComponent<foeHP> ().takeDamage (damage);
        var foe = other.GetComponent<foeHP> ();
        other.gameObject.GetComponent<goblin> ().takeDamage (damage);
        var gobby = other.GetComponent<goblin> ();

    }



    if (foe == null) {
        return;
    }
    if (gobby == null) {
        return;
    }
}

public void Destroy(){
    if (timer <=0)
        Destroy(gameObject);
}
}

1 Ответ

0 голосов
/ 05 мая 2018

Объявите общий класс Enemy, из которого происходят все типы врагов.

public class Enemy : MonoBehaviour
{
    int health;

    public void TakeDamage(int amount)
    {
        health -= amount;
    }
}

Измените классы врагов так, чтобы они все были получены из Enemy

public class Goblin : Enemy
{
    // Extra fields/methods
}

public class Foe : Enemy
{
    // Extra fields/methods
}

Теперь вы можете упростить ваши чеки в:

public void OnTriggerEnter2D (Collider2D other)
{
    if (other.gameObject.tag == "Enemy")
    {
        other.GetComponent<Enemy>().TakeDamage(5);
    }
}

Так как Goblin и Foe имеют тип Enemy, GetComponent<Enemy>() вернет их соответствующий производный тип, и вы можете вызвать TakeDamage() для них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...