#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», что делает его неспособным регистрировать столкновения триггеров.