Sooo, I’m not a young nooblet programmer, spamming the forums with the most common error! Just though I’d clear that up I’ve been trying to edit a subdivision script from the unify community so that it can be used in the editor. http://wiki.unity3d.com/index.php/MeshSubdivision I’ve been changing tons of stuff, trying to make the code look nice while working inside the inspector. The code from the link is pretty messy, which has made it hard for me to rewrite/modify. Anyways, here’s my code (Sorry for the huge post)
@CustomEditor (MeshRenderer)
class MeshRendererInspector extends Editor
{
@HideInInspector
var buildMesh : boolean = false;
private var verts : Vector3[];
private var norms : Vector3[];
private var uvs : Vector2[];
private var trigs : int[];
private var mesh : Mesh;
private var originalMesh : Mesh;
//Make a function that replaces the Transform Component in the Inpector
public function OnInspectorGUI ()
{
GUILayout.BeginVertical();
DrawDefaultInspector();
if (GUILayout.Button("Show Mesh Values", GUILayout.Width(150)))
{
var selectedObject = Selection.activeGameObject.gameObject.GetComponent(MeshFilter);
if (selectedObject != null)
{
Debug.Log (Selection.activeTransform.name + " has " + selectedObject.sharedMesh.triangles.Length/3 + " triangles.");
Debug.Log (Selection.activeTransform.name + " has " + selectedObject.sharedMesh.vertices.Length + " vertices.");
}
else
{
Debug.Log ("This object is either null, or it doesn't have a mesh, or more specifically a Mesh Filter.");
}
}
if (GUILayout.Button("Subdivide-Edge", GUILayout.Width(150)))
{
SubdividerAwake ();
Subdivide (false);
}
if (GUILayout.Button("Subdivide-Center", GUILayout.Width(150)))
{
SubdividerAwake ();
Subdivide (true);
}
if (GUILayout.Button("Restore Mesh", GUILayout.Width(150)))
{
SubdividerAwake ();
CopyMesh(originalMesh, mesh);
}
GUILayout.EndVertical();
}
function SubdividerAwake ()
{
if (this.gameObject.GetComponent(MeshFilter) == null)
{
buildMesh = true;
this.gameObject.AddComponent(MeshFilter);
}
if(this.gameObject.GetComponent(MeshRenderer) == null)
{
this.gameObject.AddComponent(MeshRenderer);
}
UpdateMesh ();
if (buildMesh)
{
verts = [Vector3(0,-1,0),Vector3(1,1,0),Vector3(-1,1,0),Vector3 (0,1,-1)];
uvs = [Vector2(0,0),Vector2(0,1),Vector2(1,0),Vector2(0,0)];
trigs = [0,1,2,1,3,2];
ApplyMesh();
mesh.RecalculateNormals();
}
originalMesh = new Mesh();
CopyMesh(mesh, originalMesh);
}
function Subdivide (center : boolean)
{
verts = mesh.vertices;
trigs = mesh.triangles;
uvs = mesh.uv;
norms = mesh.normals;
var nv = new Array(verts);
var nt = new Array(trigs);
var nu = new Array(uvs);
var nn = new Array(norms);
if (!center)
{
for (var i : int = 2; i < trigs.length; i += 3)
{
var p0trigwho : int = trigs [i-2];
var p1trigwho : int = trigs [i-1];
var p2trigwho : int = trigs [i];
var p0trigwhere : int = i-2;
var p1trigwhere : int = i-1;
var p2trigwhere : int = i;
var p0 : Vector3 = verts [p0trigwho];
var p1 : Vector3 = verts [p1trigwho];
var p2 : Vector3 = verts [p2trigwho];
var pn0 : Vector3 = norms [p0trigwho];
var pn1 : Vector3 = norms [p1trigwho];
var pn2 : Vector3 = norms [p2trigwho];
var pu0 : Vector2 = uvs [p0trigwho];
var pu1 : Vector2 = uvs [p1trigwho];
var pu2 : Vector2 = uvs [p2trigwho];
var p0mod : Vector3 = (p0+p1)/2;
var p1mod : Vector3 = (p1+p2)/2;
var p2mod : Vector3 = (p0+p2)/2;
var pn0mod : Vector3 = ((pn0+pn1)/2).normalized;
var pn1mod : Vector3 = ((pn1+pn2)/2).normalized;
var pn2mod : Vector3 = ((pn0+pn2)/2).normalized;
var pu0mod : Vector2 = (pu0+pu1)/2;
var pu1mod : Vector2 = (pu1+pu2)/2;
var pu2mod : Vector2 = (pu0+pu2)/2;
var p0modtrigwho = nv.length;
var p1modtrigwho = nv.length+1;
var p2modtrigwho = nv.length+2;
nv.push(p0mod);
nv.push(p1mod);
nv.push(p2mod);
nn.push(pn0mod);
nn.push(pn1mod);
nn.push(pn2mod);
nu.push(pu0mod);
nu.push(pu1mod);
nu.push(pu2mod);
nt[p0trigwhere] = p0trigwho;
nt[p1trigwhere] = p0modtrigwho;
nt[p2trigwhere] = p2modtrigwho;
nt.push(p0modtrigwho);
nt.push(p1modtrigwho);
nt.push(p2modtrigwho);
nt.push(p0modtrigwho);
nt.push(p1trigwho);
nt.push(p1modtrigwho);
nt.push(p2modtrigwho);
nt.push(p1modtrigwho);
nt.push(p2trigwho);
}
}
else
{
for(var ii : int = 2; ii < trigs.length; ii += 3)
{
var p0trigwhomi : int = trigs[ii-2];
var p1trigwhomi : int = trigs[ii-1];
var p2trigwhomi : int = trigs[ii];
var p0trigwheremi : int = ii-2;
var p1trigwheremi : int = ii-1;
var p2trigwheremi : int = ii;
var p0mi : Vector3 = verts [p0trigwhomi];
var p1mi : Vector3 = verts [p1trigwhomi];
var p2mi : Vector3 = verts [p2trigwhomi];
var p0mn : Vector3 = norms [p0trigwhomi];
var p1mn : Vector3 = norms [p1trigwhomi];
var p2mn : Vector3 = norms [p2trigwhomi];
var p0mu : Vector2 = uvs [p0trigwhomi];
var p1mu : Vector2 = uvs [p1trigwhomi];
var p2mu : Vector2 = uvs [p2trigwhomi];
var p0modmi : Vector3 = (p0mi+p1mi+p2mi)/3;
var p0modmn : Vector3 = ((p0mn+p1mn+p2mn)/3).normalized;
var p0modmu : Vector2 = (p0mu+p1mu+p2mu)/3;
var p0modtrigwhomi = nv.length;
nv.push(p0modmi);
nn.push(p0modmn);
nu.push(p0modmu);
nt [p0trigwheremi] = p0trigwhomi;
nt [p1trigwheremi] = p1trigwhomi;
nt [p2trigwheremi] = p0modtrigwhomi;
nt.push(p0modtrigwhomi);
nt.push(p1trigwhomi);
nt.push(p2trigwhomi);
nt.push(p0trigwhomi);
nt.push(p0modtrigwhomi);
nt.push(p2trigwhomi);
}
}
verts = nv.ToBuiltin(Vector3);
norms = nn.ToBuiltin(Vector3);
uvs = nu.ToBuiltin(Vector2);
trigs = nt.ToBuiltin(int);
ApplyMesh ();
}
function ApplyUvs ()
{
uvs = new Vector2 [verts.length];
for (var i : int = 0; i < verts.length; i++)
{
uvs[i] = Vector2 (verts[i].x, verts[i].y);
}
}
function UpdateMesh ()
{
mesh = this.gameObject.GetComponent(MeshFilter).mesh;
}
function ApplyMesh ()
{
if(verts.length > 65000)
{
Debug.Log("Exiting... Too many vertices");
return;
}
mesh.Clear();
mesh.vertices = verts;
mesh.uv = uvs;
if(mesh.uv2 != null)
{
mesh.uv2 = uvs;
}
mesh.normals = norms;
mesh.triangles = trigs;
mesh.RecalculateBounds();
if(this.gameObject.GetComponent(MeshCollider) != null)
{
this.gameObject.GetComponent(MeshCollider).sharedMesh = mesh;
}
UpdateMesh ();
}
function CopyMesh (fromMesh : Mesh, toMesh : Mesh)
{
toMesh.Clear();
toMesh.vertices = fromMesh.vertices;
toMesh.normals = fromMesh.normals;
toMesh.uv = fromMesh.uv;
toMesh.triangles = fromMesh.triangles;
}
}
And here’s my errors:
-When I click “Subdivide-Edge” button
NullReferenceException: Object reference not set to an instance of an object
Boo.Lang.Runtime.RuntimeServices.GetDispatcher (System.Object target, System.String cacheKeyName, System.Type[ ] cacheKeyTypes, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
Boo.Lang.Runtime.RuntimeServices.GetDispatcher (System.Object target, System.Object[ ] args, System.String cacheKeyName, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
Boo.Lang.Runtime.RuntimeServices.Invoke (System.Object target, System.String name, System.Object[ ] args)
UnityScript.Lang.UnityRuntimeServices.Invoke (System.Object target, System.String name, System.Object[ ] args, System.Type scriptBaseType)
MeshRendererInspector.SubdividerAwake () (at Assets/Editor/KeenansCoolToolsScripts/KeenansCoolInspectorScripts/KeenansCoolMeshStuff.js:64)
MeshRendererInspector.OnInspectorGUI () (at Assets/Editor/KeenansCoolToolsScripts/KeenansCoolInspectorScripts/KeenansCoolMeshStuff.js:47)
UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor editor, Int32 editorIndex, Boolean forceDirty, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect, Boolean eyeDropperDirty) (at C:/BuildAgent/work/d63dfc6385190b60/Editor/Mono/Inspector/InspectorWindow.cs:1124)
UnityEditor.DockArea:OnGUI()
When I click “Subdivide-Center”: