如何设置重力让物体下落且玩家不受重力影响(SpriteKit开发)
问题根源
你当前的逻辑把全局物理世界的重力作为了玩家水平移动的动力来源,所以全局重力添加Y轴下落分量后,所有开启了affectedByGravity的物体(包括玩家)都会受影响下落;而关闭玩家的affectedByGravity后,全局重力的水平分量也无法再驱动玩家移动,就出现了移动失效的问题。
解决方案
按照以下步骤调整即可实现需求:
- 固定全局物理重力为下落专用数值,不要在
update方法中修改全局重力,仅在场景初始化时设置一次即可:
physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)
- 显式将玩家的
affectedByGravity属性设为false,避免玩家受全局下落重力影响。 - 修改
update中的玩家移动逻辑,改为直接控制玩家物理体的速度/施加水平力,不再依赖全局重力驱动玩家移动,修改后的代码示例如下:
override func update(_ currentTime: TimeInterval) { guard isGameOver == false else { return } // 移动灵敏度系数,可根据需求调整数值控制手感 let sensitivity: CGFloat = 3.0 #if targetEnvironment(simulator) if let currentTouch = lastTouchPosition { let xDiff = currentTouch.x - player.position.x // 仅设置水平方向速度,垂直方向速度固定为0避免下落 player.physicsBody?.velocity = CGVector(dx: xDiff * sensitivity, dy: 0) } #else if let accelerometerData = motionManager.accelerometerData { let xVelocity = CGFloat(accelerometerData.acceleration.x) * 40 player.physicsBody?.velocity = CGVector(dx: xVelocity, dy: 0) } #endif }
- 所有需要正常下落的目标物体保持
affectedByGravity = true即可,它们会正常受全局重力影响下落。
内容的提问来源于stack exchange,提问作者nathandr
相关产品推荐
相关产品推荐

