Генерация плоскости под ногами персонажа

Небольшая мелочь, но может быть весьма полезной. Суть вопроса в создании поверхности под ногами персонажа, то есть, в какую сторону не иди, упасть с края не получится. Правда если подпрыгнуть, скрипт перестанет работать и финиш, но это уже другая история. Данную штуку можно использовать для создания, например, волшебного моста в игре, или вроде того. Значит, создавать плоскость будем из стандартного mesh квадрата, задача в том, чтобы объект клонировал сам себя, в зависимости от того куда идет персонаж, при этом необходимо сделать так, чтобы новые клоны не создавались там, где уже существует объект.

Генерация плоскости под ногами персонажа

Всё это дело для 3D проекта.

Приготовление. Создаем в Unity стандартный трехмерный объект Quad и еще создадим пустой объект. Теперь наш квадрат делаем дочерним пустому, разворачиваем его на 90 по оси Х. Вот, у нас готовая часть поверхности, все последующие клоны, будут создаваться так же дочерними к пустышке.

Далее, на квадрат вешаем небольшой скрипт AutoGenerate:

using UnityEngine;
using System.Collections;

public class AutoGenerate : MonoBehaviour {

	public float shift = 1;
	public float collRadius = 0.1f;
	private bool use = false;

	void GenerateClone(Vector3 position)
	{
		Collider[] coll = Physics.OverlapSphere(position, collRadius);
		GameObject obj = this.gameObject;
		if(coll.Length == 0)
		{
			GameObject clone = Instantiate(obj, position, transform.rotation) as GameObject;
			clone.transform.parent = transform.parent;
			clone.name = "Block";
		}
	}

	void OnCollisionEnter(Collision coll) 
	{
		if(!use)
		{
			GenerateClone(new Vector3(transform.position.x - shift, transform.position.y, transform.position.z + shift));
			GenerateClone(new Vector3(transform.position.x, transform.position.y, transform.position.z + shift));
			GenerateClone(new Vector3(transform.position.x + shift, transform.position.y, transform.position.z + shift));
			GenerateClone(new Vector3(transform.position.x - shift, transform.position.y, transform.position.z));
			GenerateClone(new Vector3(transform.position.x + shift, transform.position.y, transform.position.z));
			GenerateClone(new Vector3(transform.position.x - shift, transform.position.y, transform.position.z - shift));
			GenerateClone(new Vector3(transform.position.x, transform.position.y, transform.position.z - shift));
			GenerateClone(new Vector3(transform.position.x + shift, transform.position.y, transform.position.z - shift));
		}

		use = true;
	}
}

Итак, что тут происходит. Как только персонаж контактирует с коллайдером, делается проверка, если ранее контакта небыло, следует вызов функции GenerateClone в которую мы передаем позицию будущего клона с учетом смещения shift, значение смещения зависит от размера блока. В самой функции, перед тем как создать клона, идет проверка в заданных координатах, существует ли там какие-либо другие коллайдеры. Если в указанных координатах, ничего нет, то объект клонирует сам себя и делает клона дочерним своему родителю.

Порядок создания новых блоков, вокруг активного, в функции GenerateClone:

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