void IUpdatable.update()
{
if (isImmovable)
{
velocity = Vector2.Zero;
return;
}
if (shouldUseGravity)
{
velocity += Physics.gravity * Time.deltaTime;
}
entity.transform.position += velocity * Time.deltaTime;
CollisionResult collisionResult;
// fetch anything that we might collide with at our new position
var neighbors = Physics.boxcastBroadphaseExcludingSelf(_collider, _collider.collidesWithLayers);
foreach (var neighbor in neighbors)
{
// if the neighbor collider is of the same entity, ignore it
if (neighbor.entity == entity)
{
continue;
}
if (_collider.collidesWith(neighbor, out collisionResult))
{
// if the neighbor has an ArcadeRigidbody we handle full collision response. If not, we calculate things based on the
// neighbor being immovable.
var neighborRigidbody = neighbor.entity.getComponent <ArcadeRigidbody>();
if (neighborRigidbody != null)
{
processOverlap(neighborRigidbody, ref collisionResult.minimumTranslationVector);
processCollision(neighborRigidbody, ref collisionResult.minimumTranslationVector);
}
else
{
// neighbor has no ArcadeRigidbody so we assume its immovable and only move ourself
entity.transform.position -= collisionResult.minimumTranslationVector;
var relativeVelocity = velocity;
calculateResponseVelocity(
ref relativeVelocity,
ref collisionResult.minimumTranslationVector,
out relativeVelocity);
velocity += relativeVelocity;
}
}
}
}