Рандомный копипаст в заданной области

Это инструмент для использования в редакторе. Суть работы в том, что с помощью Gizmos в окне редактора, мы рисуем площадь, так сказать. То есть, при помощи ползунков, настраиваются размеры обычного куба, из которого и получаем нужную нам область. Затем, указанный объект, будет дублирован определенное число раз, в пределах установленной области. Подобный инструмент может быть полезен, если нужно раскидать по участку какие-нибудь объекты, допустим, растительность. Имеются режимы работы как для двухмерного, так и трехмерного проекта. А при желании, рандомный генератор, можно адаптировать для нужд игрового процесса.


Итак, всё что нужно это добавить на сцену пустой объект.

Далее, на него вешаем скрипт:

using UnityEngine;
using System.Collections;

public class RandomInstantiate : MonoBehaviour {
	
	public enum Mode {Project3D, Project2D};

	[Header("Object")]
	public Transform targetObject;
	public int cloneNumber = 10;
	public string cloneName = "Object";

	[Header("Settings")]
	public Mode mode = Mode.Project3D;
	public Color color = Color.red;
	[Range(1, 50)] public float scaleA = 1, scaleB = 1;

	private Vector3 scale, curPos;
	private float minA, maxA, minB, maxB;
	private GameObject lastInst;

	void OnDrawGizmos()
	{
		minA = transform.position.x - (scaleA/2);
		maxA = transform.position.x + (scaleA/2);

		if(mode == Mode.Project3D)
		{
			scale = new Vector3(scaleA, 1, scaleB);
			minB = transform.position.z - (scaleB/2);
			maxB = transform.position.z + (scaleB/2);
		}
		else
		{
			scale = new Vector3(scaleA, scaleB, 1);
			minB = transform.position.y - (scaleB/2);
			maxB = transform.position.y + (scaleB/2);
		}

		Gizmos.color = color;
		Gizmos.DrawCube(transform.position, scale);
	}

	Vector3 Position()
	{
		if(mode == Mode.Project3D)
		{
			curPos = new Vector3(Random.Range(minA, maxA), lastInst.transform.position.y, Random.Range(minB, maxB));
		}
		else
		{
			curPos = new Vector3(Random.Range(minA, maxA), Random.Range(minB, maxB), lastInst.transform.position.z);
		}

		return curPos;
	}

	public void Generate()
	{
		if(targetObject == null)
		{
			Debug.LogWarning(this + " не указан целевой объект.");
			return;
		}

		lastInst = new GameObject(cloneName + "_Group");
		lastInst.transform.position = transform.position;

		for(int i = 0; i < cloneNumber; i++)
		{
			Transform clone = Instantiate(targetObject) as Transform;
			clone.parent = lastInst.transform;
			clone.position = Position();
			clone.name = cloneName + "_" + i;
		}
	}

	public void DestroyLast()
	{
		DestroyImmediate(lastInst);
	}
}

Теперь, чтобы использовать функции, нам нужно добавить кнопки в редактор.

Кидаем в папку где у нас скрипты, этот:

#if UNITY_EDITOR
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(RandomInstantiate))]

public class RandomInstantiateEditor : Editor {

	public override void OnInspectorGUI()
	{
		DrawDefaultInspector();

		RandomInstantiate e = (RandomInstantiate)target;

		GUILayout.Space(15);
		if(GUILayout.Button("Instantiate Objects"))
		{
			e.Generate();
		}

		GUILayout.Space(5);
		if(GUILayout.Button("Destroy Last Group"))
		{
			e.DestroyLast();
		}
	}
}
#endif

Добавлять на сцену его не нужно.

Можно скачать демо и использовать готовый префаб:

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