private void GenerateMesh() { UOUtility.DestroyChildren(generated); _bounds = new Bounds(); int i = 0; float textureOffset = 0.0f; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("segment " + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(ExtrusionSegment), typeof(MeshCollider)); go.GetComponent <MeshRenderer>().material = material; ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>(); mb.SetShapeVertices(shapeVertices, false); mb.SetLoopAround(loopAround, false); mb.SetTextureScale(textureScale, false); mb.SetCurve(curve, true); mb.SetTextureOffset(textureOffset, true); textureOffset += curve.Length; _bounds.Encapsulate(go.GetComponent <MeshFilter>().sharedMesh.bounds); } }
private void GenerateMesh() { UOUtility.DestroyChildren(generated); int i = 0; float textureOffset = 0.0f; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("segment " + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(ExtrusionSegment), typeof(MeshCollider)); go.isStatic = true; // TODO Changed go.GetComponent <MeshRenderer>().material = material; ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>(); mb.ShapeVertices = shapeVertices; mb.TextureScale = textureScale; mb.TextureOffset = textureOffset; mb.SampleSpacing = sampleSpacing; mb.SetInterval(curve); textureOffset += curve.Length; } }
private void Generate() { UOUtility.DestroyChildren(Generated); wayPoints.Clear(); float localSpacing = 0; Joint joint = null; for (int i = 0; i < segmentCount; i++) { var seg = UOUtility.Instantiate(segmentPrefab, Generated.transform); seg.transform.Translate(0, 0, localSpacing); var segRB = seg.GetComponent <Rigidbody>(); // we fix the first segment so that the rope won't fall if (i == 0) { firstSegment = seg; segRB.constraints = RigidbodyConstraints.FreezePosition; } // we attach the rigidbody to the joint of the previous segment if (joint != null) { joint.connectedBody = segRB; } joint = seg.GetComponent <Joint>(); // we save segments as way points for the spline deformation. wayPoints.Add(seg); localSpacing += segmentSpacing; } UOUtility.Destroy(joint); }
public void Sow() { UOUtility.DestroyChildren(generated); UnityEngine.Random.InitState(randomSeed); if (spacing + spacingRange <= 0 || prefab == null) { return; } float distance = 0; while (distance <= spline.Length) { CurveSample sample = spline.GetSampleAtDistance(distance); GameObject go; if (Application.isPlaying) { go = Instantiate(prefab, generated.transform); } else { go = (GameObject)UnityEditor.PrefabUtility.InstantiatePrefab((UnityEngine.Object)prefab); go.transform.parent = generated.transform; } go.transform.localRotation = Quaternion.identity; go.transform.localPosition = Vector3.zero; go.transform.localScale = Vector3.one; // move along spline, according to spacing + random go.transform.localPosition = sample.location; // apply scale + random float rangedScale = scale + UnityEngine.Random.Range(0, scaleRange); go.transform.localScale = new Vector3(rangedScale, rangedScale, rangedScale); // rotate with random yaw if (isRandomYaw) { go.transform.Rotate(0, 0, UnityEngine.Random.Range(-180, 180)); } else { go.transform.rotation = sample.Rotation; } // move orthogonaly to the spline, according to offset + random Vector3 binormal = sample.tangent; binormal = Quaternion.LookRotation(Vector3.right, Vector3.up) * binormal; var localOffset = offset + UnityEngine.Random.Range(0, offsetRange * Math.Sign(offset)); localOffset *= sample.scale.x; binormal *= localOffset; go.transform.position += binormal; distance += spacing + UnityEngine.Random.Range(0, spacingRange); } }
public void CreateMeshes() { UOUtility.DestroyChildren(generated); int i = 0; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("SplineMesh" + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshBender)); go.GetComponent <MeshRenderer>().material = material; MeshBender mb = go.GetComponent <MeshBender>(); mb.Source = mesh; mb.Rotation = Quaternion.Euler(rotation); mb.Curve = curve; mb.ComputeIfNeeded(); } }
private void GenerateMesh() { UOUtility.DestroyChildren(generated); int i = 0; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("segment " + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(ExtrusionSegment), typeof(MeshCollider)); go.GetComponent <MeshRenderer>().material = material; ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>(); mb.SetShapeVertices(shapeVertices, false); mb.SetTextureScale(textureScale, false); mb.SetCurve(curve, true); } }
protected void GenerateMesh() { UOUtility.DestroyChildren(generated); int i = 0; float textureOffset = 0.0f; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("segment " + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(ExtrusionSegment), typeof(MeshCollider)); MeshRenderer goRenderer = go.GetComponent <MeshRenderer>(); goRenderer.material = material; ExtrusionSegment seg = go.GetComponent <ExtrusionSegment>(); seg.ShapeVertices = shapeVertices; seg.TextureScale = textureScale; seg.TextureOffset = textureOffset; seg.SampleSpacing = sampleSpacing; seg.SetInterval(curve); goRenderer.enabled = visible; if (go.TryGetComponent(out MeshCollider meshCollider)) { meshCollider.enabled = collisionEnabled; } int layerNum = LayerMask.NameToLayer(layer); if (layerNum > -1) { go.gameObject.layer = layerNum; } textureOffset += curve.Length; } }
public void Sow() { UOUtility.DestroyChildren(generated); UnityEngine.Random.InitState(randomSeed); if (spacing + spacingRange <= 0 || prefab == null) { return; } float distance = 0; while (distance <= spline.Length) { CurveSample sample = spline.GetSampleAtDistance(distance); if (heightSync) { var sampleLocationWS = spline.transform.TransformPoint(sample.location); RaycastHit hitInfo; if (Physics.Raycast(sampleLocationWS + Vector3.up * heightSyncTraceRange, -Vector3.up, out hitInfo, heightSyncTraceRange * 2, heightSyncLayerMask)) { var newSampleLocation = spline.transform.InverseTransformPoint(hitInfo.point); var newSampleUp = heightNormalSync ? spline.transform.InverseTransformDirection(hitInfo.normal) : sample.up; sample = new CurveSample(newSampleLocation, sample.tangent, newSampleUp, sample.scale, sample.roll, sample.distanceInCurve, sample.timeInCurve, sample.curve); } } GameObject go; go = Instantiate(prefab, generated.transform); go.transform.localRotation = Quaternion.identity; go.transform.localPosition = Vector3.zero; go.transform.localScale = Vector3.one; go.isStatic = false == updateInPlayMode; go.layer = gameObject.layer; foreach (var child in go.transform.Cast <Transform>()) { child.gameObject.layer = go.layer; } // move along spline, according to spacing + random go.transform.localPosition = sample.location; // apply scale + random float rangedScale = scale + UnityEngine.Random.Range(0, scaleRange); go.transform.localScale = new Vector3(rangedScale, rangedScale, rangedScale); // rotate with random yaw if (isRandomYaw) { go.transform.Rotate(0, 0, UnityEngine.Random.Range(-180, 180)); } else { go.transform.rotation = sample.Rotation; } // move orthogonaly to the spline, according to offset + random var binormal = (Quaternion.LookRotation(sample.tangent, sample.up) * Vector3.right).normalized; var localWidthOffset = widthOffset + UnityEngine.Random.Range(0, widthOffsetRange * Math.Sign(widthOffset)); var localHeightOffset = heightOffset + UnityEngine.Random.Range(0, heightOffsetRange * Math.Sign(heightOffset)); localWidthOffset *= sample.scale.x; binormal *= localWidthOffset; go.transform.position += binormal + sample.up * localHeightOffset; distance += spacing + UnityEngine.Random.Range(0, spacingRange); } }