public void FindCurrentSurface() { Collider2D groundCollider = this._CharacterController2D.GroundColliders[0]; if (groundCollider == null) { groundCollider = this._CharacterController2D.GroundColliders[1]; } if (groundCollider == null) { return; } TileBase b = PhysicsHelper.FindTileForOverride(groundCollider, transform.position, Vector2.down); if (b != null) { this._CurrentSurface = b; } }
/// <summary> /// This updates the state of IsGrounded. It is called automatically in FixedUpdate but can be called more frequently if higher accurracy is required. /// </summary> public void CheckCapsuleEndCollisions(bool bottom = true) { Vector2 raycastDirection; Vector2 raycastStart; float raycastDistance; if (m_Capsule == null) { raycastStart = m_Rigidbody2D.position + Vector2.up; raycastDistance = 1f + groundedRaycastDistance; if (bottom) { raycastDirection = Vector2.down; m_RaycastPositions[0] = raycastStart + Vector2.left * 0.4f; m_RaycastPositions[1] = raycastStart; m_RaycastPositions[2] = raycastStart + Vector2.right * 0.4f; } else { raycastDirection = Vector2.up; m_RaycastPositions[0] = raycastStart + Vector2.left * 0.4f; m_RaycastPositions[1] = raycastStart; m_RaycastPositions[2] = raycastStart + Vector2.right * 0.4f; } } else { raycastStart = m_Rigidbody2D.position + m_Capsule.offset; raycastDistance = m_Capsule.size.x * 0.5f + groundedRaycastDistance * 2f; if (bottom) { raycastDirection = Vector2.down; Vector2 raycastStartBottomCentre = raycastStart + Vector2.down * (m_Capsule.size.y * 0.5f - m_Capsule.size.x * 0.5f); m_RaycastPositions[0] = raycastStartBottomCentre + Vector2.left * m_Capsule.size.x * 0.5f; m_RaycastPositions[1] = raycastStartBottomCentre; m_RaycastPositions[2] = raycastStartBottomCentre + Vector2.right * m_Capsule.size.x * 0.5f; } else { raycastDirection = Vector2.up; Vector2 raycastStartTopCentre = raycastStart + Vector2.up * (m_Capsule.size.y * 0.5f - m_Capsule.size.x * 0.5f); m_RaycastPositions[0] = raycastStartTopCentre + Vector2.left * m_Capsule.size.x * 0.5f; m_RaycastPositions[1] = raycastStartTopCentre; m_RaycastPositions[2] = raycastStartTopCentre + Vector2.right * m_Capsule.size.x * 0.5f; } } for (int i = 0; i < m_RaycastPositions.Length; i++) { int count = Physics2D.Raycast(m_RaycastPositions[i], raycastDirection, m_ContactFilter, m_HitBuffer, raycastDistance); if (bottom) { m_FoundHits[i] = count > 0 ? m_HitBuffer[0] : new RaycastHit2D(); m_GroundColliders[i] = m_FoundHits[i].collider; } else { IsCeilinged = false; for (int j = 0; j < m_HitBuffer.Length; j++) { if (m_HitBuffer[j].collider != null) { if (!PhysicsHelper.ColliderHasPlatformEffector(m_HitBuffer[j].collider)) { IsCeilinged = true; } } } } } if (bottom) { Vector2 groundNormal = Vector2.zero; int hitCount = 0; for (int i = 0; i < m_FoundHits.Length; i++) { if (m_FoundHits[i].collider != null) { groundNormal += m_FoundHits[i].normal; hitCount++; } } if (hitCount > 0) { groundNormal.Normalize(); } Vector2 relativeVelocity = Velocity; for (int i = 0; i < m_GroundColliders.Length; i++) { if (m_GroundColliders[i] == null) { continue; } MovingPlatform movingPlatform; if (PhysicsHelper.TryGetMovingPlatform(m_GroundColliders[i], out movingPlatform)) { relativeVelocity -= movingPlatform.Velocity / Time.deltaTime; break; } } if (Mathf.Approximately(groundNormal.x, 0f) && Mathf.Approximately(groundNormal.y, 0f)) { IsGrounded = false; } else { IsGrounded = relativeVelocity.y <= 0f; if (m_Capsule != null) { if (m_GroundColliders[1] != null) { float capsuleBottomHeight = m_Rigidbody2D.position.y + m_Capsule.offset.y - m_Capsule.size.y * 0.5f; float middleHitHeight = m_FoundHits[1].point.y; IsGrounded &= middleHitHeight < capsuleBottomHeight + groundedRaycastDistance; } } } } for (int i = 0; i < m_HitBuffer.Length; i++) { m_HitBuffer[i] = new RaycastHit2D(); } }
static void Create() { GameObject physicsHelperGameObject = new GameObject("PhysicsHelper"); s_Instance = physicsHelperGameObject.AddComponent <PhysicsHelper> (); }