protected void updateToPosition(Vector3 in_position) { // keep the update positions on the same plane in_position.z = _playerController.m_playerPlane.transform.position.z; Transform planeTransform = _playerController.m_playerPlane.transform; Vector3 vectorToOpp = in_position - planeTransform.position; bool useRightVector = HudHelper.QuickAbs(vectorToOpp.x) > HudHelper.QuickAbs(vectorToOpp.y); Vector3 lineToMiddleUp = Vector3.Project(vectorToOpp, useRightVector ? Vector3.right : Vector3.up); float angleToVectorOpp = Vector3.Angle(vectorToOpp, useRightVector ? transform.right : transform.up); // works well going up and down if ((planeTransform.up.x * lineToMiddleUp.y) - (planeTransform.up.y * lineToMiddleUp.x) < 0) { angleToVectorOpp *= -1; } if (angleToVectorOpp > 0.0f) { _actionControl.PlayerOutputs.Add(ePlayerControllerInputs.LEFT); } else if (angleToVectorOpp < -0.0f) { _actionControl.PlayerOutputs.Add(ePlayerControllerInputs.RIGHT); } }