[英]How to add Reality file in a Swift Package Manager?
我听说 Xcode 12(现在是 Beta 6),Swift 包管理器现在能够包含资源。 但我无法打开现实(.rcproject)文件。
Augmented Reality App
项目。 (RealityKit + SwiftUI + Swift)SPM
(Swift 包管理器)SPM
拖到项目中,并将其添加到“常规”>“目标”选项卡中的框架中。 (通知项目有关本地添加的 spm)Experience.rcproject
& ContentView
(也复制了自动生成的Experience
枚举,您可以通过 Cmd+Click 访问它)到SPM
ContentView
一些访问初始化问题并添加了平台支持platforms: [.iOS(.v13)],
在SPM
SPM
为存在路径Experience.rcproject
添加了resources
完成这些步骤后,我希望有一个包含 AR 的 swift 包管理器。
但是自动生成的Experience
枚举会抛出.fileNotFound("Experience.reality")
错误。
好像还是没能在 Bundle 中找到真人档案?
你有没有尝试过类似的东西。 等待任何帮助。 谢谢..
Package.swift
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "ARSPM",
platforms: [.iOS(.v13)],
products: [
.library(
name: "ARSPM",
targets: ["ARSPM"]),
],
dependencies: [],
targets: [
.target(
name: "ARSPM",
dependencies: [], resources: [
.copy("Resources")
]),
.testTarget(
name: "ARSPMTests",
dependencies: ["ARSPM"]),
]
)
ARView.swift
import SwiftUI
import RealityKit
public struct EKARView : View {
public init() { }
public var body: some View {
return ARViewContainer().edgesIgnoringSafeArea(.all)
}
}
public struct ARViewContainer: UIViewRepresentable {
public func makeUIView(context: Context) -> ARView {
let arView = ARView(frame: .zero)
// Load the "Box" scene from the "Experience" Reality File
let boxAnchor = try! Experience.loadBox()
// Add the box anchor to the scene
arView.scene.anchors.append(boxAnchor)
return arView
}
public func updateUIView(_ uiView: ARView, context: Context) {}
}
GeneratedExperienceFile.swift
//
// Experience.swift
// GENERATED CONTENT. DO NOT EDIT.
//
import Foundation
import RealityKit
import simd
import Combine
internal enum Experience {
public enum LoadRealityFileError: Error {
case fileNotFound(String)
}
private static var streams = [Combine.AnyCancellable]()
public static func loadBox() throws -> Experience.Box {
guard let realityFileURL =
// Also tried >> Foundation.Bundle.module
Foundation.Bundle(for: Experience.Box.self)
.url(forResource: "Experience", withExtension: "reality") else {
throw Experience.LoadRealityFileError.fileNotFound("Experience.reality")
}
let realityFileSceneURL = realityFileURL.appendingPathComponent("Box", isDirectory: false)
let anchorEntity = try Experience.Box.loadAnchor(contentsOf: realityFileSceneURL)
return createBox(from: anchorEntity)
}
public static func loadBoxAsync(completion: @escaping (Swift.Result<Experience.Box, Swift.Error>) -> Void) {
guard let realityFileURL = Foundation.Bundle(for: Experience.Box.self).url(forResource: "Experience", withExtension: "reality") else {
completion(.failure(Experience.LoadRealityFileError.fileNotFound("Experience.reality")))
return
}
var cancellable: Combine.AnyCancellable?
let realityFileSceneURL = realityFileURL.appendingPathComponent("Box", isDirectory: false)
let loadRequest = Experience.Box.loadAnchorAsync(contentsOf: realityFileSceneURL)
cancellable = loadRequest.sink(receiveCompletion: { loadCompletion in
if case let .failure(error) = loadCompletion {
completion(.failure(error))
}
streams.removeAll { $0 === cancellable }
}, receiveValue: { entity in
completion(.success(Experience.createBox(from: entity)))
})
cancellable?.store(in: &streams)
}
private static func createBox(from anchorEntity: RealityKit.AnchorEntity) -> Experience.Box {
let box = Experience.Box()
box.anchoring = anchorEntity.anchoring
box.addChild(anchorEntity)
return box
}
public class Box: RealityKit.Entity, RealityKit.HasAnchoring {
public var steelBox: RealityKit.Entity? {
return self.findEntity(named: "Steel Box")
}
}
}
在ContentView
文件中,我简单地显示EKARView
。
Xcode 知道如何将.rcproject
文件处理为构建应用程序时所需的.reality
文件。 不幸的是,在使用 Swift 包访问项目文件时没有完成此处理。
您概述的步骤几乎可以奏效。 归结为使用已编译的.reality
文件代替.rcproject
文件。 为了转换默认的.rcproject
文件,您需要使用 Apple 的Reality Composer应用程序。
使用 Xcode 12 概述的步骤...
Experience.rcproject
文件后,单击“在 Reality Composer 中打开”按钮。Experience.reality
文件。Experience.swift
文件中的Bundle
引用替换为Bundle.module
,因为现有引用将针对您的应用程序包。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.