Unity赛车码表原理近⽇在制作赛车游戏时,遇到了码表,较为有趣,遂记录如下。
⾸先观察码表速度0mph时,指针Roatation的z轴⾓度为-133
然后140mph时的z轴⾓度为-43,则
由 140 mph = 270°
=> 1 mph = 270/140 °
=> α mph = α * 270 / 140 °
之间的夹⾓正好为90度,那么按顺时针的话,从0mph到140mph的欧拉⾓为270度。
夹⾓计算出来后,需要跟据速度来换算成⾓度,推导如下:所以重要结论 每公⾥的欧拉⾓为 α * 270 / 140 °换算成代码:
// 获取码表度数
float newZRotation = zRotation - currentSpeed * (270 / 140f);
个人工作事迹这边顺便讲⼀下,通过轮胎的⾓速度获取车⼦整体的位移速度。
// 获取速度
float speed = Mathf.Round(flWheelCollider.rpm * (flWheelCollider.radius * 2 * Mathf.PI) * 60 / 1000);
flWheelCollider是轮胎的WheelCollider,rpm是旋转速度,⼀分钟多少圈;之后这个2ΠR应该⼤家都能看懂,也就是周长;
乘以 60 / 1000,是千⽶每⼩时的单位。那么如此⼀来就获取了位移速度,通过上⾯提到的速度换成为⾓度的公式就可以实现了。完整代码:
using System.Collections;
using System.Collections.Generic;
福建的美食using UnityEngine;
public class SpeedDisplay : MonoBehaviour
{
public WheelCollider flWheelCollider;
private UILabel label;
public float currentSpeed;
public Transform pointContainer;
新手护士>怪诞不经的意思private float zRotation;
// Start is called before the first frame update
void Start()
{
label = this.GetComponent<UILabel>();
zRotation = pointContainer.eulerAngles.z;
双桂坊}
// Update is called once per frame
void Update()
{
什么的拼音/
/ 获取速度
float speed = Mathf.Round(flWheelCollider.rpm * (flWheelCollider.radius * 2 * Mathf.PI) * 60 / 1000);
if (speed < 0) speed = Mathf.Abs(speed);
阳光与阴影< = speed.ToString();
// 获取码表度数沈石溪作品
float newZRotation = zRotation - currentSpeed * (270 / 140f);
pointContainer.eulerAngles = new Vector3(0, 0, newZRotation);
}
}