Хочу для упрощения сборки сцены написать скрипт для расстановки блоков прямо из редактора щелчками мыши. Наклепал блоков и расставил их мышью, как надо... Что написать в скрипте? Как прямо в редакторе пустить луч, определить объект, определить позицию и инстанциировать новый блок рядышком с уже поставленным? Я писал подобный скрипт, но он был риалтайм, то есть запускаешь игру и расстанавливаешь блоки, а затем сохраняешь в префаб, не выключая сцены, но это не удобно.
By default, script components are only executed in play mode. By adding this attribute, each script component will also have its callback functions executed while the Editor is not in playmode.
The functions are not called constantly like they are in play mode. - Update is only called when something in the scene changed. - OnGUI is called when the Game View recieves an Event. - OnRenderObject and the other rendering callback functions are called on every repaint of the Scene View or Game View.
Код
using UnityEngine; using System.Collections;
[ExecuteInEditMode] public class ExampleClass : MonoBehaviour { public Transform target; void Update() { if (target) transform.LookAt(target);
Благодарю, дальше постораюсь сам разобраться. Если будут вопросы, напишу сюда, так что тему закрывать не надо)
Добавлено (02 Сен 2015, 21:59) --------------------------------------------- Искал, и смотрел скрипт AttachedPathScript из Rpad And Path tool, но не смог понять: как спаунятся точки там, где щелкают мышью на террайне? "var ray : Ray = Camera.main.ScreenPointToRay(Input.mousePosition);" не подходит, как я понял, т.к. Camera.main - рабочая камера в игре. Как можно заменить?
@script ExecuteInEditMode() var Prefab : Transform; var Create : boolean;
function OnGUI () {
var e : Event = Event.current;
if(e.button == 0 && !Create){ Create = true; }
if(e.button == 1 && Create){ Debug.Log("Right Click"); Create = false; var ray : Ray = HandleUtility.GUIPointToWorldRay ( e.mousePosition ); var hit : RaycastHit; if (Physics.Raycast ( ray, hit, Mathf.Infinity)){ Instantiate (Prefab.gameObject, hit.point, Quaternion.identity); } } }
Криво пашет. Часто спаунит по 2 куба за раз, и "if(e.button == 0 && !Create){" не работает. Не приходится нажимать левую мышь, чтобы "Create = true;" Как только отпускаю правую, Create снова = true. И еще, работает только если перейти в окно Game. Как это избежать, чтобы работало из окна Scene? Иногда делает так: Жму правой клавишей. Он спаунит куб где нужно, и еще спаунит второй с определенном месте, не знаю, почему именно там. А еще выдает такую ошибку:
Unable to convert GUI point to world ray if a camera has not been set up! UnityEditor.HandleUtility:GUIPointToWorldRay(Vector2) SceneEditor:OnGUI() (at Assets/SceneEditor/SceneEditor.js:16)
Сообщение отредактировал VolkOrievith - Чт, 03 Сен 2015, 15:51
Я понял, что "On...GUI это не OnGUI! ", но когда я пишу "OnSceneGUI", ничего не просходит. Абсолютно. Debug.Log ничего не пишет в консоль. Заменил "@CustomEditor(SceneEditor)". Опять же ничего не происходит. Может подскажете, как написать? Я не спец, я учился писать скрипты, просто читая уже написанные кем-то скрипты.
Много чего испробовал. Плохо у меня это получается. Подумал, что быстрее будет сделать Realtime редактор. И сделал. Составлю блоки -> нажму "объединить", все пихается под один parent и я сохраняю в префаб.
Добавлено (09 Сен 2015, 14:24) --------------------------------------------- Если кому-то надо, могу выложить код.
Красиво) Особенно понравилась удобная панель, где можно выбрать разные виды одного рода блока. У меня из визуализации только это: выбранный блок плавает за мышью, чтобы видеть, как ставишь. Сетка таким образом: берутся координаты и округляются до 1/4 метра.