Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
        }
    }