OntriggerEnter не называется playerController - PullRequest
0 голосов
/ 27 октября 2018

У меня есть скрипт, который прикреплен к коробке, в коробке есть два коллайдера для физики и один (немного больше) для обнаружения OntriggerEnters, когда мой игрок проходит по нему. У меня есть скрипт, прикрепленный к коробке, который делает следующее:

public class ColorChangeCollision : MonoBehaviour {

    private GameObject Element;
    private Color32 BaseColor, CollisionColor;
    private Material ElementMaterial;

    void Start () {
        Element = this.gameObject;
        BaseColor = new Color32(255,255,255,255);
        CollisionColor = new Color32((byte)Random.Range(0, 255),(byte)Random.Range(0, 255),(byte)Random.Range(0, 255), 255);
        ElementMaterial = Element.gameObject.GetComponent<Renderer>().material;
    }

    private void OnControllerColliderHit(ControllerColliderHit  other)
    {
        Debug.Log("collision...");
        ElementMaterial.color = CollisionColor;
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("enter");
    }

    private void OnTriggerStay(Collider other)
    {
        Debug.Log("staying..");
    }

    private void OnTriggerExit(Collider other)
    {
        Debug.Log("left...");
        ElementMaterial.color = BaseColor;
    }
}

Основная проблема OnTriggerEnter или OnControllerColliderHit никогда не вызывается, как и другие триггерные события ..

См. Ниже изображение установки коробки и ее компонентов:

Смотрите здесь для моего игрока, который должен вызывать функцию OntriggerEnter или OnControllerColliderHit коробки:

player properties player in 3d scene

РЕДАКТИРОВАТЬ Я изменил все элементы в соответствии с предложениями @Programmer. Но событие OnControllerColliderHit все еще не вызывается .. (обратите внимание, эта функция прикреплена к коробке)

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Существует 3 вопроса о том, как настроить сцену и код:

1 . Вам не хватает Rigidbody. Это должно быть прикреплено к GameObject "Cube", так как это плохо для присоединения Rigidbody к GameObject с помощью CharacterController.

2 . У вас есть два BoxCollider, прикрепленных к одному GameObject («Куб»). Не делайте этого. Это может вызвать много проблем, включая функцию обратного вызова, вызываемую несколько раз или не вызываемую вовсе.

Что делать, когда вам нужен как триггерный, так и не триггерный коллайдер?

Создайте пустой дочерний GameObject, поместите триггер туда. Вы можете сделать это.

3 . Вы используете CharacterController, поэтому вы должны удалить функции OnTriggerXXX обратного вызова. При использовании CharacterController рекомендуется использовать функцию обратного вызова OnControllerColliderHit.

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    ......
}

4 . CharacterController не предназначен для использования в качестве триггеров. Они используются для обнаружения столкновений.

У вас есть два варианта, чтобы он обнаруживал триггеры:

A . Удалите isTrigger из объекта "Куб"

Или

B . Добавьте дочерний пустой GameObject под CharacterController, затем добавьте CapsuleCollider или любой другой коллайдер к нему. Вам не нужно помечать его как isTrigger, так как «Куб» уже помечен как таковой. Вы также не должны иметь Rigidbody, прикрепленный к этому дочернему коллайдеру.

Создайте новый слой с именем «CC» и поместите CharacterController и новый дочерний объект GameObject в слой «CC». Перейдите к своим физическим настройкам матрицы столкновений и сделайте так, чтобы слой "CC" не сталкивался со слоем "CC". Это гарантирует, что CharacterController не обнаружит коллизию от этого дочернего объекта.

Теперь вы можете использовать функции обратного вызова OnTriggerXXX для обнаружения столкновения между CharacterController и объектом "Cube".

0 голосов
/ 27 октября 2018

Один из них должен иметь твердое тело для обнаружения столкновений.

...