Вы сейчас тут: Главная » Каталог статей » Обучающие статьи
Создание радара
Категория: Обучающие статьи | Просмотров: 1484 | Добавил: Badman


Радары отображают местоположения других объектов относительно игрока. Как правило, радары имеют круговой дисплей, где центр это местоположение игрока, а каждая графическая точка на радаре показывает местоположение объекта и расстояние от игрока. Сложные радары отображают различные категории объекта различными цветными точками.

На скриншоте, мы можем видеть два желтых маркера, которые указывают относительное местоположение кубов вблизи от игрока.

Для этого рецепта нужен набор изображений(Скачать). Один из них это фоновый рисунок радара, а другой, желтый маркер.

Для отображения радара, показывающего относительное расположение объектов, выполните следующие действия:
1. Создайте новую сцену и добавьте Directional light
2. Создайте terrain с размером 2000 x 2000 в позиции (-1000, 0, -1000)
3. Импортируйте пакет Character Controller
4. Добавьте на сцену 3rd Person Controller в точке (0, 1, 0)
5. Создайте два куба в точках (0, 1, 5) и (-5, 1, 0)
6. Дайте им тег с именем cube
7. Прикрепите следующий C# скрипт к Main Camera:

using UnityEngine;
using System.Collections;
public class Radar : MonoBehaviour {

const float MAX_DISTANCE = 20f;
const int RADAR_SIZE = 128;
public Transform playerController;
public Texture radarBackground;
public Texture targetBlip;

void OnGUI() {
//задний фон отображается слева вверху в виде квадрата 128x128 px
Rect radarBackgroundRect = new Rect(0,0, RADAR_SIZE, RADAR_SIZE);
GUI.DrawTexture(radarBackgroundRect,radarBackground);
//находим все объекты с тегом 'cube'
GameObject[] cubeGOArray = GameObject.FindGameObjectsWithTag("cube");
//рисуем маркеры в перелах нашего расстояния
Vector3 playerPos = playerController.transform.position;
foreach (GameObject cubeGO in cubeGOArray) {
Vector3 targetPos = cubeGO.transform.position;
float distanceToTarget = Vector3.Distance(targetPos,playerPos);
if((distanceToTarget <= MAX_DISTANCE))
DrawBlip(playerPos, targetPos, distanceToTarget);
}
}

private void DrawBlip(Vector3 playerPos, Vector3 targetPos, float distanceToTarget) {
//расстояние от target до player
float dx = targetPos.x - playerPos.x;
float dz = targetPos.z - playerPos.z;
//находим угол от player до target
float angleToTarget = Mathf.Atan2(dx,dz) * Mathf.Rad2Deg;
//направление игрока
float anglePlayer = playerController.eulerAngles.y;
float angleRadarDegrees = angleToTarget – anglePlayer - 90;
//вычисление (x,y) позиции
float normalisedDistance = distanceToTarget / MAX_DISTANCE;
float angleRadians = angleRadarDegrees * Mathf.Deg2Rad;
float blipX = normalisedDistance * Mathf.Cos(angleRadians);
float blipY = normalisedDistance * Mathf.Sin(angleRadians);
//размер маркера в зависимости от размера радара
blipX *= RADAR_SIZE/2;
blipY *= RADAR_SIZE/2;
//смещение маркера относительно центра радара
blipX += RADAR_SIZE/2;
blipY += RADAR_SIZE/2;
//рисуем target в подсчитанном месте
Rect blipRect = new Rect(blipX - 5, blipY - 5, 10, 10);
GUI.DrawTexture(blipRect, targetBlip);
}
}


Выберите Main camera и перетащите 3rd Person Controller, изображение радара и изображение маркера в окно Inspector’а в три публичные переменные
Две константы в нашем коде:
MAX_DISTANCE: определяет максимальное расстояние (в юнитах), на котором объекты должны будут найдены
RADAR_SIZE: определяет размер радара (в пикселях)
Скрипт Radar имеет три публичные переменные:
Первая, это ссылка на 3rd Person Controller
Две других, это изображение радара, а другое изображение, маркер местоположения объекта на радаре
Отображение радара в методе OnGUI()
Метод OnGUI() сначала выводит фоновое изображение радара. Массив типа GameObjects извлекает и перебирает требуемый тег. Для каждого target, если его расстояние до персонажа находится в пределах MAX_DISTANCE, то вызывается метод DrawBlip(), с аргументами позиции игрока и объекта target.

Отображение иконки радара в методе DrawBlip()
Метод DrawBlip() находит расстояние между target и игроком на осях X и Z, и использует их для вычисления угла от target до игрока (используя встроенную функцию ATAN2()). Направление игрока извлекается из оси Y (eulerAngles.y). Угол направления игрока вычитается из угла между target и игроком, поскольку радар отображает относительный угол от направления игрока до таргета. Как обычно, на 90 градусов, необходимо будет вычесть из конечного угла, поскольку мы хотим нулевой градус, который будет отображаться как верх в нашем GUI.

Рассчитывается значение noramlisedDistance, которое всегда будет в диапазоне от 0 до 1, путем деления расстояния в пикселях от таргета до игрока на MAX_DISTANCE. Угол конвертируем в радианы, что необходимо для тригонометрических методов Unity. Затем мы возводим эти радианы в Sin() и Cos() и умножаем на noramlisedDistance, чтобы найти расстояние на котором должны будут отображаться маркеры от центра радиолокационного круга.

Разноцветные маркеры для разных объектов
Добавление дополнительных публичных переменных типа Texture, позволят вам для других категорий объектов отобразить на радаре различные маркеры. Тип Texture может быть добавлен к методу DrawBlip(), и эта текстура может вызываться через оператор GUI.DrawTexture().

Комментарии пользователей
Количество комментариев к материалу: 0
Добавлять комментарии могут только зарегистрированные пользователи.
Регистрация   Вход
Авторизация
Форма входа на сайт
Чат
Удобное общение
200
Категории раздела
Категории материалов
Голосование
Опрос пользователей
Какую версию Unity3D вы используете?
Всего ответов: 124
Результаты
Статистика
Сатистика на сайте

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Все материалы опубликованные на сайте представлены исключительно для ознакомительного просьмота. Любое ваше несанкционированное использование "ассетов" в ваших коммерческих проектах карается уголовной ответственностью.
Хостинг от uCoz