Почему rb = gameObject.GetComponent();, а не rb = GetComponent();?
other.CompareTag() лучше чем tag == .
И зачем OnCollisionStay вместо OnCollisionEnter? Смысл проверять каждый раз и тратить ресурсы, так как по смыслу нужна только проверка на вход и на выход