Указатель пути

В отличии от обычного указателя пункта назначения, где показывается направление, вне зависимости от того, находится ли объект за преградой или нет. Данный вариант предлагает несколько иной метод, а именно создание маршрута до конечной цели, из ключевых точек (waypoints). То есть, наша задача получить массив ключевых точек, на базе которых работает компонент NavMeshAgent. Соответственно для того, чтобы всё работало, необходимо создать карту навигации, о чем можно почитать как у нас, так и в официальном мануале.


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

Итак, скрипт PlayerNavi:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class PlayerNavi : MonoBehaviour {
	
	public Transform target;

	public RectTransform pointer;
	public RectTransform pointerBG;
	
	private static Vector3 point;
	private float deltaX;
	private Vector3 curPoint;

	private Image mainImage;
	private Color mainColor;

	public static void SetTargetPoint(Vector3 position) // публичная функция для установки пункта назначения
	{
		point = position;
	}

	void Start()
	{
		deltaX = pointerBG.sizeDelta.x / 2;
		if(target) point = target.position;
		mainImage = pointer.GetComponent<Image>();
		mainColor = mainImage.color;
	}

	bool IsBehind(Vector3 point) // находится ли цель позади нас
	{
		bool result = false;
		Vector3 forward = Camera.main.transform.TransformDirection(Vector3.forward);
		Vector3 toOther = point - Camera.main.transform.position;
		if (Vector3.Dot(forward, toOther) < 0) result = true;
		return result;
	}

	void LateUpdate()
	{
		Vector3 pos = new Vector3(Camera.main.transform.position.x, point.y, Camera.main.transform.position.z);

		// создание массива path.corners [ключевых точек]
		NavMeshPath path = new NavMeshPath();
		NavMesh.CalculatePath(pos, point, NavMesh.AllAreas, path);

		if(path.corners.Length >= 2)
		{
			curPoint = path.corners[1]; // берем из массива элемент [1] то есть следующая точка, после текущей позиции игрока

			if(IsBehind(curPoint)) // изменение прозрачности указателя
			{
				mainColor.a = 0.5f;
				mainImage.color = mainColor;
				return;
			}
			else
			{
				mainColor.a = 1f;
				mainImage.color = mainColor;
			}

			float posX = Camera.main.WorldToScreenPoint(curPoint).x;
			float center = Screen.width / 2;
			float minPos = center - deltaX;
			float maxPos = center + deltaX;
			posX = Mathf.Clamp(posX, minPos, maxPos);
			posX = center - posX;
			pointer.anchoredPosition = new Vector2(-posX, 0);

			// нарисовать маршрут в редакторе
			//for (int i = 0; i < path.corners.Length-1; i++) Debug.DrawLine(path.corners[i], path.corners[i+1], Color.blue);
		}
	}
}

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

Скачать демо сцену:

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