iOS 수준 개발이 처음이고 현재 첫 번째 SceneKit 게임을 만들려고 노력하고 있습니다. 그러나 어떤 방법을 사용해야하는지 잘 모르겠습니다. 메뉴, 레벨 선택 페이지, 설정 등과 같은 "non-3D"페이지를 만들 수 있습니다.Swift/SceneKit - 게임의 메뉴/레벨 선택 장면을 만들기위한 모범 사례
현재 GameViewController가 하나 있고 overlaySKScene과 함께 빈 SCNScene을 사용하여 SpriteKit 메뉴를 표시합니다. 메뉴에서 재생 버튼을 클릭하면 다른 비어있는 SCNScene으로 이동하여 레벨 목록을 표시하려고합니다. 다시 ovelaySKSCene을 사용해야합니까? 올바른 방법입니까?
는 또한 .. 내가 괞 찮아 버튼의 이전 배치의 자리에 눌러 경우, levelScene으로 전환하기 전에 scnView.overlaySKScene = 전무를 설정 한 경우에도, overlayScene의 nodePressed 여전히 playButton으로 노드를 포함 것으로 나타났습니다
루키 질문에 대해 용서해주십시오. 지금까지이 유형의 시나리오에 대한 좋은 예를 찾을 수 없었습니다. 지금까지
내 코드 :
import UIKit
import QuartzCore
import SceneKit
import SpriteKit
class GameViewController: UIViewController {
var scnView: SCNView {
let scnView = view as! SCNView
scnView.backgroundColor = UIColor.init(displayP3Red: 0.98, green: 0.64, blue: 0.04, alpha: 1)
return scnView
}
var menuScene: SCNScene!
var levelsScene: SCNScene!
var ground: SCNNode!
var light: SCNNode!
var scnScene: SCNScene!
var cameraNode: SCNNode!
var brickNode: SCNNode!
var selectedBrickNode: SCNNode!
var bricksArray : [SCNNode] = []
var controls: SKScene!
var levels: SKScene!
override func viewDidLoad() {
super.viewDidLoad()
setupView()
showMenu()
setupCamera()
}
override var shouldAutorotate: Bool {
return true
}
override var prefersStatusBarHidden: Bool {
return true
}
func setupView() {
scnView.showsStatistics = true
scnView.allowsCameraControl = false
scnView.autoenablesDefaultLighting = true
}
func showMenu() {
menuScene = SCNScene()
scnView.scene = menuScene
self.controls = Controls(size: self.view.bounds.size)
self.controls.isUserInteractionEnabled = false
scnView.overlaySKScene = self.controls
}
func showLevels(){
levelsScene = SCNScene()
self.levels = Levels(size: self.view.bounds.size)
self.levels.isUserInteractionEnabled = false
scnView.overlaySKScene = self.levels
let transition = SKTransition.push(with: .left, duration: 1.0)
self.scnView.present(levelsScene
, with: transition, incomingPointOfView: nil, completionHandler:nil)
}
func setupCamera(){
cameraNode = SCNNode()
let camera = SCNCamera()
camera.zFar = 10000
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: 0, y: 10, z: 20)
let constraint = SCNLookAtConstraint(target: ground)
constraint.isGimbalLockEnabled = true
cameraNode.constraints = [constraint]
let ambientLight = SCNLight()
ambientLight.color = UIColor.darkGray
ambientLight.type = SCNLight.LightType.ambient
cameraNode.light = ambientLight
menuScene.rootNode.addChildNode(cameraNode)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch began ")
for touch: UITouch in touches {
let location = touch.location(in: scnView.overlaySKScene!)
let nodePressed = self.controls.atPoint(location)
print(nodePressed.name)
if (nodePressed.name == "playButton") {
scnView.overlaySKScene = nil
showLevels()
}
}
}
}
의견을 보내 주셔서 감사합니다. "SCNView 위에 UIKit 요소"가 무엇을 의미하는지 명확하게 설명해 주시겠습니까? 마지막으로 스토리 보드를 사용하여 다른 viewcontroller를 만들고 UIKit 요소로 내 메뉴/레벨 선택 페이지를 디자인하고 게임 컨트롤러에서 /로 나가기를 결정했습니다. 이는 접근 방식과 비슷합니까? –
내가하는 일은 XIb 파일에 원하는 요소가있는 UIView를 만든 다음 SCNView 자체의 일반 하위 뷰로 추가하는 것입니다. 따라서 3D 장면을 배경으로 사용할 수 있으며 그 위에 일반 UIKit 요소를 사용할 수 있습니다. 메뉴 장면이 완전히 2D면 그렇다면 여전히 오버레이 씬을 피해야합니다. – Xartec