Велосипедист, обнаруживающий игрока - PullRequest
0 голосов
/ 11 апреля 2019

Я работаю над игрой, и у меня есть мой игрок с тегом "Игрок".У меня есть система порождения велосипедистов, и у каждого велосипедиста есть тег "велосипедист", все они являются префабами.У меня есть сценарий для сборного велосипедиста, который заставляет его двигаться вперед, поэтому каждый раз, когда он появляется, он мгновенно начинает двигаться в фиксированном направлении.

Я хочу, чтобы велосипедисты могли обнаружить 2 вещи: одно, если игрок перед ним, и другое, если перед ним другой велосипедист.Если так, я хочу, чтобы велосипедист остановил велосипедиста.У меня есть скрипт с именем cyclistStoping.cs, который я использую для этого.Сценарий был помещен в префаб велосипедиста для создания нескольких экземпляров.

Ошибка

Я заметил, что иногда даже один раз велосипедист (a) больше не находится перед другим велосипедистом(b), велосипедист (b) все еще останется неподвижным, и он снова уйдет, только если игрок идет впереди него, а затем снова уходит.Я чувствую, что мой код просто глючит и был бы признателен за некоторую помощь в этом.

Я пытался сделать 2 простые проверки внутри каждой функции триггера, но некоторые велосипедисты все еще остаются бездействующими, когда велосипедист больше не находится вперед ними.

Я также пытался использовать функцию задержки, поэтому, когда велосипедист или игрок больше не находятся в зоне действия, велосипедист не уходит, пока не пройдет 2-3 секунды.Однако при этом велосипедист больше не уходит.

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

public class cyclistStoping : MonoBehaviour
{

public VehicleMove cyclistMovement;


public bool playerInside = false;
public bool cyclistInside = false;

private bool timePassed = false;

void Start()
{

}

void Update()
{

}

// implement delay

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

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

    if (playerInside == true || cyclistInside == true) {
        Debug.Log("Player inside: " + playerInside);
        cyclistMovement.vehicleMovement = 0.0f;

    }
}

// player or cyclist (EXIT)
private void OnTriggerExit(Collider other)
{
    if (other.gameObject.tag == "Player")
    {
        playerInside = false;
        cyclistInside = false;
    }

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

    if (playerInside == false || cyclistInside == false)
    {

        if (timePassed == true) {
            Debug.Log("Player inside: " + playerInside);
            cyclistMovement.vehicleMovement = 0.1f;
            // delay, then move off
            timePassed = false;
        }
    }
}

IEnumerator timeDelay()
{
    // wait before moving off
    yield return new WaitForSeconds(3);
    timePassed = true;
}

}

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

1 Ответ

0 голосов
/ 11 апреля 2019

Основная проблема в вашем коде состоит в том, что логика для повторного движения велосипеда должна быть в IEnumerator, а не OnTriggerExit. Начните Coroutine в OnTriggerExit:

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

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

    if (playerInside == false && cyclistInside == false) 
    {
        StartCoroutine(timeDelay());
    }

}

И еще раз проверьте в IEnumerator:

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

    if (playerInside == false && cyclistInside == false) {
        cyclistMovement.vehicleMovement = 0.1f;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...