protected virtual void Update() { switch (stateMachine.State) { case StateType.Arrived: return; } var node = GetComponent <Node2D>(); if (null == node) { return; } var distanceToTarget = AngleUtils.Distance(new Vector2(transform.position.x, transform.position.y), waypoint); if (distanceToTarget <= arriveDistance) { stateMachine.State = StateType.Arrived; node.Velocity = Vector2.zero; return; } var degreeAngle = AngleUtils.Vector2ToDegreeAngle(new Vector2(waypoint.x - transform.position.x, waypoint.y - transform.position.y)); node.Velocity = AngleUtils.DegreeAngleToVector2(degreeAngle, velocity); switch (orientType) { case OrientType.Rotate: node.RotationDegreeAngle = degreeAngle; break; } }
public void OnInputMove(InputAction.CallbackContext context) { if (null == node) { return; } // Don't use Node2D Velocity (it is constant). Use rigidbody velocity, which decays // This results in more fluid movement node.VelocityType = Node2D.MoveType.None; //Debug.Log("Input Move: " + context.ToString()); var angleAxisLimiter = new AngleAxisLimiter2D(axisLimit); var rigidbody = node.GetComponent <Rigidbody2D>(); var axisVector = context.ReadValue <Vector2>(); var angle = AngleUtils.Vector2ToDegreeAngle(axisVector); var distance = AngleUtils.Distance(Vector2.zero, axisVector); if (distance <= deadZone) { rigidbody.velocity = Vector2.zero; return; } var factor = (distance - deadZone) / (1.0f - deadZone); var interpolatedFactor = interpolate.Transform(factor); var moveSpeed = minMoveSpeed + ((maxMoveSpeed - minMoveSpeed) * interpolatedFactor); var limitedAngle = angleAxisLimiter.LimitAngle(angle); var velocity = AngleUtils.DegreeAngleToVector2(limitedAngle, moveSpeed); rigidbody.velocity = velocity; }
protected override Vector3 SpawnPositionFor(GameObject gameObject) { float distance = RandomUtils.VaryFloat(0, 1.0f) * radius; float angle = random.Value * 360.0f; Vector2 offset = AngleUtils.DegreeAngleToVector2(angle, 1.0f) * distance; var result = new Vector3(offset.x, offset.y, 0); return(result); }
/// <summary> /// Perform a sweep check for occluders, moving from the target's center, outward /// until the target is no longer hit by the sweep, or until we have reached degreeAngleSweep from center /// </summary> protected virtual CheckOccludersResult SweepCheckOccluders(GameObject target, float startDegreeAngle, float degreeAngleSweep, bool exitIfTargetNotIn) { if (occluderTypes.Count <= 0 || degreeAngleSweep == 0) { return(CheckOccludersResult.CanSeeTarget); } if (occluderCheckAngleStep <= 0) { return(CheckOccludersResult.CanSeeTarget); } var step = degreeAngleSweep < 0 ? -occluderCheckAngleStep : occluderCheckAngleStep; int numSteps = Mathf.RoundToInt(Mathf.Ceil(Mathf.Abs(degreeAngleSweep) / occluderCheckAngleStep)); var angle = startDegreeAngle; while (numSteps > 0) { var canSeeResult = CanSeeTarget(AngleUtils.DegreeAngleToVector2(angle, MaxOccluderRaycastDistance), target); switch (canSeeResult) { // We have swept past the target, it was not seen case CanSeeResult.TargetNotIn: // Some sensors start from the object's center and can exit early if the target is not in the current sweep // Other sensors check an angle range and need to perform the entire sweep if (exitIfTargetNotIn) { //Debug.Log("Sweep Target Not In: " + angle); return(CheckOccludersResult.TargetOccluded); } break; case CanSeeResult.CanSeeTarget: //Debug.Log("Sweep Can See: " + angle); return(CheckOccludersResult.CanSeeTarget); } numSteps -= 1; angle += step; // We are using fractional steps, so we might have passed the final angle if (degreeAngleSweep > 0) { angle = Mathf.Min(startDegreeAngle + degreeAngleSweep, angle); } else { angle = Mathf.Max(startDegreeAngle + degreeAngleSweep, angle); } } return(CheckOccludersResult.TargetOccluded); }
public override Mesh BuildMesh(Mesh mesh) { int meshVertexCount = MeshVertexCount; var vertices = new Vector3[meshVertexCount]; var trianglesSize = SegmentCount * 6; var triangles = new int[trianglesSize]; var uvSize = meshVertexCount; var uv = new Vector2[uvSize]; // Outer frame var meshVertexIndex = 0; for (int i = 0; i < SegmentCount; i++) { var vertex = polygon.vertices[i]; var nextVertex = polygon.vertices[(i + 1) % polygon.vertices.Count]; var angleVector = new Vector2(nextVertex.x - vertex.x, nextVertex.y - vertex.y); //Debug.Log("Angle Vector: " + angleVector.ToString()); var degreeAngle = AngleUtils.Vector2ToDegreeAngle(angleVector); //Debug.Log("Degree Angle: " + degreeAngle.ToString()); var outerOffset = AngleUtils.DegreeAngleToVector2(degreeAngle - 90.0f, strokeWidth / 2.0f); var innerOffset = AngleUtils.DegreeAngleToVector2(degreeAngle + 90.0f, strokeWidth / 2.0f); //Debug.Log("Outer Offset: " + outerOffset.ToString()); //Debug.Log("Inner Offset: " + innerOffset.ToString()); // Outer frame // FUTURE: support proper stroke in Z-space (only 2D space stroke width is properly supported) vertices[meshVertexIndex + 0] = vertex + new Vector3(innerOffset.x, innerOffset.y, 0); vertices[meshVertexIndex + 1] = nextVertex + new Vector3(innerOffset.x, innerOffset.y, 0); vertices[meshVertexIndex + 2] = vertex + new Vector3(outerOffset.x, outerOffset.y, 0); vertices[meshVertexIndex + 3] = nextVertex + new Vector3(outerOffset.x, outerOffset.y, 0); meshVertexIndex += 4; } var center = polygon.Center; var size = polygon.Size; if (size.x > 0 && size.y > 0) { for (int i = 0; i < uvSize; i++) { var vertex = vertices[i]; var distanceFromCenter = vertex - center; var ratio = new Vector2((distanceFromCenter.x + size.x / 2.0f) / size.x, (distanceFromCenter.y + size.y / 2.0f) / size.y); uv[i] = ratio; } } else { for (int i = 0; i < uvSize; i++) { uv[i] = Vector2.zero; } } var t = 0; meshVertexIndex = 0; for (int i = 0; i < SegmentCount; i++) { triangles[t] = meshVertexIndex; triangles[t + 1] = meshVertexIndex + 2; triangles[t + 2] = meshVertexIndex + 1; triangles[t + 3] = meshVertexIndex + 2; triangles[t + 4] = meshVertexIndex + 3; triangles[t + 5] = meshVertexIndex + 1; meshVertexIndex += 4; t += 6; } UpdateMesh(mesh, vertices, triangles, uv); return(mesh); }
public Vector2 UVFor(float degreeAngle) { var vector = AngleUtils.DegreeAngleToVector2(degreeAngle, 1.0f); return(new Vector2((vector.x + 1.0f) / 2.0f, (vector.y + 1.0f) / 2.0f)); }
public Vector3 MeshVertexFor(float degreeAngle) { var vector = AngleUtils.DegreeAngleToVector2(degreeAngle, 1.0f); return(new Vector3(vector.x * worldSize.x / 2.0f, vector.y * worldSize.y / 2.0f, 0)); }
public Vector3 PositionAt(float position) { var result = AngleUtils.DegreeAngleToVector2(position * 360.0f, radius); return(result); }
public Vector2 ToVector2() { return(AngleUtils.DegreeAngleToVector2(this.angle * 360.0f, this.magnitude)); }
public void TestAngleUtils() { float sqrt2 = Mathf.Sqrt(2); float distX = 1; float distY = 1 * Vector2.down.y; float hyp = AngleUtils.Hypotenuse(distX, distY); Assert.AreEqual(hyp, sqrt2, .01); hyp = AngleUtils.SquaredHypotenuse(distX, distY); Assert.AreEqual(hyp, 2, .01); Vector2 adjOpp = AngleUtils.DegreeAngleToVector2(45, sqrt2); Assert.AreEqual(adjOpp.x, 1, .01); Assert.AreEqual(adjOpp.y, 1 * Vector2.up.y, .01); Assert.AreEqual(AngleUtils.DegreeAngleOppToHyp(45, 1), sqrt2, .01); adjOpp = AngleUtils.DegreeAngleToVector2(135, sqrt2); Assert.AreEqual(adjOpp.x, 1, .01); Assert.AreEqual(adjOpp.y, 1 * Vector2.down.y, .01); adjOpp = AngleUtils.DegreeAngleToVector2(225, sqrt2); Assert.AreEqual(adjOpp.x, -1, .01); Assert.AreEqual(adjOpp.y, 1 * Vector2.down.y, .01); adjOpp = AngleUtils.DegreeAngleToVector2(315, sqrt2); Assert.AreEqual(adjOpp.x, -1, .01); Assert.AreEqual(adjOpp.y, 1 * Vector2.up.y, .01); // IMPORTANT: the angle specified is away from the 0 degree, *not* from the x-coordinate line. // 60 degrees rotated away from origin 0 is a 30 degree right triangle. adjOpp = AngleUtils.DegreeAngleToVector2(60, 1); Assert.AreEqual(adjOpp.x, .866, .01); Assert.AreEqual(adjOpp.y, .5 * Vector2.up.y, .01); { float firstDeg = 180; float finalDeg = 45; float turnDeg = AngleUtils.GetClosestDegreeTurn(firstDeg, finalDeg); Assert.AreEqual(-135, turnDeg, .01); } { float firstDeg = 45; float finalDeg = 180; float turnDeg = AngleUtils.GetClosestDegreeTurn(firstDeg, finalDeg); Assert.AreEqual(135, turnDeg, .01); } Vector2 distance; float angle; distance.x = 0; distance.y = 0; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(0, angle); distance.x = 0; distance.y = 10 * Vector2.up.y; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(0, angle, .001f); distance.x = 10; distance.y = 0; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(90, angle, .001f); distance.x = 0; distance.y = 10 * Vector2.down.y; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(180, angle, .001f); distance.x = -10; distance.y = 0; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(270, angle, .001f); distance.x = 10; distance.y = 10 * Vector2.up.y; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(45, angle, .001f); distance.x = 10; distance.y = 10 * Vector2.down.y; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(135, angle, .001f); distance.x = -10; distance.y = 10 * Vector2.down.y; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(225, angle, .001f); distance.x = -10; distance.y = 10 * Vector2.up.y; angle = AngleUtils.Vector2ToDegreeAngle(distance); Assert.AreEqual(315, angle, .001f); }