UnityNinja Community
Would you like to react to this message? Create an account in a few clicks or log in to continue.

UnityNinja CommunityLog in

UnityNinja - Video Game Development Community, including Resources, Forums, Marketplace & More.


descriptionObject2Terrain Script EmptyObject2Terrain Script

more_horiz
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);
   }
}

descriptionObject2Terrain Script EmptyRe: Object2Terrain Script

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

descriptionObject2Terrain Script EmptyRe: Object2Terrain Script

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

descriptionObject2Terrain Script EmptyRe: Object2Terrain Script

more_horiz
privacy_tip Permissions in this forum:
You cannot reply to topics in this forum
power_settings_newLogin to reply