private void RecalculateGrindTriggers(GameObject go) { foreach (Transform transform in go.GetComponentsInChildren <Transform>()) { if (transform.name.Contains("GrindSpline") && !transform.name.Contains("Colliders")) { Transform grindColliders = go.transform.Find(transform.name + "Colliders").transform; Vector3[] grindPoints = new Vector3[transform.childCount]; SplinePoint[] splinePoints = new SplinePoint[grindPoints.Length]; for (int i = 0; i < grindPoints.Length; i++) { grindPoints[i] = transform.GetChild(i).position; splinePoints[i] = new SplinePoint(grindPoints[i]); } SplineComputer splineComputer = grindColliders.gameObject.GetComponent <SplineComputer>(); Vector3[] grindNormals = new Vector3[grindPoints.Length]; for (int i = 0; i < grindPoints.Length - 1; i++) { GameObject grindCollider = grindColliders.Find("RailCol" + i).gameObject; grindCollider.transform.position = grindPoints[i]; grindCollider.transform.LookAt(grindPoints[i + 1]); BoxCollider boxCollider = grindCollider.GetComponent <BoxCollider>(); float segmentLength = Vector3.Distance(grindPoints[i], grindPoints[i + 1]); boxCollider.size = new Vector3(0.08f / go.transform.lossyScale.x, 0.08f / go.transform.lossyScale.y, segmentLength); boxCollider.center = Vector3.forward * segmentLength / 2f; grindNormals[i] = grindCollider.transform.up; } grindNormals[grindNormals.Length - 1] = grindNormals[grindNormals.Length - 2]; splineComputer.SetPoints(splinePoints); splineComputer.Evaluate(0.9); for (int i = 0; i < grindPoints.Length; i++) { splineComputer.SetPointNormal(i, splineComputer.GetPointNormal(i, SplineComputer.Space.World) + grindNormals[i], SplineComputer.Space.World); } } if (transform.name.Contains("GrindCollider")) { transform.localScale = new Vector3(1f / go.transform.lossyScale.x, 1f / go.transform.lossyScale.y, 1f); } } }
public static bool BuildSplineComputer(GrindSegment segment) { // Create Spline Computer component and settings for GrindSpline Object SplineComputer sc = segment.grindRoot.gameObject.AddComponent <SplineComputer>(); sc.type = Spline.Type.Linear; sc.SetPoints(segment.points, SplineComputer.Space.World); sc.Evaluate(0.9); // Shift normal vectors up a position for spline points points segment.normals[segment.normals.Length - 1] = segment.normals[segment.normals.Length - 2]; // Set point normals for (int i = 0; i < segment.points.Length; i++) { sc.SetPointNormal(i, sc.GetPoint(i, SplineComputer.Space.World).normal + segment.normals[i], SplineComputer.Space.World); } return(true); }
private void AddGrindTriggers(GameObject go) { foreach (Transform transform in go.GetComponentsInChildren <Transform>()) { if (transform.name.Contains("GrindSpline")) { Transform grindColliders = new GameObject(transform.name + "Colliders").transform; grindColliders.parent = go.transform; grindColliders.gameObject.layer = 12; if (transform.name.Contains("Metal")) { transform.tag = "Metal"; } if (transform.name.Contains("Wood")) { transform.tag = "Wood"; } if (transform.name.Contains("Concrete")) { transform.tag = "Concrete"; } Vector3[] grindPoints = new Vector3[transform.childCount]; SplinePoint[] splinePoints = new SplinePoint[grindPoints.Length]; for (int i = 0; i < grindPoints.Length; i++) { grindPoints[i] = transform.GetChild(i).position; splinePoints[i] = new SplinePoint(grindPoints[i]); } SplineComputer splineComputer = grindColliders.gameObject.AddComponent <SplineComputer>(); splineComputer.type = Spline.Type.Linear; Vector3[] grindNormals = new Vector3[grindPoints.Length]; for (int i = 0; i < grindPoints.Length - 1; i++) { GameObject grindCollider = new GameObject("RailCol" + i); grindCollider.layer = 12; grindCollider.transform.position = grindPoints[i]; grindCollider.transform.LookAt(grindPoints[i + 1]); BoxCollider boxCollider = grindCollider.AddComponent <BoxCollider>(); float segmentLength = Vector3.Distance(grindPoints[i], grindPoints[i + 1]); boxCollider.size = new Vector3(0.08f / go.transform.lossyScale.x, 0.08f / go.transform.lossyScale.y, segmentLength); boxCollider.center = Vector3.forward * segmentLength / 2f; boxCollider.isTrigger = true; grindCollider.transform.parent = grindColliders; grindNormals[i] = grindCollider.transform.up; if (transform.name.Contains("Metal")) { grindCollider.tag = "Metal"; } if (transform.name.Contains("Wood")) { grindCollider.tag = "Wood"; } if (transform.name.Contains("Concrete")) { grindCollider.tag = "Concrete"; } } grindNormals[grindNormals.Length - 1] = grindNormals[grindNormals.Length - 2]; splineComputer.SetPoints(splinePoints); splineComputer.Evaluate(0.9); for (int i = 0; i < grindPoints.Length; i++) { splineComputer.SetPointNormal(i, splineComputer.GetPointNormal(i, SplineComputer.Space.World) + grindNormals[i], SplineComputer.Space.World); } } } }