Ejemplo n.º 1
0
    public Transform CreateNewGeometryAt(float startX)
    {
        GameObject holder = new GameObject("Terrain_" + startX);

        holder.transform.parent = this.transform;

        for (int i = 0; i < SEGMENTS_PER_GROUP; i++)
        {
            // Calculating the start and end points is pretty easy using Unity's built in perlin noise:
            float   x          = startX + i * lengthPerSegment;
            Vector3 startPoint = new Vector2(x, GetY(x));
            Vector3 endPoint   = new Vector2(x + lengthPerSegment, GetY(x + lengthPerSegment));

            // We can draw a line pretty simply to see our terrain:
            Debug.DrawLine(startPoint, endPoint, i % 2 == 1 ? Color.blue : Color.red, 10f);

            // But we want to rotate and resize default Unity cubes to match these endpoints, so we need some math...
            // Segment length is used as the scale.
            Vector3 delta         = endPoint - startPoint;
            float   segmentLength = delta.magnitude;

            // find the rotation:
            Quaternion rot = Quaternion.FromToRotation(Vector3.right, delta);

            // determine center position of segment:
            Vector3 center = startPoint + delta / 2f;

            GameObject segment = Instantiate(terrainChunkPrefab, center, rot) as GameObject;
            segment.transform.localScale = new Vector3(segmentLength, 1f, 1f);
            Chipmunk.UpdatedTransform(segment);

            // That's all we need to do! If you want, you can edit the Chipmunk Shape like this:
            ChipmunkSegmentShape shape = segment.GetComponent <ChipmunkSegmentShape>();
            shape.friction = 1.5f;
            // and anything else you might want to do with the shape...

            // Parent the new object.
            segment.transform.parent = holder.transform;
        }


        return(holder.transform);
    }
    public void OnSceneGUI()
    {
        ChipmunkSegmentShape seg = target as ChipmunkSegmentShape;

        if (seg != null)
        {
            SetupUndo("edited ChipmunkSegmentShape");
            Transform t = seg.transform;

            Vector3 endPoint1 = t.TransformPoint(seg.center + seg.endPoint);
            Vector3 endPoint2 = t.TransformPoint(seg.center - seg.endPoint);

            Vector2 endPoint1Delta = CircleHandle(endPoint1) - (Vector2)endPoint1;
            Vector2 endPoint2Delta = CircleHandle(endPoint2) - (Vector2)endPoint2;

            if (endPoint1Delta != Vector2.zero || endPoint2Delta != Vector2.zero)
            {
                endPoint1 = endPoint1 + (Vector3)endPoint1Delta;
                endPoint2 = endPoint2 + (Vector3)endPoint2Delta;

                Vector2 center = Vector2.Lerp(endPoint1, endPoint2, 0.5f);
                seg.center   = t.InverseTransformPoint(center);
                seg.endPoint = t.InverseTransformPoint(endPoint1) - t.InverseTransformPoint(center);

                EditorUtility.SetDirty(target);
            }

            float maxScale    = seg._maxScale;
            float radius      = seg.radius;
            float radiusDelta = (
                Handles.RadiusHandle(t.rotation, endPoint1, radius * maxScale, false) / maxScale +
                Handles.RadiusHandle(t.rotation, endPoint2, radius * maxScale, false) / maxScale -
                2f * radius
                );

            if (radiusDelta != 0f)
            {
                seg.radius += radiusDelta;
                EditorUtility.SetDirty(target);
            }
        }
    }