static PhysicsCollider CreateTerrainCollider(TerrainData terrainData, CollisionFilter filter) { var physicsCollider = new PhysicsCollider(); try { var size = new int2(terrainData.heightmapResolution, terrainData.heightmapResolution); var scale = terrainData.heightmapScale; var colliderHeights = new NativeArray <float>(terrainData.heightmapResolution * terrainData.heightmapResolution, Allocator.TempJob); var terrainHeights = terrainData.GetHeights(0, 0, terrainData.heightmapResolution, terrainData.heightmapResolution); for (int j = 0; j < size.y; j++) { for (int i = 0; i < size.x; i++) { var h = terrainHeights[i, j]; colliderHeights[j + i * size.x] = h; } } physicsCollider.Value = TerrainCollider.Create(colliderHeights, size, scale, TerrainCollider.CollisionMethod.Triangles, filter); colliderHeights.Dispose(); } catch (Exception e) { } return(physicsCollider); }
public override void CreateScene(TerrainDemoScene sceneSettings) { // Make heightfield data NativeArray <float> heights; int2 size; float3 scale; bool simple = false; #if UNITY_ANDROID || UNITY_IOS simple = true; #endif bool flat = false; bool mountain = false; if (simple) { size = new int2(2, 2); scale = new float3(25, 0.1f, 25); heights = new NativeArray <float>(size.x * size.y * UnsafeUtility.SizeOf <float>(), Allocator.Temp); heights[0] = 1; heights[1] = 0; heights[2] = 0; heights[3] = 1; } else { size = new int2(sceneSettings.SizeX, sceneSettings.SizeZ); scale = new float3(sceneSettings.ScaleX, sceneSettings.ScaleY, sceneSettings.ScaleZ); float period = 50.0f; heights = new NativeArray <float>(size.x * size.y * UnsafeUtility.SizeOf <float>(), Allocator.Temp); for (int j = 0; j < size.y; j++) { for (int i = 0; i < size.x; i++) { float a = (i + j) * 2.0f * (float)math.PI / period; heights[i + j * size.x] = flat ? 0.0f : math.sin(a); if (mountain) { float fractionFromCenter = 1.0f - math.min(math.length(new float2(i - size.x / 2, j - size.y / 2)) / (math.min(size.x, size.y) / 2), 1.0f); float mountainHeight = math.smoothstep(0.0f, 1, fractionFromCenter) * 25.0f; heights[i + j * size.x] += mountainHeight; } } } } // static terrain Entity staticEntity; { var collider = sceneSettings.BuildTerrainMesh ? CreateMeshTerrain(heights, new int2(sceneSettings.SizeX, sceneSettings.SizeZ), new float3(sceneSettings.ScaleX, sceneSettings.ScaleY, sceneSettings.ScaleZ)) : TerrainCollider.Create(heights, size, scale, sceneSettings.Method); CreatedColliders.Add(collider); if (sceneSettings.BuildCompoundTerrain) { var numChildren = sceneSettings.NumChildren; var instances = new NativeArray <CompoundCollider.ColliderBlobInstance>(numChildren, Allocator.Temp); for (int i = 0; i < numChildren; i++) { instances[i] = new CompoundCollider.ColliderBlobInstance { Collider = collider, CompoundFromChild = new RigidTransform { pos = new float3((i % 2) * scale.x * (size.x - 1), 0.0f, (i / 2) * scale.z * (size.y - 1)), rot = quaternion.identity } }; } collider = Unity.Physics.CompoundCollider.Create(instances); CreatedColliders.Add(collider); instances.Dispose(); } float3 position = new float3(size.x - 1, 0.0f, size.y - 1) * scale * -0.5f; staticEntity = CreateStaticBody(position, quaternion.identity, collider); } }