Почему «OnTriggerEnter2D ()» не работает при столкновении двух конкретных объектов?

#c# #unity3d #triggers #overlap

#c# #unity3d #триггеры #перекрытие

Вопрос:

Я создаю эту игру в стиле flappy bird в unity с C #.

Мой текущий прогресс

У меня есть функция оценки в скрипте игрового контроллера. Вот оно…

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class GameController : MonoBehaviour
{
    private int score = 0;
    public float starScrollSpeed;
    public float groundScrollSpeed;
    public float skyScrollSpeed;
    public GameObject gameOverText;
    public GameObject playAgain;
    public bool gameOver = false;
    public static GameController instance;
    public Text scoreText;

    // Start is called before the first frame update
    void Awake()
    {
        if(instance == null)
        {
            instance = this;
        }

        else if(instance != this)
        {
            Destroy(gameObject);
        }
    }

    // Update is called once per frame

     void Start()
    {
        
    }
    
    void Update()
    {
        
    }

    public void BirdScored()
    {
        if (gameOver)
        {
            return;
        }
        score  ;
        scoreText.text = "SCORE  "   score.ToString();
    }

    public void PlaneDestroyed()
    {
        gameOverText.SetActive(true);
        playAgain.SetActive(true);
        gameOver = true;
    }
}
 

На самом деле птица и самолет — это одно и то же.

Что я хочу сделать, так это заставить птицу забивать / запускать функцию BirdScored(), когда Плоскость перекрывается со звездой. У самолета есть Rigidbody2D и коллайдер, а у звезд есть Rigidbody2D, но нет коллайдера, потому что в сценарии bird, если самолет сталкивается, он разрушается.

Вот сценарий Bird

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

public class Bird : MonoBehaviour
{
    private bool isDead = false;
    private Rigidbody2D rb2d;
    public float upforce = 200f;
    private Animator anim;

    // Start is called before the first frame update
    void Start()
    {
        rb2d = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

        if (isDead == false)
        {
            if (Input.GetMouseButtonDown(0))
            {
                rb2d.velocity = Vector2.zero;
                rb2d.AddForce(new Vector2(0, upforce));
            }
        }

        anim.SetTrigger("Flap");
    }

    void OnCollisionEnter2D()
    {
        
        isDead = true;
        anim.SetTrigger("Die");
        GameController.instance.PlaneDestroyed();
    }
}
 

И вот сценарий star…

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

public class Stars : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.name == "Plane")
        {
            GameController.instance.BirdScored();
        }
    }
}
 

Что не так и что мне делать?

Комментарии:

1. звезде нужен collider2d

2. Также вы отлаживали это? Метод вообще не вызывается или, может быть, что-то в вашем GameControler не работает?

Ответ №1:

Поставьте Colider2D на звездочку и отметьте Is Trigger опцию в инспекторе.

Отключите Is Trigger столкновение с любым другим collider2d, чтобы ваш самолет не был уничтожен OnCollisionEnter2D , но OnTriggerEnter2D сработает правильно.

Ответ №2:

Я вижу на вашем скриншоте, что коллайдер не настроен на «is trigger», что делает его неспособным регистрировать столкновения триггеров.