首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自行车手检测播放器

自行车手检测播放器
EN

Stack Overflow用户
提问于 2019-04-11 22:45:45
回答 1查看 77关注 0票数 0

我正在开发一个游戏,我有一个带有" player“标签的my Player。我有一个自行车产卵系统,每个自行车手都有“自行车手”的标签,它们都是预制的。我有一个脚本车的预制,使它向前移动,所以每次它产卵,它立即开始在一个固定的方向移动。

我希望骑自行车的人能够检测到两件事,一个是球员是否在前面,另一个是如果另一个骑自行车的人在前面。如果是这样,我希望骑自行车的人阻止骑自行车的人。我有一个名为cyclistStoping.cs的脚本,我正在用它来做这件事。脚本已经被放置到自行车预制件上,以便生成多个实例。

错误

我注意到,有时,即使一个自行车手(A)不再站在另一个自行车手(B)的前面,自行车手(B)仍然会静止不动,只有当该车手走在它前面,然后再次离开时,它才会再次移动。我觉得我的代码就是有buggy,我真的希望在这方面能得到一些帮助。

我试着在每个触发器函数中做两个简单的检查,但是当骑车人不再在他们前面时,一些骑车人仍然空闲着。

我也试过使用延迟功能,这样每当骑车人或玩家不再在射程内时,骑车人直到2-3秒后才会离开。然而,有了这个,骑自行车的人就不会再离开了。

代码语言:javascript
复制
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秒,第二个骑自行车的人也会做同样的事情。

EN

回答 1

Stack Overflow用户

发布于 2019-04-11 23:25:18

代码中的主要问题是让自行车再次移动的逻辑应该在IEnumerator中,而不是在OnTriggerExit中。在OnTriggerExit中启动Coroutine

代码语言:javascript
复制
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中再次检查

代码语言:javascript
复制
IEnumerator timeDelay()
{
    // wait before moving off
    yield return new WaitForSeconds(3);

    if (playerInside == false && cyclistInside == false) {
        cyclistMovement.vehicleMovement = 0.1f;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55635327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档