好的,我直接使用操纵杆将SCNNode换为SceneKit 这里。来完成 Apple 的教程,我已经复制了代码,并获得了操纵杆来移动和旋转角色-但不能同时进行,并且不能相对于节点以正确的方向进行。

所有正确的代码都在该下载中,但是我在这里所做的是从操纵杆 UI 中获得操纵杆手柄和 float2 的角度偏移量-

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
    }

我没有写最后一部分,但仍然试图理解它。但是重要的是我有一个 float3 和一个 angle,当我在渲染器更新func中尝试同时以SCNActions的方式运行它们时,它们发生冲突:

这是苹果公司基本上更新的内容:

// 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
            theDude.node.removeAllActions()
        }

    }

我在注释行的哪儿应用了此举,在这里苹果应用了轮换:

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

它们都在发生,问题是我真的不知道该如何放置时间和节点移动,当操纵杆指向右时向左移动,等等,因为我没有正确执行移动。

我尝试复制该演示,但是它们有一个活动地板,因此有所不同。我在这里做错了什么?