#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 С тем же коллайдером для велосипедов и плеера все в порядке. Я просто подозреваю, что коллайдер велосипеда спереди настолько большой, что он сталкивается с велосипедом сзади. Вы могли бы попробовать сделать коллайдеры меньше. Код должен быть в порядке, как есть