Swift scene kit - cant apply velocity WHILE doing rotation? Direction is off?

Ok, so Im going straight off Apple's tutorial using a joystick moving an SCNNode for SceneKit here - https://developer.apple.com/library/content/samplecode/scenekit-2017/Introduction/Intro.html

Ive copied the code and gotten the joystick to both move and rotate the character - but not simultaneously, and not in the right direction relative to the node.

All the correct code is in that download, but what Ive done is here is where I get the angle offset of the joystick handle and the float2 from the joystick UI-

characterDirection = float2(Float(padNode.stickPosition.x), -Float(padNode.stickPosition.y))
let direction = theDude.characterDirection(withPointOfView: renderer.pointOfView)
directionAngle = CGFloat(atan2f(direction.x, direction.z))

public func characterDirection(withPointOfView pointOfView: SCNNode?) -> float3 {
        let controllerDir = theDude.direction //THIS ISNT BEING UPDATED
        if controllerDir.allZero() {
            return float3.zero

        var directionWorld = float3.zero
        if let pov = pointOfView {
            let p1 = pov.presentation.simdConvertPosition(float3(controllerDir.x, 0.0, controllerDir.y), to: nil)
            let p0 = pov.presentation.simdConvertPosition(float3.zero, to: nil)
            directionWorld = p1 - p0
            directionWorld.y = 0
            if simd_any(directionWorld != float3.zero) {
                let minControllerSpeedFactor = Float(0.2)
                let maxControllerSpeedFactor = Float(1.0)
                let speed = simd_length(controllerDir) * (maxControllerSpeedFactor - minControllerSpeedFactor) + minControllerSpeedFactor
                directionWorld = speed * simd_normalize(directionWorld)
        return directionWorld

I didn't write the last part and still trying to understand it. But what is relevant is I have a float3 and an angle, and they are conflicting when I try to run them both as SCNActions in my renderer update func:

Here is what Apple basically had in update:

// move
        if !direction.allZero() {
            theDude.characterVelocity = direction * Float(characterSpeed)
            var runModifier = Float(1.0)
            theDude.walkSpeed = CGFloat(runModifier * simd_length(direction))

            // move character - IMPORTANT
            theDude.directionAngle = CGFloat(atan2f(direction.x, direction.z))

            theDude.node.runAction(SCNAction.move(by: SCNVector3(theDude.characterDirection(withPointOfView: theDude.node)), duration: TimeInterval(40))) //HERE - random time

           theDude.isWalking = true
        } else {
            theDude.isWalking = false


Where on the commented line I applied the move and here Apple had the rotation applied:

 var directionAngle: CGFloat = 0.0 {
        didSet {
                SCNAction.rotateTo(x: 0.0, y: directionAngle, z: 0.0, duration: 0.1, usesShortestUnitArc:true))

They are both happening, problem is I don't know really what to put as my time and my node moves say, left when I have the joystick pointed right, etc because I am not doing the move correctly.

I tried to copy the demo but they have a moving floor, so it is different. What am I doing wrong here?