alors,
déjà de 1, enlève le GetComponent<>() de l'update, avoir a l’appeler a chaque image est un gouffre a ressources(et donc une mauvaise habitude...qui deviendra un réflexe).
définit ton private CharacterController controller; au début et appelle le controler = GameObject.GetComponent<CharacterController>(); lors de la void Start().
voila maintenant pour ton cas, j'aimerais savoir ce que tu utilise pour animer: le classique Animation.Play(); ou bien un plugin comme 2DToolkit.
sinon pour t'aider (j’espère).
au début de ton script ajoute en dehors de la classe
public enum PlayerState { IDLE, MARCHE, COURSE, ....}
et dans ta classe definit un public PlayerState playerState;
le principe consiste a créer une pseudo-Finite State Machine pour ton personnage.
avec une void() qui va décider de quel état est le personnage. et dans ton script d'animation tu jouera tes animation selon le state.
regarde mes deux scripts qui gèrent les déplacements et animation d'un personnage de plateformes(j'ai essayé de commenter en français):
Movements: http://pastebin.com/L0HkZMYJ
Animations: http://pastebin.com/E638izub