public void SpawnObstacle(Vector2 startPosition, Vector2 endPosition) { Vector2 spawnPosition = (startPosition + endPosition) / 2; Vector2 direction = endPosition - startPosition; float length = direction.magnitude; Transform newObstacle = Instantiate(obstacle, spawnPosition, QuaternionExtension.RotateToDirection(direction, -90)).transform; newObstacle.localScale = new Vector3(newObstacle.localScale.x, length, newObstacle.localScale.z); }
private void ProcessDestinationMode(float progress) { if (isFirstUpdate) { originalOrientation = movementComponent.Orientation; Vector3 desired = Vector3.right; switch (destinationRotationMode.ShowFacingDirection()) { case FacingDirection.Enemy: Character enemy = FindEnemy(); MovementComponent enemyMovementComponent = enemy.GameObject().GetComponent <EntityReference>().Entity .GetComponent <MovementComponent>(); Vector3 clampedEnemyPos = enemyMovementComponent.PositionV3.CloneWithNewY(movementComponent.Position.y); desired = clampedEnemyPos - movementComponent.PositionV3; break; case FacingDirection.Left: desired = Vector3.left; break; case FacingDirection.Right: desired = Vector3.right; break; } Vector3 facing = movementComponent.Orientation * Vector3.right; deltaQuaternion = Quaternion.FromToRotation(facing, desired); destinationQuaternion = originalOrientation * deltaQuaternion; float deltaAngle = Vector3.Angle(facing, desired); float dotProduct = Quaternion.Dot(originalOrientation, destinationQuaternion); if (dotProduct < 0) //longer rotation path detected, switch to shorter path { originalOrientation = originalOrientation.ScalarMultiply(-1); deltaQuaternion = deltaQuaternion.ScalarMultiply(-1); } if (deltaAngle > destinationRotationMode.maxAngle) { deltaAngle = destinationRotationMode.maxAngle; Vector3 axis = Vector3.up; float outAngle = 0; deltaQuaternion.ToAngleAxis(out outAngle, out axis); deltaQuaternion = Quaternion.AngleAxis(deltaAngle, axis); destinationQuaternion = originalOrientation * deltaQuaternion; } } movementComponent.SetOrientation( QuaternionExtension.Interpolate( originalOrientation, destinationQuaternion, interpolator, progress, true ) ); if (progress >= 1) { movementComponent.SetOrientation(destinationQuaternion); } }
private void StickToGround() { int hitCount = Physics2D.Raycast(transform.position, -transform.up, m_ContactFilter2D, m_HitResults, m_BoxCollider2D.bounds.extents.y + castDistance); Debug.DrawRay(transform.position, -transform.up * (m_BoxCollider2D.bounds.extents.y + castDistance)); if (hitCount > 0) { transform.rotation = Quaternion.Slerp(transform.rotation, QuaternionExtension.RotateToDirection(m_HitResults[0].normal, -90), 5f * Time.deltaTime); } else { transform.rotation = Quaternion.Slerp(transform.rotation, QuaternionExtension.RotateToDirection(Vector3.down, 90), 5f * Time.deltaTime); } }
internal void PostStepUpdate() { transform.position = body.GetPosition(); transform.rotation = QuaternionExtension.FromAngle2D(body.GetAngle()); }