骑单车的球员

时间:2019-04-11 14:45:45

标签: c# unity3d

我正在开发一个游戏,并且我的玩家的标签为“ Player”。我有一个骑自行车的人产生系统,每个骑自行车的人都有“骑自行车的人”标签,它们都是预制件。我在骑自行车的人预制件上有一个脚本,它可以向前移动,因此每次生成时,它立即开始向固定方向移动。

我希望骑自行车的人能够检测到两件事,一是运动员是否在前面,另一是在其他运动员在前面。如果是这样,我希望骑自行车的人停止骑自行车的人。我有一个名为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 :(得分:0)

代码中的主要问题是使自行车再次移动的逻辑应该在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;
    }
}