我正在实现一个RealityKit实体组件系统,并且我的组件定义有问题。下面是我正在做的一个简单的例子:
import Foundation
import RealityFoundation
public struct ValueComponent: Component, Codable {
public var value: Int = 0
}
public protocol HasValueComponent {}
extension HasValueComponent where Self: Entity {
var value: Int {
get { components[ValueComponent.self]?.value ?? 0 }
set { components[ValueComponent.self]?.value = newValue }
}
}在创建实体之后,我会像这样初始化组件:
// ValueComponent.registerComponent()
modelEntity.name = "model"
modelEntity.components[ValueComponent.self] = .init(value: 123)稍后,我尝试访问组件,但总是获得零。组件集中存在组件,但到HasValueComponent的转换失败。
guard let model = arView.scene.findEntity(named: "model") as? Entity & HasValueComponent else { return }
print(model.components[ValueComponent.self])我做错了什么?谢谢!
发布于 2022-07-08 04:36:58
在RealityKit (和RealityFoundation)中,在使用应用程序之前,您必须对要在应用程序中使用的每个自定义组件类型调用一次registerComponent()类型方法。
public static func registerComponent()对于内置组件类型(如CollisionComponent ),不需要调用此方法。
ValueComponent.registerComponent()同样,您必须调用registerSystem()类型方法才能使用系统(ECS模式)。
解决方案
似乎不支持将类型转换到实现自定义组件的协议。莫名其妙的原因。因此,请使用以下解决方案。
import UIKit
import RealityKit
protocol HasValueComponent { }
extension HasValueComponent where Self: Entity {
var val: Int {
get { components[ValueComponent.self]?.val ?? .zero }
set { components[ValueComponent.self]?.val = newValue }
}
}
struct ValueComponent: Component {
var val: Int
}Primitive.swift
class Primitive: Entity, HasModel, HasValueComponent {
required init() {
super.init()
ValueComponent.registerComponent()
self.model = ModelComponent(mesh: .generateSphere(radius: 0.1),
materials: [SimpleMaterial()])
self.name = "model"
self.components.set(ValueComponent(val: 1234))
}
}ViewController.swift
class ViewController: UIViewController {
var arView = ARView(frame: .zero)
let primitive = Primitive()
override func viewDidLoad() {
super.viewDidLoad()
arView.frame = self.view.frame
self.view.addSubview(arView)
let anchor = AnchorEntity()
anchor.addChild(self.primitive)
arView.scene.addAnchor(anchor)
if let model = arView.scene.findEntity(named: "model") {
print(model.components[ValueComponent.self]!.val) // 1234
print(model.components.has(ValueComponent.self)) // true
}
}
}https://stackoverflow.com/questions/72903415
复制相似问题