Ошибка скрипта Cyclist?

#c# #unity3d #if-statement

#c# #unity3d #if-оператор

Вопрос:

Я ранее задавал этот вопрос, и, выполняя некоторую отладку, я, наконец, обнаружил проблему с моим кодом, однако я не уверен, как ее исправить.

Я создал систему создания, которая порождает велосипедистов и мгновенно начинает перемещать их вперед, у меня есть 1 скрипт, который заставляет каждого велосипедиста двигаться вперед, а другой, который заставляет их останавливаться и продолжать движение, когда перед ним находится другой игрок или велосипедист, ЭТО сценарий, в котором есть проблема.

Чтобы быстро подвести итог, всякий раз, когда велосипедист (a) останавливается игроком, а другой велосипедист (b) останавливается велосипедистом впереди, запускается логическое значение, которое поворачивает playerInside и cyclistInside на true . Это нормально. Однако, как только игрок уходит с пути, первый велосипедист (a) имеет playerInside значение false , которое является правильным, но cyclistInside все еще имеет значение true . Это потому, что велосипедист позади него все еще обнаруживает велосипедиста впереди. Так что не похоже, что скрипты работают независимо для каждого велосипедиста.

Я потратил некоторое время на отладку, чтобы действительно найти проблему здесь, и вот что я нашел.

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

public class cyclistStoping : MonoBehaviour
{

public VehicleMove cyclistMovement;

public Animator CycleAnims;

// bools

public bool playerInside;
public bool cyclistInside;

private void Start()
{
    playerInside = false;
    cyclistInside = false;
}

// implement delay

private void Update()
{
    if (playerInside == false amp;amp; cyclistInside == false)
    {
        StartCoroutine(timeDelay());
    }
}

// player or cyclist (INSIDE)
private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "Player" ) {
        playerInside = true;
        cyclistMovement.vehicleMovement = 0.0f;
    }

    else if (other.gameObject.tag == "Cyclist")
    {
        cyclistInside = true;
        cyclistMovement.vehicleMovement = 0.0f;
    }
}

private void OnTriggerExit(Collider other)
{
    if (other.gameObject.tag == "Player")
    {
        playerInside = false;
    }

    else if (other.gameObject.tag == "Cyclist")
    {
        cyclistInside = false;
    }

}

IEnumerator timeDelay()
{
    // wait before moving off
    yield return new WaitForSeconds(2);

    if (playerInside == false amp;amp; cyclistInside == false)
    {
        cyclistMovement.vehicleMovement = 0.1f;
        StopAllCoroutines();
    }
}

}
 

В этот момент, как только игрок отойдет от велосипедиста, первый велосипедист (и те, кто ждет позади) не сдвинутся с места, потому что они ждут движения первого велосипедиста, который не сдвинется с места из-за cyclistInside того, что он установлен на true , даже если впереди нет велосипедиста.

Я ожидаю, что велосипедист уедет, как только игрок больше не будет перед ним, и так далее вместе с остальными.

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

1. Я бы предложил создать LayerMask, используя raycast с этой маской слоя в обновлении, чтобы определить, может ли велосипедист двигаться. На маске слоя должны быть только те предметы, которые могут заставить велосипедиста остановиться в ней. таким образом, вам не нужно полагаться на triggerEnter и exit.

2. Вы можете найти пример приведения здесь docs.unity3d.com/ScriptReference/Physics . SphereCast.html

3. Вы также можете попытаться сделать так, чтобы коллайдер, который обнаруживает другие велосипеды, находился прямо перед велосипедами и не сталкивался с велосипедами сзади

4. @AliBaba Коллайдер box находится перед каждым велосипедом и является одним и тем же коллайдером, который обнаруживает как велосипедистов, так и игрока, это плохо? Должен ли я иметь 2 отдельных коллайдера для обнаружения игрока и велосипедиста?

5. @OpenSource С тем же коллайдером для велосипедов и плеера все в порядке. Я просто подозреваю, что коллайдер велосипеда спереди настолько большой, что он сталкивается с велосипедом сзади. Вы могли бы попробовать сделать коллайдеры меньше. Код должен быть в порядке, как есть