当汽车到达交通信号灯时,如何在屏幕上显示“停止”信息?

时间:2013-04-21 15:47:15

标签: unity3d

我已经使用了盒子碰撞器和GUI功能......但是盒式碰撞器的问题在于你的汽车在碰撞对撞机后停止了,并且我还希望在10秒后消息显示在场景上消失。 / p>

这是我的代码:

var msg = false;
function OnCollisionEnter(theCollision : Collision)
{
  if(theCollision.gameObject.name == "trafficLight")
  {
    Debug.Log("collided");
    msg=true;

  }
}

function OnGUI () 
{
  if (msg== true) 
  {
    GUI.Box (Rect (100,0,500,50), "You need to stop if the traffic signal is red");
  }

}

3 个答案:

答案 0 :(得分:1)

  

但是箱式对撞机的问题在于您的车停在后面   击中对撞机

你应该澄清一下。最后发布具有特定问题的另一个问题,可能还有SSCCE

  

我还希望信息显示的信息消失   10秒后。

然后在Update的{​​{1}}方法中添加这样的内容:

MonoBehavior

替代方案,对于更优雅的方法,您可以使用协同程序:

float timeElapsed;
float timeLimit = 10f;

void Update()
{
  if (msg)
  {
    timeElapsed += Time.deltaTime;
    if (timeElapsed >= timeLimit)
    {
      msg = false;
      timeElapsed = 0f;
    }
  }
}

答案 1 :(得分:0)

根据我的理解,当玩家靠近停车标志时,您希望屏幕上显示停止消息,以便玩家必须自行停车。

为了做到这一点,对于初学者,你需要让你的盒子成为触发器而不是对撞机。每个物体的对撞机上有一个小刻度框,表示触发器。你想要勾选它。

然后在红绿灯附近的触发器框中输入与此类似的脚本:

var msg = false;
function Start()
{
}

function OnTriggerEnter(theCollision : Collision)
{
  if(theCollision.gameObject.name == "car") //where "car" you put the name of the car object
  {
        msg = true;
        StartCoroutine(FadeAfterTime(10f));
  }
}

IEnumerator FadeAfterTime(float timeLimit)
{
    yield return new WaitForSeconds(timeLimit);
    msg = false;
}

function OnGUI () 
{
    if (msg== true) 
    {
        GUI.Box (Rect (100,0,500,50), "You need to stop if the traffic signal is red");
    }

}

function Update()
{
}

本质上,红绿灯触发框将检测汽车何时进入指定区域,并将显示GUI,以及Heisenbug在前一个答案中提供的淡出脚本。

我现在无法自己测试,但它应该适合你。如果您有任何疑问,请知道。

答案 2 :(得分:-1)

您应该使用RayCasting功能来实现此目的。  我在这里提供了一个真实的例子。

using UnityEngine;
using System.Collections;

public class carMovement : MonoBehaviour {
    bool isStop = false;
    public float speed = 30f;
    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (!isStop) {
            transform.position += (Vector3.forward * Time.deltaTime * speed);

            var fwd = transform.TransformDirection (Vector3.forward);
            Debug.DrawRay (transform.position, fwd, Color.green);
            if (Physics.Raycast (transform.position, fwd, 10)) {
                print ("There is something in front of the object!");
                isStop = true;
                transform.position = transform.position;
            }
        }
    }
}