private void SetLayerTo(int newLayer) { standing = true; if (newLayer != currentLayer) { //handle move to new layer LayerDependantTracker.RemoveObjectFromLayer(gameObject, currentLayer); currentLayer = newLayer; LayerDependantTracker.AddObjectToLayer(gameObject, newLayer); } }
void FixedUpdate() { Vector2 grav = gameObject.GetComponent <GravityManager>().GetGravityVector2(); position2D = new Vector2(transform.position.x, transform.position.y); transformUp = new Vector2(-grav.x, -grav.y); transformRight = new Vector2(-grav.y, grav.x); DoubleRaycastDownToGround(groundRayLength, collisionLayerMask, groundHitInfo); DoubleRaycastDownToRight(rightRayLength, collisionLayerMask, out RaycastHit2D rightLeftHitInfo, out RaycastHit2D rightRightHitInfo); DoubleRaycastDownToLeft(leftRayLength, collisionLayerMask, out RaycastHit2D leftLeftHitInfo, out RaycastHit2D leftRightHitInfo); DoubleRaycastDownToCeiling(ceilingRayLength, collisionLayerMask, out RaycastHit2D ceilingLeftHitInfo, out RaycastHit2D ceilingRightHitInfo); //tracks the most recent layer we collided with int recentHitLayer = 0; standing = false; int groundHitCount = 0; foreach (var hit in groundHitInfo) { if (hit) { recentHitLayer = hit.transform.gameObject.layer; groundHitCount++; } } if (groundHitCount > numberOfRay * 0.5f) { onGround = true; SetLayerTo(recentHitLayer); } else { onGround = false; } if (ceilingLeftHitInfo && ceilingRightHitInfo) { onCeiling = true; SetLayerTo(ceilingLeftHitInfo.transform.gameObject.layer); } else { onCeiling = false; } if (rightLeftHitInfo || rightRightHitInfo) { onRightWall = true; RaycastHit2D correctHitInfo = rightLeftHitInfo ? rightLeftHitInfo : rightRightHitInfo; SetLayerTo(correctHitInfo.transform.gameObject.layer); } else { onRightWall = false; } if (leftLeftHitInfo || leftRightHitInfo) { onLeftWall = true; RaycastHit2D correctHitInfo = leftLeftHitInfo ? leftLeftHitInfo : leftRightHitInfo; SetLayerTo(correctHitInfo.transform.gameObject.layer); } else { onLeftWall = false; } onWall = onLeftWall || onRightWall; if (onGround && onLeftWall) { correctVector2 = (leftLeftHitInfo.point - (position2D - transformUp * leftRayOffsetBottom + leftRayLength * -transformRight)); } //if we're no longer standing, remove ourselves from the current layer if (standing == false && currentLayer != 0) { LayerDependantTracker.RemoveObjectFromLayer(gameObject, currentLayer); currentLayer = 0; } Debug.DrawRay(transform.position, transform.forward, Color.black, 5f); }