将背景模糊添加到 SKSpriteNode(或 SKScene)

Add background blur to a SKSpriteNode (or SKScene)

我在 SCNScene 上有一个 OverlayPanel SKScene。此面板包含 SKSpriteNode 的颜色。不知道怎么给面板加背景虚化效果

另外一个问题:我是用这个方法添加面板的:

 colorPanelScene = SKScene(fileNamed: "art.scnassets/ColorPanelScene")!
 SCNsceneView.overlaySKScene = colorPanelScene
 SCNsceneView.overlaySKScene!.userInteractionEnabled = true;

这是正确的方法还是我应该将面板创建为 单独的 UIView(并以更简单的方式应用模糊效果)?

您可以在叠加场景中添加一个 SKEffectsNode 来实现此效果。

虽然有点棘手,但按照您的方式加载它是不够的。

此方法仅适用于静态背景。基本上我们要做的是截屏背景,并将其加载到 SKEffectNode 中使其模糊。

在 SceneKit 编辑器中,向场景添加一个节点(确保它不是其他节点的子节点)并确保将此节点的 class 设置为 SKEffectNode有了名字,我就叫它 EffectNode。这个在设计的时候要尽可能的低zPosition

然后在代码中,您要执行以下操作:

if let effectNode = colorPanelScene.childNodeWithName("EffectNode") as? SKEffectNode {
    let  blur = CIFilter(name:"CIGaussianBlur",withInputParameters: ["inputRadius": 10.0]);
    effectNode.filter = blur;
    effectNode.shouldRasterize = true;
    effectNode.shouldEnableEffects = true;


    UIGraphicsBeginImageContextWithOptions(view.bounds.size, true, 0)
        view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    let node = SKSpriteNode(texture:SKTexture(image: image));
    effectNode.addChild(node);
}

然后,在 SKEffectNode 之上添加另一个 SKNode,但要确保它不是 SKEffectNode 的子项。将所有叠加元素放入此 SKNode.

我会选择 UIVisualEffectView。它拥有 UIKit 和 Core Animation 人员的所有出色优化,将使您的应用在平台上看起来一致。