/// <summary> /// Create the vertices of hose mesh. /// </summary> /// <param name="curve"></param> /// <param name="segments"></param> /// <param name="differ"></param> /// <param name="isSeal">Is seal at both ends of hose?</param> /// <returns>Vertices array.</returns> protected Vector3[] CreateVertices(IMonoCurve curve, int segments, float differ, bool isSeal = false) { var vertices = new List <Vector3>(); for (int i = 0; i < segments - 1; i++) { var len = differ * i; var node = curve.LocalEvaluate(len); var tangent = (curve.LocalEvaluate(len + differ) - node); vertices.AddRange(MeshBuildUtility.BuildPolygonVertices(polygon, radius, node, Quaternion.LookRotation(tangent))); } var lastNode = curve.LocalEvaluate(curve.Length); var lastTangent = (lastNode - curve.LocalEvaluate(curve.Length - differ)); vertices.AddRange(MeshBuildUtility.BuildPolygonVertices(polygon, radius, lastNode, Quaternion.LookRotation(lastTangent))); if (isSeal) { var polygonVertices = polygon + 1; vertices.Add(curve.LocalEvaluate(0)); vertices.AddRange(vertices.GetRange(0, polygonVertices)); var lastPolygonStart = polygonVertices * (segments - 1); vertices.Add(lastNode); vertices.AddRange(vertices.GetRange(lastPolygonStart, polygonVertices)); } return(vertices.ToArray()); }
/// <summary> /// Get segment count of mono curve. /// </summary> /// <param name="curve"></param> /// <param name="segment"></param> /// <param name="differ">Differentiation.</param> /// <returns>Detail count of mono curve.</returns> public static int GetSegmentCount(IMonoCurve curve, float segment, out float differ) { //AwayFromZero means that 12.5 -> 13 var count = (int)Math.Round(curve.Length / segment, MidpointRounding.AwayFromZero); count = Mathf.Max(count, 1); differ = curve.Length / count; return(count); }
/// <summary> /// Rebuild collider base curve. /// </summary> /// <param name="curve"></param> public override void Rebuild(IMonoCurve curve) { if (curve == null || curve.Length == 0) { Segments = 0; ClearCollider(); return; } RebuildCollider(curve); }
/// <summary> /// Rebuild renderer base curve. /// </summary> /// <param name="curve"></param> public override void Rebuild(IMonoCurve curve) { if (curve == null || curve.Length == 0) { Segments = 0; lineRenderer.SetVertexCount(0); return; } Segments = MonoCurveUtility.GetSegmentCount(curve, segment, out float differ) + 1; lineRenderer.SetVertexCount(Segments); for (int i = 0; i < Segments; i++) { lineRenderer.SetPosition(i, curve.LocalEvaluate(i * differ)); } }
/// <summary> /// Set capsule colliders. /// </summary> /// <param name="curve"></param> /// <param name="segments"></param> /// <param name="differ"></param> protected virtual void SetCapsules(IMonoCurve curve, int segments, float differ) { for (int i = 0; i < segments; i++) { var node = colliderGroup.GetChild(i); node.position = curve.Evaluate((i + 0.5f) * differ); var tangent = (curve.Evaluate((i + 1) * differ) - curve.Evaluate(i * differ)); node.LookAt(node.position + tangent); var capsule = node.GetComponent <CapsuleCollider>(); capsule.enabled = enabled; capsule.center = Vector3.zero; capsule.direction = 2; capsule.height = differ + radius * 2; capsule.radius = radius; capsule.isTrigger = isTrigger; capsule.material = material; } }
/// <summary> /// Rebuild collider for mono curve. /// </summary> protected override void RebuildCollider(IMonoCurve curve) { Segments = MonoCurveUtility.GetSegmentCount(curve, segment, out float differ); RequireCapsules(Segments); SetCapsules(curve, Segments, differ); }
/// <summary> /// Rebuild renderer base mono curve. /// </summary> /// <param name="curve"></param> public abstract void Rebuild(IMonoCurve curve);
/// <summary> /// [MESSAGE] On mono curve rebuild. /// </summary> /// <param name="curve"></param> private void OnMonoCurveRebuild(IMonoCurve curve) { Rebuild(curve); }
/// <summary> /// Rebuild renderer base curve. /// </summary> /// <param name="curve"></param> public override void Rebuild(IMonoCurve curve) { this.curve = curve; base.Rebuild(); }
/// <summary> /// Rebuild collider for mono curve. /// </summary> protected abstract void RebuildCollider(IMonoCurve curve);