#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