1

情况

我正在 xcode (11.3.1) 中制作 AR 应用程序。我已经使用现实作曲家将对象(例如立方体)添加到场景中,并向这些对象添加了行为(即点击和翻转并查看相机),也使用现实作曲家。保存,切换到ViewController.swift

在 ViewController 中,我通过编写加载Experience.rcproject并访问默认场景。一切都按预期工作。Boxvar box = try! Experience.loadBox()

然后我打印层次结构中的各种对象以了解它们是如何构造的。因此,例如,我将编写并查看此处print(box)描述的所有实体和组件

问题

我可以看到诸如Transform位置等以及ModelComponent网格、材料等的内容,这一切都很有意义,但我看不到 .rcproject 快速变为对象的行为存储在何处。

例如,如果我look at camera在现实作曲家中添加了一个行为,我的假设是该对象会附加一个类似于“广告牌”组件的东西,但我看不出应用了行为的对象和那些应用了行为的对象之间有任何区别那不..

另一个例子是,添加tap and flip到对象后,我希望在对象中的某处找到一些动画信息,但我还是看不到它附加到对象上。我也无法在场景对象的任何位置看到任何动画信息或行为组件。

有没有地方知道我在哪里可以访问这些?似乎有一些东西被box调用actions但打印只是返回Experience.Box.Actions而没有更多信息。

我找错地方了吗?还是这些没有暴露?

4

1 回答 1

1

部分解决方案

您可以behaviours以某种非常有限的方式访问和重新创建。为此,您需要Notify在 Reality Composer 的动作序列中包含具有明确名称的动作。

在此处输入图像描述

RealityKit 的代码如下所示:

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let boxAnchor = try! Experience.loadBox()
        arView.scene.anchors.append(boxAnchor)

        boxAnchor.actions.repetitive.onAction = self.remodelling
    }
    
    fileprivate func remodelling(_ entity: Entity?) {

        guard let entity = entity else { return }
        entity.children[0].position.x = -0.25
        
        let modelEntity = entity.children[0] as! ModelEntity
        modelEntity.model?.mesh = .generateSphere(radius: 0.1)
        modelEntity.model?.materials = [UnlitMaterial(color: .green)]
    }
}

在此处输入图像描述

其中actions实例属性是:

public private(set) lazy var actions: Actions { get set }

repetitive是:

public private(set) lazy var repetitive: Experience.NotifyAction { get set }

onAction是:

public var onAction: ((Entity?) -> Void)?


附加信息

以下是不可编辑的内容ActionsAndBehaviours.Experience.Box.Actions

import Combine
import Foundation
import RealityKit
import SwiftOnoneSupport
import UIKit
import simd

@available(iOS 13.0, macOS 10.15, *)
public enum Experience {

    public class NotifyAction {

        public let identifier: String

        public var onAction: ((Entity?) -> Void)?
    }

    public enum LoadRealityFileError : Error {

        case fileNotFound(String)
    }

    public static func loadBox() throws -> ActionsAndBehaviours.Experience.Box

    public static func loadBoxAsync(completion: @escaping (Result<ActionsAndBehaviours.Experience.Box, Error>) -> Void)

    public class Box : Entity, HasAnchoring {

        public var steelBox: Entity? { get }

        lazy public private(set) var actions: ActionsAndBehaviours.Experience.Box.Actions

        public class Actions {

            lazy public private(set) var repetitive: ActionsAndBehaviours.Experience.NotifyAction

            lazy public private(set) var allActions: [ActionsAndBehaviours.Experience.NotifyAction]
        }
    }
}
于 2020-01-31T20:16:09.313 回答