unity3d Unity汽车游戏显示Kph速度文本

pkln4tw6  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(343)

我想在屏幕上显示车速公里,但我只有0公里,这是不工作。虽然我有这个代码。任何建议将是伟大的谢谢

public Text text;
private double Speed;
private Vector3 startingPosition, speedvec;

void Start () 
{
    startingPosition = transform.position;
}

void FixedUpdate()
{
    speedvec = ((transform.position - startingPosition) / Time.deltaTime);
    Speed = (int)(speedvec.magnitude) * 3.6; // 3.6 is the constant to convert a value from m/s to km/h, because i think that the speed which is being calculated here is coming in m/s, if you want it in mph, you should use ~2,2374 instead of 3.6 (assuming that 1 mph = 1.609 kmh)

    startingPosition = transform.position;
    text.text = Speed + "km/h";  // or mph

}

任何更新/新的代码编辑将是伟大的.谢谢

eqqqjvef

eqqqjvef1#

从评论中可以看出,OP显然附加了显示在速度指示器Text GameObject下的代码,而不是Car。
transform.position
以及
起始位置
始终为相同值,因为文本对象是一个静止的UI元素,根本不移动。(世界空间UI对象除外)
你需要理解transform.position返回代码附加到的GameObject的位置。所以如果你把它附加到文本上,它会给予你文本的位置而不是汽车的位置。
这里的解决方案是使用刚体将代码附加到Car,然后通过检查器将层次中的文本游戏对象分配给速度指示器Text组件变量。
最后,对于刚体组件,您可以简单地通过以下公式获得速度:

text.text = GetComponent<Rigidbody>().velocity.magnitude;
svgewumm

svgewumm2#

我目前正在我的项目中使用这段代码,它工作得很完美。记住我添加了一些选项,使它更完整。

using System;
using UnityEngine;
using UnityEngine.UI;

public enum SpeedUnit
{
    mph,
    kmh
}

public class SpeedOMeter : MonoBehaviour
{
    private float currentSpeed;
    [SerializeField] private Text speedText;
    [SerializeField] private string previousText;
    [SerializeField] private SpeedUnit speedUnit;
    [SerializeField] private int decimalPlaces;
    Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        

        if (speedUnit == SpeedUnit.mph)
        {

            // 2.23694 is the constant to convert a value from m/s to mph.
            currentSpeed = (float)Math.Round(rb.velocity.magnitude * 2.23694f, decimalPlaces);

            //currentSpeed = (float)Math.Round((double)rb.velocity.magnitude * 2.23694f, 0);

            speedText.text = previousText + currentSpeed.ToString() + " mph";

        }

        else 
        {

            // 3.6 is the constant to convert a value from m/s to km/h.
            currentSpeed = (float)Math.Round(rb.velocity.magnitude * 3.6f, decimalPlaces);

            //currentSpeed = (float)Math.Round((double)rb.velocity.magnitude * 3.6f, 0);

            speedText.text = previousText + currentSpeed.ToString() + " km/h";

        }
    }
}
iq0todco

iq0todco3#

我来自未来。只是想让你知道如果你想让这样的东西工作的权利开箱即用,你可以只使用我的代码:

using System.Collections;
using System.Collections.Generic;

using UnityEngine;
using UnityEngine.UI;

public class realSpeedOMeter : MonoBehaviour
{
    public float currentSpeed;
    public Text speedText;
    Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        currentSpeed = rb.velocity.magnitude * 2.23694f;

        speedText.text = currentSpeed.ToString() + "MPH";
    }
}

相关问题