Инструкции вида
[SerializeField] public float speed = 10f;
[SerializeField] public float jumpForce = 14f;
Не имеют смысла, так как оператор доступности public и так делает вашу переменную видимой в инспекторе, поэтому использование атрибута избыточно. Хуже не делает, просто бессмысленно. Атрибуты больше нужны, чтобы задать специфическое поведение для удобства редактирования игры. Например, вы не хотите давать другим классам прямой доступ к изменению скорости бега и силы прыжка персонажа - ставите приват, но чтобы в редакторе можно было потестить и выставить нужные значения (вы же не экстрасенс, чтобы с первого раза угадать), добавляют атрибут и получается:
[SerializeField] private float speed = 10f;
[SerializeField] private float jumpForce = 14f;
Второе уже относится больше к здравому смыслу - все запросы ввода лучше делать внутри Update, а обеспечением их доступности для метода FixedUpdate должна заниматься внутренняя переменная класса, типа:
private float xInput;
private void Update() {
xInput = Input.GetAxis("Horizontal");
// code
}
private void FixedUpdate() {
rb.velocity = new Vector2(xInput * speed, rb.velocity.y);
}