- Home /
Question by
IcarusCell · Sep 23, 2020 at 09:09 PM ·
guiclickcustom editor
How do you instantiate an object at, or take the coordinates of, a mouse click in the editor window for a custom editor?
So I'm presently working on a custom editor that generates a string of box colliders between two points and then rotates them so that they are flush with the slope between the points. I want to be able to set these two points by clicking within the inspector but I'm very unfamiliar with Unity's GUI systems.
Any assistance is highly appreciated, here is the current code for context:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class ColliderGenerator : EditorWindow
{
#region Variables
Transform pointA;
Transform pointB;
bool startProcess;
GameObject generatorCollider;
float stepLength;
bool clear;
LayerMask desiredInitialLayer;
string nameOfHolder;
List<GameObject> collidersBeingGenerated;
GameObject holder;
GameObject pointBCollider;
GameObject pointACollider;
GameObject pointAGameObject;
GameObject pointBGameObject;
#endregion
// Update is called once per frame
[MenuItem("Tools/Collider Generator")]
public static void ShowWindow() {
GetWindow(typeof(ColliderGenerator));
}
private void OnGUI()
{
GUILayout.Label("Collider Generator", EditorStyles.boldLabel);
clear = EditorGUILayout.Toggle("Clear", clear);
pointAGameObject = (EditorGUILayout.ObjectField("Point A", pointAGameObject, typeof(GameObject), true) as GameObject);
pointBGameObject = (EditorGUILayout.ObjectField("Point B", pointBGameObject, typeof(GameObject), true) as GameObject);
generatorCollider = EditorGUILayout.ObjectField("Collider to be generated", generatorCollider, typeof(GameObject), false) as GameObject;
desiredInitialLayer = EditorGUILayout.LayerField("Initial Layer", desiredInitialLayer);
stepLength = EditorGUILayout.FloatField("Step Length", stepLength);
nameOfHolder = EditorGUILayout.TextField("Name of holder", nameOfHolder);
if (GUILayout.Button("Generate")) {
if (stepLength != 0 && pointAGameObject != null && pointBGameObject != null && generatorCollider != null && nameOfHolder != null)
{
GenerateColliders();
}
else {
Debug.LogError("You are missing necessary information to generate that line correctly");
}
}
}
public void GenerateColliders()
{
#region Generate Colliders Code
holder = new GameObject(nameOfHolder);
pointBCollider = Instantiate(generatorCollider, pointBGameObject.transform.position, pointBGameObject.transform.rotation);
pointA = pointAGameObject.transform;
pointB = pointBGameObject.transform;
float distance = Vector2.Distance(pointA.position, pointB.position);
Vector2 direction = pointB.position - pointA.position;
//RaycastHit2D ray = Physics2D.Raycast(pointA.position, direction, distance);
//RaycastHit2D ray = Physics2D.Raycast(ray, out hit, distance, 1 << LayerMask.NameToLayer("ForConstruction"));
RaycastHit2D ray = Physics2D.Raycast(pointA.position, direction, distance, 1 << LayerMask.NameToLayer("ForConstruction"));
float angleInDegrees;
float slope = (pointB.transform.position.y - pointA.position.y) / (pointB.position.x - pointA.position.x);
float angleInRads = Mathf.Atan(slope);
angleInDegrees = angleInRads * Mathf.Rad2Deg;
if (collidersBeingGenerated != null)
{
collidersBeingGenerated.Clear();
}
if (pointBCollider.GetComponent<CircleCollider2D>())
{
pointBCollider.GetComponent<CircleCollider2D>().radius = stepLength;
}
while (Vector2.Distance(ray.point, pointA.position) >= (0.01))
{
//ray = Physics2D.Raycast(pointA.position, direction, distance);
ray = Physics2D.Raycast(pointA.position, direction, distance, 1 << LayerMask.NameToLayer("ForConstruction"));
GameObject currentCollider = Instantiate(generatorCollider, ray.point, Quaternion.identity);
if (currentCollider.GetComponent<CircleCollider2D>())
{
currentCollider.GetComponent<CircleCollider2D>().radius = stepLength;
}
collidersBeingGenerated.Add(currentCollider);
}
foreach (GameObject addedCollider in collidersBeingGenerated)
{
addedCollider.layer = desiredInitialLayer;
addedCollider.transform.eulerAngles = new Vector3(addedCollider.transform.eulerAngles.x, addedCollider.transform.eulerAngles.y, angleInDegrees);
addedCollider.transform.SetParent(holder.transform);
}
//Generating the collider for point A later so ray doesnt collide (Fix this jank later)
pointACollider = Instantiate(generatorCollider, pointAGameObject.transform.position, pointAGameObject.transform.rotation);
if (pointACollider.GetComponent<CircleCollider2D>())
{
pointACollider.GetComponent<CircleCollider2D>().radius = stepLength;
}
pointBCollider.transform.SetParent(holder.transform);
pointACollider.transform.SetParent(holder.transform);
pointBCollider.transform.eulerAngles = new Vector3(pointBCollider.transform.eulerAngles.x, pointBCollider.transform.eulerAngles.y, angleInDegrees);
pointACollider.transform.eulerAngles = new Vector3(pointACollider.transform.eulerAngles.x, pointACollider.transform.eulerAngles.y, angleInDegrees);
#endregion
}
}
Comment