scenekit 的 SCNAction 只执行一次动作
SCNAction of scenekit only executing action once
我希望我创建的对象 "fall" 在控制器的视图下方。我还想要无限量的物体掉落,所以继续动画直到用户转到另一个视图控制器。我使用了一个 for 循环来组成多达 100 个对象。这是代码...
SCNMaterial *blackMaterial = [SCNMaterial material];
blackMaterial.diffuse.contents = [UIColor blackColor];
int xcoordinate = arc4random_uniform(20);
int xcoordinateTwo = arc4random_uniform(20);
for (int i = 0; i < 100; i++){
SCNText *x = [SCNText textWithString:@"X" extrusionDepth: 2.75];
SCNNode *xNode = [SCNNode nodeWithGeometry:x];
xNode.position = SCNVector3Make(xcoordinate, 15.0, -60.0);
xNode.scale = SCNVector3Make(2.0, 2.0, 0.45);
x.materials = @[blackMaterial];
x.chamferRadius = 5.0;
SCNAction *moveTo = [SCNAction moveTo:SCNVector3Make(xcoordinate, -100.0, -60.0)duration:10.0];
[xNode runAction:moveTo];
SCNTorus * torus = [SCNTorus torusWithRingRadius:6.30 pipeRadius:2.30];
SCNNode *torusNode = [SCNNode nodeWithGeometry:torus];
torusNode.position = SCNVector3Make(xcoordinateTwo, 15.0, -60.0);
torus.materials = @[blackMaterial];
torusNode.eulerAngles = SCNVector3Make(-1.5708, 0, 0);
[torusNode runAction:moveTo];
[scene.rootNode addChildNode:torusNode];
[scene.rootNode addChildNode:xNode];
}
我的问题是每个对象只创建了一个,而不是 100 个。谁能帮我解决这个问题。
您确实为每个对象创建了 100 个:
NSLog(@"%@", scene.rootNode.childNodes);
它们都具有相同的起点和终点位置,因为您对 arc4random_uniform
的调用在循环之外。它们都在同一个地方,所以看起来只有一个节点。
将随机数调用移到内部会分散您的节点,但它们都将在同一模拟时间创建。要连续生成它们,您可以构造一个包含一系列动作的 [SCNAction sequence:[...]]
:一个块动作来创建一个新节点并将其添加到树中,然后是一个延迟动作。将其包装在 repeatActionForever:
中并让您的根节点执行该操作。您还需要在节点到达目的地或离开视野时将其移除。
我希望我创建的对象 "fall" 在控制器的视图下方。我还想要无限量的物体掉落,所以继续动画直到用户转到另一个视图控制器。我使用了一个 for 循环来组成多达 100 个对象。这是代码...
SCNMaterial *blackMaterial = [SCNMaterial material];
blackMaterial.diffuse.contents = [UIColor blackColor];
int xcoordinate = arc4random_uniform(20);
int xcoordinateTwo = arc4random_uniform(20);
for (int i = 0; i < 100; i++){
SCNText *x = [SCNText textWithString:@"X" extrusionDepth: 2.75];
SCNNode *xNode = [SCNNode nodeWithGeometry:x];
xNode.position = SCNVector3Make(xcoordinate, 15.0, -60.0);
xNode.scale = SCNVector3Make(2.0, 2.0, 0.45);
x.materials = @[blackMaterial];
x.chamferRadius = 5.0;
SCNAction *moveTo = [SCNAction moveTo:SCNVector3Make(xcoordinate, -100.0, -60.0)duration:10.0];
[xNode runAction:moveTo];
SCNTorus * torus = [SCNTorus torusWithRingRadius:6.30 pipeRadius:2.30];
SCNNode *torusNode = [SCNNode nodeWithGeometry:torus];
torusNode.position = SCNVector3Make(xcoordinateTwo, 15.0, -60.0);
torus.materials = @[blackMaterial];
torusNode.eulerAngles = SCNVector3Make(-1.5708, 0, 0);
[torusNode runAction:moveTo];
[scene.rootNode addChildNode:torusNode];
[scene.rootNode addChildNode:xNode];
}
我的问题是每个对象只创建了一个,而不是 100 个。谁能帮我解决这个问题。
您确实为每个对象创建了 100 个:
NSLog(@"%@", scene.rootNode.childNodes);
它们都具有相同的起点和终点位置,因为您对 arc4random_uniform
的调用在循环之外。它们都在同一个地方,所以看起来只有一个节点。
将随机数调用移到内部会分散您的节点,但它们都将在同一模拟时间创建。要连续生成它们,您可以构造一个包含一系列动作的 [SCNAction sequence:[...]]
:一个块动作来创建一个新节点并将其添加到树中,然后是一个延迟动作。将其包装在 repeatActionForever:
中并让您的根节点执行该操作。您还需要在节点到达目的地或离开视野时将其移除。