Unity Ninja Unity 3D Forum
To have exclusive access to all downloads, recourses and links within this forum, a free registered account is required. Just a heads up Wink

You are not connected. Please login or register

Unity Ninja Unity 3D Forum » FREE Project Downloads & Recources » Scripts » Object2Terrain Script

Object2Terrain Script

View previous topic View next topic Go down  Message [Page 1 of 1]

1 Object2Terrain Script on Sat Feb 07, 2015 9:37 am

OneKnifeGames


{SUPER MEMBER}-LV.4
{SUPER MEMBER}-LV.4
I have developed an Object to terrain script (obviously) and I wanted to share it with you guys. The purpose of the Object to terrain script is to make a selected model with a mesh into the terrain. It is in Javascript.
Code:
@MenuItem ("Terrain/Object to Terrain")
 
static function Object2Terrain () {
   // See if a valid object is selected
   var obj = Selection.activeObject as GameObject;
   if (obj == null) {
      EditorUtility.DisplayDialog("No object selected", "Please select an object.", "Cancel");
      return;
   }
   if (obj.GetComponent(MeshFilter) == null) {
      EditorUtility.DisplayDialog("No mesh selected", "Please select an object with a mesh.", "Cancel");
      return;
   }
   else if ((obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh == null) {
      EditorUtility.DisplayDialog("No mesh selected", "Please select an object with a valid mesh.", "Cancel");
      return;      
   }
   if (Terrain.activeTerrain == null) {
      EditorUtility.DisplayDialog("No terrain found", "Please make sure a terrain exists.", "Cancel");
      return;
   }   
   var terrain = Terrain.activeTerrain.terrainData;
 
   // If there's no mesh collider, add one (and then remove it later when done)
   var addedCollider = false;
   var addedMesh = false;
   var objCollider = obj.collider as MeshCollider;
   if (objCollider == null) {
      objCollider = obj.AddComponent(MeshCollider);
      addedCollider = true;
   }
   else if (objCollider.sharedMesh == null) {
      objCollider.sharedMesh = (obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh;
      addedMesh = true;
   }
 
   Undo.RegisterUndo (terrain, "Object to Terrain");
 
   var resolutionX = terrain.heightmapWidth;
   var resolutionZ = terrain.heightmapHeight;
   var heights = terrain.GetHeights(0, 0, resolutionX, resolutionZ);
 
   // Use bounds a bit smaller than the actual object; otherwise raycasting tends to miss at the edges
   var objectBounds = objCollider.bounds;
   var leftEdge = objectBounds.center.x - objectBounds.extents.x + .01;
   var bottomEdge = objectBounds.center.z - objectBounds.extents.z + .01;
   var stepX = (objectBounds.size.x - .019) / resolutionX;
   var stepZ = (objectBounds.size.z - .019) / resolutionZ;
 
   // Set up raycast vars
   var y = objectBounds.center.y + objectBounds.extents.y + .01;
   var hit : RaycastHit;
   var ray = new Ray(Vector3.zero, -Vector3.up);
   var rayDistance = objectBounds.size.y + .02;
   var heightFactor = 1.0 / rayDistance;
 
   // Do raycasting samples over the object to see what terrain heights should be
   var z = bottomEdge;
   for (zCount = 0; zCount < resolutionZ; zCount++) {
      var x = leftEdge;
      for (xCount = 0; xCount < resolutionX; xCount++) {
         ray.origin = Vector3(x, y, z);
         if (objCollider.Raycast(ray, hit, rayDistance)) {
            heights[zCount, xCount] = 1.0 - (y - hit.point.y)*heightFactor;
         }
         else {
            heights[zCount, xCount] = 0.0;
         }
         x += stepX;
      }
      z += stepZ;
   }
 
   terrain.SetHeights(0, 0, heights);
 
   if (addedMesh) {
      objCollider.sharedMesh = null;
   }
   if (addedCollider) {
      DestroyImmediate(objCollider);
   }
}

View user profile http://oneknifegames.weebly.com/

2 Re: Object2Terrain Script on Sun Feb 08, 2015 6:33 pm

Great share! Nice to see ya contributing in the community!

View user profile http://www.youtube.com/user/misterninjaboy

3 Re: Object2Terrain Script on Sun Feb 08, 2015 6:33 pm

Great share! Nice to see ya contributing in the community!

View user profile http://www.youtube.com/user/misterninjaboy

View previous topic View next topic Back to top  Message [Page 1 of 1]

Permissions in this forum:
You cannot reply to topics in this forum