我正在开发一个游戏,我有一个带有" player“标签的my Player。我有一个自行车产卵系统,每个自行车手都有“自行车手”的标签,它们都是预制的。我有一个脚本车的预制,使它向前移动,所以每次它产卵,它立即开始在一个固定的方向移动。
我希望骑自行车的人能够检测到两件事,一个是球员是否在前面,另一个是如果另一个骑自行车的人在前面。如果是这样,我希望骑自行车的人阻止骑自行车的人。我有一个名为cyclistStoping.cs的脚本,我正在用它来做这件事。脚本已经被放置到自行车预制件上,以便生成多个实例。
错误
我注意到,有时,即使一个自行车手(A)不再站在另一个自行车手(B)的前面,自行车手(B)仍然会静止不动,只有当该车手走在它前面,然后再次离开时,它才会再次移动。我觉得我的代码就是有buggy,我真的希望在这方面能得到一些帮助。
我试着在每个触发器函数中做两个简单的检查,但是当骑车人不再在他们前面时,一些骑车人仍然空闲着。
我也试过使用延迟功能,这样每当骑车人或玩家不再在射程内时,骑车人直到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秒,第二个骑自行车的人也会做同样的事情。
发布于 2019-04-11 23:25:18
代码中的主要问题是让自行车再次移动的逻辑应该在IEnumerator中,而不是在OnTriggerExit中。在OnTriggerExit中启动Coroutine
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;
}
}https://stackoverflow.com/questions/55635327
复制相似问题