Где «поведения», созданные в Reality Composer, хранятся в .rcproject?

Ситуация

Я делаю приложение AR в xcode (11.3.1). Я добавил объекты (например, куб) в сцену, используя композитор реальности, и добавил поведения (например, касание, переворачивание и просмотр камеры) этим объектам, также используя композитор реальности. Сохранил это, переключился на ViewController.swift

В ViewController я загружаю Experience.rcproject и получаю доступ к сцене по умолчанию Box, написав var box = try! Experience.loadBox(). Все работает как положено.

Затем я печатаю различные объекты в иерархии, чтобы понять, как они устроены. Так, например, я напишу print(box) и увижу все сущности и компоненты, как они описаны здесь

Проблема

Я могу видеть такие вещи, как Transform для положения и т. Д. И ModelComponent для меша, материалов и т. Д., И все это имеет смысл, но я не вижу, где хранятся поведения внутри объекта, который .rcproject становится в swift.

Например, если бы я добавил look at camera поведение в композитор реальности, я бы предположил, что к этому объекту будет прикреплено что-то вроде «рекламного щита», но я не вижу никакой разницы между объектами, к которым применено поведение, и те, кто этого не делает ..

Другой пример: добавив tap and flip к объекту, я ожидал бы найти некоторую информацию об анимации где-то внутри объекта, но снова я не вижу ее прикрепленной к объекту. Я также не вижу никакой информации об анимации или компонентах поведения где-либо в пределах объекта сцены.

Кто-нибудь знает, где я могу получить к ним доступ? Кажется, что в box есть что-то под названием actions, но печать, которая просто возвращает Experience.Box.Actions без дополнительной информации.

Я ищу не в том месте? Или они не выставлены?


person Nick    schedule 31.01.2020    source источник


Ответы (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 is:

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

onAction is:

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]
        }
    }
}
person Andy Fedoroff    schedule 31.01.2020
comment
Привет, AndyFedo, спасибо за ответ, но печать компонентов не показывает никаких «поведений», которые были добавлены в Reality Composer (например, анимация или взгляд в камеру), возможно, они не являются компонентами? Но если нет, то что это такое и как к ним можно получить доступ в объекте сцены? - person Nick; 31.01.2020
comment
Спасибо за информацию AndyFedo. Я с нетерпением жду будущей версии. И спасибо за фрагмент, это полезно. - person Nick; 04.02.2020