我已经使用了盒子碰撞器和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");
}
}
答案 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;
}
}
}
}