Hi Jeanfabre
ok ill give it a shot. Thanks for the guideance. I was using Blender (python) and managed to achieve this but do not understand Unity fully yet. Heres my code from that game if anyone knows python to convert? *ignore key controllers.
Thanks again
from bge import logic, events
#from bge import render
from mathutils import Vector
from math import pi
tic_rate = logic.getLogicTicRate()
gravity = 20
turn_speed = 0.05
move_speed = 2.5
jump_force = 500.0
up_key = events.UPARROWKEY
down_key = events.DOWNARROWKEY
left_key = events.LEFTARROWKEY
right_key = events.RIGHTARROWKEY
run_key = events.LEFTCTRLKEY
jump_key = events.XKEY
class Translation:
    
    def __init__(self, own, sensors):
        self.own = own
        self.floor = own
        self.col_floor = sensors[1]
        self.velocity = Vector()
        self.rotation = Vector()
        self.force = Vector()
        self.gravity = Vector((0, 0, -gravity))
        self.normal = Vector((0, 0, 1))
    
    def keyboard(self, just_activated=1, active=2):
        events = logic.keyboard.events
        left = events[left_key] is active
        right = events[right_key] is active
        up = events[up_key] is active
        down = events[down_key] is active
        jump = events[jump_key] is just_activated
        move = up - down
        turn = left - right
        return turn, move, jump
    def get_normal(self):
        ori = self.own.worldOrientation
        start = self.own.worldPosition
        end = self.floor.worldPosition
#        render.drawLine(start, end, [1, 1, 0])
        hit_normal = self.own.rayCast(end, start, 1)[2]
        if hit_normal:
            self.normal = hit_normal
                
    def main(self):
        turn, move, jump = self.keyboard()
        self.rotation.z = turn * turn_speed
        if self.col_floor.positive:
            self.floor = self.col_floor.hitObject
            self.velocity.x = move * move_speed
            self.force.z = jump * jump_force
        self.get_normal()
        self.own.localLinearVelocity.xy = self.velocity.xy
        self.own.applyForce(self.force + self.gravity, True)
        self.own.alignAxisToVect(self.normal, 2, move_speed / 20)
        self.own.applyRotation(self.rotation, True)
def box(cont):
    own = cont.owner
    sensors = cont.sensors
    if 'translation' not in own:
        own['translation'] = Translation(own, sensors)
    own['translation'].main()
    
def mesh(cont):
    own = cont.owner
    velocity = own.parent.localLinearVelocity.x
    own.applyRotation([0, velocity * pi / 2 / tic_rate, 0], True)