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