- Home /
How to generate objects from a script in the editor, i.e. before runtime?
I'm making a "rope" object, which is comprised of a series of links and hinges. The formation is like this:
Link Hinge Link
Links are just capsules with a Rigidbody, and Hinges are capsules that have two Hinge Joints, one linked to the link above it, one connected to the link below.
The result is a physics-based rope (more of a chain, to be honest) that swings at each Hinge as you'd expect.
Here's a screenshot of the Rope to help visualize:
Obviously it's tedious to manually add Links and Hinges to increase the length of the rope. So, what I want to be able to do is edit the parameters of this rope in the inspector and have its script add Links and Hinges automatically.
My understanding is that I can run some script in editor to achieve this.
I currently have a script called "Rope" on an empty GameObject, with the expectation of generating the Rope Components (Links and Hinges) as children.
Here's the Rope script as it stands...
[ExecuteInEditMode]
public class Rope : MonoBehaviour
{
GameObject[] components = Resources.LoadAll<GameObject>("RopeComponents");
[SerializeField] int ropeLength;
[SerializeField] int numberOfLinks;
public void CreateNewSection(Vector3 pos)
{
var newHinge = Instantiate(components[0],gameObject.transform);
var newLink = Instantiate(components[1], gameObject.transform);
MoveComps(newHinge, newLink, pos);
var hinges = newHinge.GetComponents<HingeJoint>();
hinges[1].connectedBody = newLink.GetComponent<Rigidbody>();
}
void MoveComps(GameObject hinge, GameObject link, Vector3 pos)
{
hinge.transform.position = pos;
link.transform.position = pos + Vector3.down;
}
}
I also have an EditorScript to make a button so that I can run the CreateNewSection method from the Rope script: (Warning: it's totally in shambles, as this is the part of the process I really don't understand...)
using UnityEditor;
[CustomEditor(typeof(Rope))]
public class RopeEditor : Editor
{
SerializedObject ropeObj;
public override void OnInspectorGUI()
{
rope = serializedObject;
DrawDefaultInspector();
DrawRopeEditor();
}
void DrawRopeEditor()
{
GUILayout.Space(5);
GUILayout.Label("Rope Editor", EditorStyles.boldLabel);
DrawCommitButton();
}
void DrawCommitButton()
{
if (GUILayout.Button(text: "Commit"))
{
rope.CreateNewSection(Vector3.zero);
}
}
}
Anyone have experience writing Editor Scripts and procedurally building objects like this?
The problem with the current way I'm attempting this is that I don't know how to reference my Rope script from my editor script so that I can call the CreateNewSection() method.
Thanks for reading, and let me know if you have any thoughts!
Answer by Zubzuke · Nov 15, 2020 at 03:57 PM
You can initialize your rope in Start() or Awake() where you can read the rope length and number of links which have been adjusted from the inspector. I don't think you need to mess with the editor itself.
Try this tutorial:
https://www.youtube.com/watch?v=FcnvwtyxLds
But if you really need to deal with the editor, try this:
Your answer
Follow this Question
Related Questions
ExecuteInEditMode not working in some scripts 1 Answer
How to create gameObjects in editor mode 1 Answer
Bullets follow the ship in 2D Space Shooter game 2 Answers
A way to know if unity was just opened? [ExecuteInEditMode] 0 Answers
How can i add a second camera that will be showing only specific gameobject in game window ? 1 Answer