Как сделать спидометр в Unity?

На этот раз, затронем тему гонок и около того. Конкретно, нам надо сделать спидометр для нашей машины. Возможно, будет интересно тем, кто создает свою «Need for Speed». Чтобы спидометр работал как надо, нужно привязать реальную скорость физического объекта, с его показаниями. То если, скорость тела ровна десяти, то и стрелка спидометра должна показывать тоже самое. Скрипт для этого дела, достаточно прост и подойдет как для двухмерного, так и для трехмерного проекта. Главное, это правильно визуально создать сам спидометр и задать начальные настройки.

Для начала, нам понадобится нарисовать, или скачать уже готовый шаблон спидометра. Разумеется стрелка у него должна быть отдельной, так как ее мы будем анимировать. Итак, спрайт без стрелки, стороны которого должны быть равны:

Как сделать спидометр в Unity?

А вот со стрелкой нужно немного повозится. Делаем дубликат, затем разворачиваем на 180 градусов:


И не забываем сделать тримминг изображения, чтобы обрезать лишние прозрачные области.

Теперь, убираем дубликат и получаем готовый результат:


Дело в том, что стрелка будет вращаться относительно своего центра по умолчанию, чтобы в дальнейшем не заморачиваться всем этим, проще заранее нарисовать соответствующее изображение, указанным выше способом.



Осталось только добавить UI картинки на сцену, стрелку ставим в на свое место и настраиваем размеры.

Ну и сам скрипт Speedometer:

using UnityEngine;
using System.Collections;

public class Speedometer : MonoBehaviour {

	public float _start; // начальное положение стрелки по оси Z

	public float maxSpeed; // максимальная скорость на спидометре

	public RectTransform arrow; // стрелка спидометра

	public enum ProjectMode {Project3D = 0, Project2D = 1};
	public ProjectMode projectMode = ProjectMode.Project3D;

	public Transform target; // объект с которого берем скорость

	public float velocity; // текущая реальная скорость объекта

	private Rigidbody _3D;
	private Rigidbody2D _2D;
	private float speed;

	void Start () 
	{
		arrow.localRotation = Quaternion.Euler(0, 0, _start);
		if(projectMode == ProjectMode.Project3D) _3D = target.GetComponent<Rigidbody>();
		else _2D = target.GetComponent<Rigidbody2D>();
	}

	void Update () 
	{
		if(projectMode == ProjectMode.Project3D) velocity = _3D.velocity.magnitude; else velocity = _2D.velocity.magnitude;
		if(velocity > maxSpeed) velocity = maxSpeed;
		speed = _start - velocity;
		arrow.localRotation = Quaternion.Euler(0, 0, speed);
	}
}

Как видно, ничего сложно нет, важное условие, чтобы на машине и т.п. был компонент Rigidbody.

Скачать и посмотреть в работе:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 3

Офлайн
AlexMcKing 15 ноября 2017
Как сделать чтобы в цифрах отображалось?
Офлайн
Light 15 ноября 2017
AlexMcKing, вывести в текст переменную velocity.
Офлайн
ForzaKing 20 февраля 2020
Как создать свой шаблон датчиков тахометр и т.п
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика