Как запретить GameObject обнаруживать столкновения без ссылок - PullRequest
0 голосов
/ 04 февраля 2019

Я создаю бесконечную игру для раннеров, в которой основная идея состоит в том, чтобы избегать шипов и собирать драгоценные камни - довольно просто.У меня проблема в том, что всякий раз, когда игрок сталкивается с драгоценным камнем, даже если он уничтожает драгоценный камень, воспроизводит анимацию коллекции и добавляет 1 к счетчику очков, он также действует как шип и уничтожает игрока.Почему это происходит и как я могу это исправить?Вот мой код для "GemTypeCollision.cs":

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

public class GemTypeCollision : MonoBehaviour 
{
    public GameObject gem;
    public Collider2D gemCollider;
    public float numberOfGems;
    public Animator gemAnimator;

    private void OnTriggerEnter2D(Collider2D gemCollider)
    {
        numberOfGems += 1;
        gemAnimator.SetBool("gemCollected", true);
        Destroy(gem, 0.5f);
    }
}

Я также думаю, что стоит отметить, что у игрока также есть прикрепленный скрипт "столкновения типа шипа", и игрок реагирует именно так, как онбыл бы, если бы он ударил шип, даже когда камень был разрушен.Кажется, кажется, что камень относится к типу spike и gem типа, но я не совсем уверен.

Обновление вопроса:

Вот настоящая проблема - когда игрок сталкиваетсяс чем угодно, Unity думает, что он сталкивается со всем, как метод OnTriggerEnter2D, вместо того, чтобы принимать параметр Collider2D, который я ему даю, он просто игнорирует информацию и думает, что игрок запускается каждым коллайдером одновременно.Кто-нибудь знает способ решить эту проблему?

1 Ответ

0 голосов
/ 04 февраля 2019

Из кода, который вы разместили, я просто предполагаю, что вы делаете ту же ошибку в скрипте столкновения игрока, как здесь:

Вы не проверяете, действительно ли столкновение происходит с правильным типом объекта, поэтому оба скрипта будутреагировать на любой триггер коллайдера.


Вы должны пометить ваши объекты соответствующим образом, например, "Spike" и "Gem", а затем сделать

private void OnTriggerEnter2D(Collider2D gemCollider)
{
    // You should always check e.g. via a tag
    // if it's not a Gem -> do nothing
    if(gemCollider.tag != "Gem") return;

    // or alternatively if there is a certain component on the collision object you might also do
    if(!gemCollider.GetComponent<GemComponent>()) return;

    // ...
}

ТеперьТо же самое и при столкновении с шипами, вы должны добавить проверку, например,

private void OnTriggerEnter2D(Collider2D other)
{
    // if it's not a spike do nothing
    if(other.tag != "Spike") return;

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