OnTriggerEnter () вызывается прямо при запуске - PullRequest
1 голос
/ 19 мая 2019

Я делаю что-то вроде игры Evolution Simualtor.У меня есть сценарий, который должен уничтожить GameObject, к которому он прикреплен, когда CapsuleCollider существа вызывает OnTriggerEnter ().

У меня проблема в том, что даже коллайдер Существа даже близко не к Пище, онвсе еще уничтожает GameObject.

Мой скрипт:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FoodEat : MonoBehaviour
{
    public GameObject FoodGO;
    public Rigidbody FoodRB;

    private void OnTriggerEnter(Collider Creature)
    {
        Destroy(FoodGO);
    }

    void Start()
    {
        FoodRB = GetComponent<Rigidbody>();
        FoodGO = FoodRB.gameObject;
    }

    void Update()
    {
        Rigidbody[] allRigidBodies = (Rigidbody[])FindObjectsOfType(typeof(Rigidbody));

        foreach (Rigidbody body in allRigidBodies)
        {
            if (body.gameObject.layer == 10)
            {
                 OnTriggerEnter(body.gameObject.GetComponent<CapsuleCollider>());
            }

        }

    }
}

1 Ответ

3 голосов
/ 19 мая 2019

OnTriggerEnter - это метод монобихического жизненного цикла.Вы не должны вызывать это из своего собственного кода;он будет автоматически вызываться при обнаружении столкновений.

Более того, логика в вашем коде сейчас кажется неправильной, это ...

"Каждый кадр проходит по всем жестким телам в сцене, и если найден 1на 10-м слое уничтожьте FoodGO "

Просто удалите весь метод обновления и вставьте if в свой метод Collision, и он должен работать:

[RequireComponent(typeof(Rigidbody), typeof(Collider))]
public class FoodEat : MonoBehaviour
{
    private void OnTriggerEnter(collider other)
    {
        Debug.Log(other.gameObject.name + " on layer " + other.gameObject.layer);

        if (other.gameObject.layer == 10)
            Destroy(this.gameObject);
    }

}

Несколькозаслуживающие внимания изменения вашего кода:

  1. Я удалил FoodGO, так как это GameObject, к которому прикреплен этот скрипт, вы можете получить к нему доступ, просто написав gameObject или this.gameObject.
  2. Я удаляю ссылку Rigidbody, поскольку она больше не используется, и, следовательно, весь метод Start ().
  3. Поскольку для работы этого кода требуется Rigidbody и коллайдер, я добавил атрибут [RequireComponent] в верхней части,что заставит Unity сообщить вам, если вы забыли добавить эти компоненты к объекту, к которому вы присоединяете этот скрипт.
  4. Я добавил Debug.Log, который печатает имя и слой на существе, которое сталкивается с едой,так йовы можете отладить и убедиться, что он работает как положено
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...