Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zendee
unregistriert
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
@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); } } |
Zendee
unregistriert
Zendee
unregistriert
Werbeanzeige