SceneKitでゲームを作っています。これは、追加および削除される SCNBoxes に基づいています。最後に、ルート ノードに 30 個ほどのボックスが追加されます。
// Prepare Surface Layer for Blocks
self.colorOfBlock = [CALayer layer];
self.colorOfBlock.frame = CGRectMake(0, 0, 1000, 1000);
self.colorOfBlock.backgroundColor = [UIColor colorWithHue:0 saturation:1 brightness:1 alpha:1].CGColor;
self.textLayer = [CATextLayer layer];
self.textLayer.frame = self.colorOfBlock.bounds;
self.textLayer.fontSize = 750;//self.colorOfBlock.bounds.size.height;
self.textLayer.string = @"2";
self.textLayer.alignmentMode = kCAAlignmentCenter;
self.textLayer.foregroundColor = [UIColor blackColor].CGColor;
[self.textLayer display];
[self.colorOfBlock addSublayer:self.textLayer];
// Prepare Material for the Block
SCNMaterial *material = [SCNMaterial material];
material.diffuse.contents = self.colorOfBlock;
// Create the Block
self.blockNode = [SCNNode node];
self.blockNode.geometry = [SCNBox boxWithWidth:0.95 height:0.95 length:0.95 chamferRadius:0.1];
self.blockNode.geometry.firstMaterial = material;
self.blockNode.position = position;
// Setup the physics body
self.blockNode.physicsBody = [SCNPhysicsBody dynamicBody];
self.blockNode.physicsBody.affectedByGravity = NO;
self.blockNode.physicsBody.categoryBitMask = CollisionCategoryBlock;
self.blockNode.physicsBody.contactTestBitMask = CollisionCategoryBorder | CollisionCategoryBlock;
self.blockNode.physicsBody.collisionBitMask = CollisionCategoryBorder | CollisionCategoryBlock;
self.blockNode.physicsBody.angularVelocityFactor = SCNVector3Make(0, 0, 0);
[self addChildNode:self.blockNode];
self.gameValue = 2;
if (position.z < 1) {
self.name = @"Front";
} else {
self.name = @"Back";
}
しばらくすると、textLayer が消えたように見えます。新しいブロックが追加されると、textLayer がなくなります。もう 1 つの副作用は、既存のブロックの古い textLayers が更新されなくなることです。
次のステップでは、新しく追加されたブロックが見えなくなります。または、より良い言い方をすれば、CALayer を取得することはありません。しかし、physicsBodies はまだ機能しています。
また、ビューがクラッシュすることもあります。デバッガーは、クラッシュ領域の位置のようなものを見つけることができないと言います。この後、ビューが変形されます。しかし、ビューをクリアし、投稿したようなこれらのブロックではないすべての作成済みオブジェクトを表示する SCNActions を呼び出すことはできます。これらのブロックは、ビューから完全に追い出されます。
ちなみに、これらのブロックに「phonglighttype」をセットアップすると、このバグカスケードが以前に発生します。
また、もう一つ気になったことがあります。アプリからタブで移動し (iPhone 5 でテスト済み)、しばらくしてから再びタブで移動すると、
self.gameView.showsStatistics = YES;
GPU バーに青い線が表示されます。2 ~ 3 秒後、青色のバーが消え、完全な緑色の GPU バーが使用できる状態になったことを示します。そして、すべてが正常に機能します。しばらくすると、これらのブロックは再び見えなくなります。タブアウトしてもう一度タブインすると、新しく追加されたブロックが再び表示されます。
どういうわけか、アプリがクラッシュするまでデバイスのキャッシュをスパムしていると思います。しかし、Xcode からの有用なヒントはありません。viewControllers キャッシュをクリアするオプションがこの問題を解決するかどうか疑問に思います-これにオプションがある場合。
敬具