public void Zoom(Vector2 globalFocalPoint, float zoomLevel) { zoomLevel_ = zoomLevel; float min = -3000; float max = 3000; float width = max - min; float height = max - min; float oldScale = gameLayer.scale; float newScale = zoomLevel_; Vector2 globalLayerZero = gameLayer.LocalToGlobal(Vector2.zero); Vector2 globalLayerOriginBeforeScale = new Vector2(globalLayerZero.x + min * oldScale, globalLayerZero.y + min * oldScale); Vector2 globalLayerOriginAfterScale = new Vector2(globalLayerZero.x + min * newScale, globalLayerZero.y + min * newScale); Vector2 ratioOfFocusToOrigin = new Vector2((globalFocalPoint.x - globalLayerOriginBeforeScale.x) / (width * oldScale), (globalFocalPoint.y - globalLayerOriginBeforeScale.y) / (height * oldScale)); Vector2 globalFocusAfterScale = new Vector2(globalLayerOriginAfterScale.x + ratioOfFocusToOrigin.x * width * newScale, globalLayerOriginAfterScale.y + ratioOfFocusToOrigin.y * height * newScale); Vector2 deltaPoint = new Vector2(globalFocalPoint.x - globalFocusAfterScale.x, globalFocalPoint.y - globalFocusAfterScale.y); gameLayer.scale = newScale; float newX = gameLayer.x + deltaPoint.x; float newY = gameLayer.y + deltaPoint.y; gameLayer.x = newX; gameLayer.y = newY; }