Как использовать свойства из SCNFloor с помощью Swift и Scenekit?

#swift #scenekit

#swift #scenekit

Вопрос:

Я не могу понять, как получить доступ к свойствам из класса Scenekit SCNFloor с помощью Swift, в objective-c они делают это так:

 SCNNode*floor = [SCNNode node];
floor.geometry = [SCNFloor floor];
((SCNFloor*)floor.geometry).reflectionFalloffEnd = 10;
 

Это создает этаж, как мне получить доступ к «reflectionFalloffEnd»?

 let levelFloor = SCNNode()
levelFloor.geometry = SCNFloor()
 

Спасибо

РЕДАКТИРОВАТЬ Спасибо за быстрые ответы, теперь это работает 🙂

Ответ №1:

Используете ли вы ObjC или Swift, чтобы компилятор был доволен тем, что вы используете SCNFloor свойства или методы для ссылки, эта ссылка должна иметь тип SCNFloor .

Вы можете сделать это встроенным с помощью приведения:

 // ObjC
((SCNFloor*)floor.geometry).reflectionFalloffEnd = 10;

// Swift
(levelFloor.geometry as SCNFloor).reflectionFalloffEnd = 10
 

Но это может стать довольно громоздким, особенно если вы собираетесь задать кучу свойств для геометрии. Я предпочитаю просто использовать локальные переменные (или, скорее, константы, поскольку ссылки не нужно менять).:

 let floor = SCNFloor()
floor.reflectionFalloffEnd = 10
floor.reflectivity = 0.5
let floorNode = SCNNode(geometry: floor)
floorNode.position = SCNVector3(x: 0, y: -10.0, z: 0)
scene.rootNode.addChildNode(floorNode)
 

Ответ №2:

(levelFloor.geometry as SCNFloor).reflectionFalloffEnd = 10 это то, как вы могли бы сделать это в Swift — вы были почти на месте!

в качестве альтернативы — если вам понадобится часто обращаться к этому свойству as , в вашем коде может возникнуть куча приведений 🙂 вместо этого вы можете предпочесть просто объявлять константы для хранения этих объектов:

 let levelFloor = SCNNode()
let levelFloorGeometry = SCNFloor()
levelFloor.geometry = levelFloorGeometry

levelFloorGeometry.reflectionFalloffEnd = 10
// and so on as this property of your SCNNode's geometry needs to change throughout your app