- Home /
Running a script in editor mode
How can I run this script in editor mode? Adding @ExecuteInEditMode to the top doesn't work. What other ways are there? This script is from Unity's procedural examples.
var radius = 1.0;
var pull = 10.0;
private var unappliedMesh : MeshFilter;
enum FallOff { Gauss, Linear, Needle }
var fallOff = FallOff.Gauss;
static function LinearFalloff (distance : float , inRadius : float) {
return Mathf.Clamp01(1.0 - distance / inRadius);
}
static function GaussFalloff (distance : float , inRadius : float) {
return Mathf.Clamp01 (Mathf.Pow (360.0, -Mathf.Pow (distance / inRadius, 2.5) - 0.01));
}
function NeedleFalloff (dist : float, inRadius : float)
{
return -(dist*dist) / (inRadius * inRadius) + 1.0;
}
function DeformMesh (mesh : Mesh, position : Vector3, power : float, inRadius : float)
{
var vertices = mesh.vertices;
var normals = mesh.normals;
var sqrRadius = inRadius * inRadius;
// Calculate averaged normal of all surrounding vertices
var averageNormal = Vector3.zero;
for (var i=0;i<vertices.length;i++)
{
var sqrMagnitude = (vertices[i] - position).sqrMagnitude;
// Early out if too far away
if (sqrMagnitude > sqrRadius)
continue;
var distance = Mathf.Sqrt(sqrMagnitude);
var falloff = LinearFalloff(distance, inRadius);
averageNormal += falloff * normals[i];
}
averageNormal = averageNormal.normalized;
// Deform vertices along averaged normal
for (i=0;i<vertices.length;i++)
{
sqrMagnitude = (vertices[i] - position).sqrMagnitude;
// Early out if too far away
if (sqrMagnitude > sqrRadius)
continue;
distance = Mathf.Sqrt(sqrMagnitude);
switch (fallOff)
{
case FallOff.Gauss:
falloff = GaussFalloff(distance, inRadius);
break;
case FallOff.Needle:
falloff = NeedleFalloff(distance, inRadius);
break;
default:
falloff = LinearFalloff(distance, inRadius);
break;
}
vertices[i] += averageNormal * falloff * power;
}
mesh.vertices = vertices;
mesh.RecalculateNormals();
mesh.RecalculateBounds();
}
function Update () {
// When no button is pressed we update the mesh collider
if (!Input.GetMouseButton (0))
{
// Apply collision mesh when we let go of button
ApplyMeshCollider();
return;
}
// Did we hit the surface?
var hit : RaycastHit;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast (ray, hit))
{
var filter : MeshFilter = hit.collider.GetComponent(MeshFilter);
if (filter)
{
// Don't update mesh collider every frame since physX
// does some heavy processing to optimize the collision mesh.
// So this is not fast enough for real time updating every frame
if (filter != unappliedMesh)
{
ApplyMeshCollider();
unappliedMesh = filter;
}
// Deform mesh
var relativePoint = filter.transform.InverseTransformPoint(hit.point);
DeformMesh(filter.mesh, relativePoint, pull * Time.deltaTime, radius);
}
}
}
function ApplyMeshCollider () {
if (unappliedMesh && unappliedMesh.GetComponent(MeshCollider)) {
unappliedMesh.GetComponent(MeshCollider).mesh = unappliedMesh.mesh;
}
unappliedMesh = null;
}
Answer by Joshua · May 19, 2011 at 05:26 PM
You're using JS so at the top put
@script ExecuteInEditMode()
and the Update and FixedUpdate functions will be run in edit mode every event and every frame while the scene few has focus, if I remember correctly.
Right, the new site won't show what I actually types. What you type is http://unity3d.com/support/documentation/ScriptReference/ExecuteInEdit$$anonymous$$ode.html
Answer by Jeston · May 19, 2011 at 05:35 PM
Well I would encourage you to look at the unity docs for Editor, and to answer your question,
an editor script looks something like this:
[CustomEditor(typeof(SomeEditor))] public class SomeEditor : Editor {
//.. void OnSceneGUI() { //logical tick }
public override void OnInspectorGUI()
{
//draw ui tick
}