我正在开发一个游戏,并且我的玩家的标签为“ 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秒钟才能离开,第二个骑自行车的人也将完全一样。
答案 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;
}
}