0

我已经使用了盒子对撞机和 GUI 功能......但是盒子对撞机的问题是你的车在撞到对撞机后会停下来,而且我还希望屏幕上显示的消息在 10 秒后消失。

这是我的代码:

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");
  }

}
4

3 回答 3

1

但是盒子对撞机的问题是你的车在撞到对撞机后会停下来

你应该澄清这一点。最终发布另一个带有特定问题的问题,可能还有一个SSCCE

我还希望屏幕上显示的消息在 10 秒后消失。

然后把这样的东西放在Update你的方法中MonoBehavior

float timeElapsed;
float timeLimit = 10f;

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

或者,对于更优雅的方法,您可以使用协程:

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

void OnCollisionEnter(Collision collision)
{
  if(theCollision.gameObject.name == "trafficLight")
  {

    msg=true;
    StartCoroutine(FadeAfterTime(10f)); 
  }
}
于 2013-04-21T17:17:11.113 回答
0

据我了解,当玩家靠近停车标志时,您希望屏幕上出现停车消息,以便玩家自己停车。

为了做到这一点,对于初学者,你需要让你的盒子成为触发器而不是对撞机。每个对象的对撞机上都有一个小复选框,上面写着 Trigger。您会希望勾选此项。

然后在交通灯附近的触发框中放置一个类似的脚本:

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在上一个答案中提供的淡出脚本。

我目前无法自己测试这个,但它应该对你有用。如果您有任何问题,请让我知道。

于 2013-04-22T09:10:43.227 回答
-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;
            }
        }
    }
}
于 2015-04-09T08:20:52.967 回答