マジクエスト(MAGIQUEST)の感想

先月、業務でマジクエスト(MAGIQUEST)というアトラクションに行くことがあった。 そのときのことをメモとして残しておく。

MAGIQUESTとは

wikipediaから一部引用すると以下のとおり。(2016.3.6時点)

マジクエスト(MAGIQUEST)は、アメリカ生まれのアトラクション。RPGの世界を実体験できる。 日本では、愛知県蒲郡市のテーマパークラグナシアおよび、東京都文京区の東京ドームシティアトラクションズで稼動中である。 プレイヤーはマギ(MAGI=魔法使い)というキャラクターとなり、魔法を使いながら魔法の王国「マジックキングダム」を冒険していく。 マジクエスト - Wikipedia

読みは「マギクエスト」ではないのか、という疑問は自分も浮かんだが気にしない方がいい。

基礎ルール

  • 制限時間は1時間
  • プレイヤーは受付で渡される「杖」と「賢者の書」を持って、ゲームをプレイする
  • プレイヤーがクリアすべきは、クエストとアドベンチャー
  • エリア内の指定されたポイントに向かって杖を振ると、イベントが起こる
    • 隠されているシンボルが見つかる(後述)
    • ゴールドを発見できる
    • モンスターに攻撃する etc
  • クエストをクリアすると、そのクエストに応じたルーンが手に入る
    • エリア内に隠されている、クエストに応じたいくつかのシンボルを探し出すことでクリアできる
    • シンボルの隠し場所は「賢者の書」のヒントから読み取る
  • ルーンには魔力がこめられている
  • アドベンチャーに挑戦するには、そのアドベンチャーで必要となるルーンを手に入れる必要がある
  • クエスト/アドベンチャーへの挑戦順序はプレイヤーの自由。それぞれ難易度が付いている

実際にプレイしてみてのポジティブな感想

  • とりあえず杖を振れば、なんらかのリアクションがあるので楽しい
  • わからなかったらステータス画面へ、という誘導がゲーム全体を通して設計されている
  • 短い時間内で、自分の成長を実感できる
    • 最初はシンボルを見つけるために歩きまわることが多く、なかなか進められないが、徐々に土地勘がつかめてくると大体の見当がついてくるのでクリアが楽になる
  • プレイ順序がプレイヤーによって違うので、他の人の進捗を見て劣等感を抱くことがない
  • 普通にプレイしていると、ベテランプレイヤーがドラゴンと戦っているのを見える
    • ゲームのゴールを意識できるので、「はやく成長したい」と思える
  • そこそこ広いエリアを歩いて宝探しするだけで楽しい

改善できそうな箇所

  • チュートリアル動画が10分程度流れるが、必要な情報がのっていたか怪しい
    • アドベンチャーがクエストクリアだけでクリアできると思っていた
      • 一緒に行った人の7人中6人が勘違い。勘違いしなかった人は2回目の挑戦
    • 賢者の書に書かれているシンボルと、壁などに書かれているシンボルマークは同じ
      • 最初の20分間程度は、賢者の書にある文章だけで予想するものだと思っていた
    • チュートリアルにでてくるおじさんが怪しくて、そっちに気をとられる
      • あとなんとなくしゃべり方がムカつく
  • 普段着のまわりの人を見ると、世界観が崩れる
    • 杖だけでなく、マントがあるだけでもだいぶ違うんじゃないかと思う

総括

歴史が長いだけあって、ゲームシステムがよくできてた。 宝探しが好きな人だと絶対楽しいと思う。

ゼロからプロジェクトマネージャー試験に一発合格する方法

2年前にプロジェクトマネージャー試験を受け、合格した。 所要期間は1ヶ月。

累計勉強時間はだいたい60時間ていど。

平日 : 1h x 22 = 22h

休日 : 5h x 8 = 40h

試験を受けると決めたときの状態

  • 野良プログラマ歴2年
  • 半年前に高度技術試験を合格
  • プロジェクトマネージャーの経験なし
  • 正式な「プロジェクト」への参加経験なし。運用業務のみ
  • 小論文をこれまでの人生で書いたことなし

合格したあとのその後

  • プロジェクトのディレクター業務を任されるようになる
  • 新規開発のプロダクトマネージャーを任される ※ そもそも合格してなくても任されていたとは思う

合格するまでの手順

プロジェクトマネージャー試験を受ける意気込みを確認

一言でいうと、プロジェクトマネジメントとは何か、を知るため。 仕事をしていて、なんだか仕事の仕方がしっくりこない。 無駄なコミュニケーションが多く、作業効率が悪いし、 追加機能の実装がスケジュールどおりにできない。

そもそも自分のチームって、プロジェクトをうまくまわせてるの? っていうか、プロジェクトって何?という素朴な疑問から、 プロジェクトマネジメントの勉強ついでに試験を受けることに。

プロジェクトとは何かを確認

一番とっつきやすそうだったプロジェクトマネジメントの本。 おもしろかったので試験勉強中も他のシリーズを読んだ。 専門用語も出てきて、なんとなくこんな感じの仕事なのね、といろいろと刺激になる。

プロジェクトの基礎知識を得る

試験に合格することが目的ではなく、プロジェクトマネジメントを知ることが目的なので、 あせらず「PMBOK入門」を読む。

プロジェクトマネジメント標準 PMBOK入門 PMBOK第5版対応版

プロジェクトマネジメント標準 PMBOK入門 PMBOK第5版対応版

ひととおり読み、理解できたと感じたら過去問。

過去問を3年分おこなう

プロジェクトマネージャ完全教本 2015年版 (情報処理技術者試験)

プロジェクトマネージャ完全教本 2015年版 (情報処理技術者試験)

小論文はこの時点では飛ばす。 正解するしないにかかわらず、すべて解説を見る。

小論文対策

ここが一番オリジナルだと思っているところ。 自分の出発点が、小論文の経験なし、プロジェクトの経験なしなので、 自分の能力はまったく使わない。 すでに基本的な知識は得たので、純粋なる試験対策。

① 過去の小論文のテーマを確認し、傾向をつかむ

② 過去の午後Ⅰの問題文をひたすら読み、テーマに合いそうなキーワードと、文章構成をパクる

③ それらを分解し、①で出した傾向のテーマに合わせて文章モジュールをつくる

④ ③の文章を組み合わせて、小論文っぽい構成をつくる練習をする

それぞれの文章モジュールを組み合わせて、過去3年分のテーマに対応できたらOK。 とにかく、過去に出題された問題文の文章構成を真似すること。

ゲームの企画について

この2年間弱、ゲームの企画をやっていた。 その中で自分がまとめた、ゲームを開発するまでにどのように考えて、 どのように開発していくかをメモとして残しておく。

この記事では、最初にゲームのコンセプトを固めるまでにどのように行ったかを、ざっと記載する。

overview

  • 企画段階
    • ゲームコンセプトの決定
    • 代表的な2種類の方法
    • ゲームの全体像の企画

ゲームコンセプトの決定

代表的な2種類

  • コンセプトから入る手法

    1. コンセプトを元に2pagerを作成
    2. マーケットの勝ち組を調査
    3. ベンチマークアプリを決定。徹底的に調査
  • ターゲットから入る手法

    1. マーケットの勝ち組を調査し、どのような構造になっているか調べる
    2. それらを元にどのようなゲームにしたいか考える
    3. 誰をターゲットにして、どのように人を集めるか考える
    4. ターゲットが十分な広がりを持っているか確認する
    5. ベンチマークアプリの決定。徹底的に調査

ベンチマークアプリについて、調査する内容

  • ゲームコンセプト
    • ゲームの売り。だいたいアプリ紹介ページに書いてある
  • 想定ターゲット層
  • メインゲームループと、モチベーションの可視化
    • ゲームの最終目的に直結する機能の関連図
    • なぜそれがモチベーションになるのかの掘り下げ
    • 目的を達成するために、どのような機能が必要になっているか
  • ソーシャルチェイン (ソーシャル機能が入っている場合)
    • ソーシャル機能が完成するための相互関連図
      • 人と交流するきっかけ
      • 友だちを増やす利点
      • 友だちとコミュニケーションする場と、コミュニケーションの利点
  • Grossランキングの推移
  • ユーザーレビュー内容
    • どこが評価されているか
    • どこが不満に思われているか
  • 運用スケジュール
    • 理想的には以下の2つを用意する。 (攻略wikiなどから取得)
      • リリース直後3ヶ月の運用スケジュール
      • 直近3ヶ月の運用スケジュール
  • 初期リリースコンテンツ (wiki/AppStoreの更新情報から取得 ← AppAnnieだと過去のものまで確認可能)
  • アップデートコンテンツ (wiki/AppStoreの更新情報から取得 ← AppAnnieだと過去のものまで確認可能)

ゲーム全体像の企画

  1. ゲームのコンセプト決定。
  2. ターゲットの決定。
  3. 2pagerの作成 ※1
  4. リリース時期とプラットフォームの決定。
  5. ゲームの理想像を思い描く。最終的にどのように遊んでもらうかを考える
  6. チュートリアルを開始したあと、どのような順序でプレイヤーが理想像に近づいていくのかを明確にする
  7. 10pagerの作成 ※1
  8. 承認されれば、初期メンバーの収集
  9. 以降の作業と並行して、初期メンバーでコアループ部分のプロトタイプを作成する
  10. ゲームのコンセプトに基づく、プレイヤーのモチベーション決定
  11. 基本機能と、相互関連図の作成
  12. ソーシャルチェインの作成
  13. ユーザーストーリーの作成 ※2
    • プレイヤーLvがあるゲームであれば、Lvと開始からの日数のグラフをつくり、いつ頃にどのようなLvになっていてほしいかを明確にし、そこでどういう行動をして欲しいかを書く

※2pager,10pagerとは…レベルアップのゲームデザインはとても参考になる本だった::Colorful Pieces of Game

※ユーザーストーリーとは … 桝田方式によるユーザーストーリーの作り方(7)::Colorful Pieces of Game

ちなみに

やりたいことがたくさんある場合の対処法

モチベーションに結びつかない要素は、原則除外。 どれだけ単体で面白そうに見える場合でも除外。 もしも単体企画を新しく入れる場合は、既存の機能を全て見直し、相互に関連しているかを見直す。 ゲームの大枠から変更することも考慮にいれる。

【Xcode7.0】【swift2.0】環境準備〜実機でカメラを起動して写真撮影

最近(2年程度)がっつりエンジニアリングから遠ざかっていたので、勉強がてらiOSアプリを作成しようと思った。まずは慣れるために以下のようなシンプルなアプリをつくる。 今回のXcode7.0でお金を払ってデベロッパー登録しなくても、アプリが実機テストできるようになったようなので、beta版のXcode7.0を利用する。

要件

*アプリを起動するとカメラの起動。アプリ起動時にタップをすると撮影し、写真に保存

動作環境

手順

  1. Xcode7.0(beta 5)のダウンロード&インストール
  2. プロジェクトの作成
  3. ViewControllerに処理を追加
  4. 実機へのビルド
  5. 動作確認

Xcode7.0のダウンロード&インストール

Xcodeの公式サイトからダウンロードできる。画面にしたがってすすめていく。Xcode6系を利用していても別のアプリケーションとしてインストールされるので恐れずインストール。勝手にSwift2.0もインストールされる。 Xcode - ダウンロード - Apple Developer

プロジェクトの作成

「Shift+Command+N」で新規プロジェクトを作成。「Single View Application」を選択。適当にProduct Nameなどを設定。テストなどは今回行わない。

f:id:simpleplay:20150829140255p:plain

プロジェクト作成後の画面で、ビルドする端末の情報を記載する。

今回はiOS8.4.1の端末にビルドして動作確認するので、Deployment Targetをそのように設定。

f:id:simpleplay:20150829140247p:plain

ViewControllerに処理を追加

どうやって動かすかも分からないので、参考にするサイトの通りにViewController.swiftを編集。

002 カメラの起動と画像の保存 - Swift Docs

コピペしてビルドしてみると、以下のエラーが発生するので地道に調べながらデバッグ

Extra argument 'error' in call

AVCaptureDeviceInput Class Reference

今回のバージョンでswiftの返り値が変更されており、errorの返り値ではなく、例外が起こればthrowsを返すことになっている。エラーが起こっている箇所を以下のようにして、とりあえず動くようにする。

'layerWithSession' is unavailable: use object construction 'AVCaptureVideoPreviewLayer(session:)'

→ layerWithSessionsというメソッドがなくなっている。同ページにあるinitWithSessionsで代替 AVCaptureVideoPreviewLayer Class Reference

以下のコードでビルドできるようになるところまで確認。 シミュレータだと、カメラがわからないから強制終了されるので、実機にビルドして確認。

//
//  ViewController.swift
//  AVFoundation002
//

import UIKit
import AVFoundation

class ViewController: UIViewController {
    // セッション.
    var mySession : AVCaptureSession!
    // デバイス.
    var myDevice : AVCaptureDevice!
    // 画像のアウトプット.
    var myImageOutput : AVCaptureStillImageOutput!
    
    override func viewDidLoad() {
        super.viewDidLoad()        
        // セッションの作成.
        mySession = AVCaptureSession()
        // デバイス一覧の取得.
        let devices = AVCaptureDevice.devices()
        
        // バックカメラをmyDeviceに格納.
        for device in devices{
            if(device.position == AVCaptureDevicePosition.Back){
                myDevice = device as! AVCaptureDevice
            }
        }
        
        // バックカメラからVideoInputを取得.
        let videoInput: AVCaptureInput!
        do {
            videoInput = try AVCaptureDeviceInput.init(device: myDevice!)
        }catch{
            videoInput = nil
        }
        
        // セッションに追加.
        mySession.addInput(videoInput)
        // 出力先を生成.
        myImageOutput = AVCaptureStillImageOutput()
        // セッションに追加.
        mySession.addOutput(myImageOutput)
        
        // 画像を表示するレイヤーを生成.
        let myVideoLayer : AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session:mySession)
        myVideoLayer.frame = self.view.bounds
        myVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        
        // Viewに追加.
        self.view.layer.addSublayer(myVideoLayer)
        
        // セッション開始.
        mySession.startRunning()
        
        // UIボタンを作成.
        let myButton = UIButton(frame: CGRectMake(0,0,120,50))
        myButton.backgroundColor = UIColor.redColor();
        myButton.layer.masksToBounds = true
        myButton.setTitle("撮影", forState: .Normal)
        myButton.layer.cornerRadius = 20.0
        myButton.layer.position = CGPoint(x: self.view.bounds.width/2, y:self.view.bounds.height-50)
        myButton.addTarget(self, action: "onClickMyButton:", forControlEvents: .TouchUpInside)
        
        // UIボタンをViewに追加.
        self.view.addSubview(myButton);
    }
    
    // ボタンイベント.
    func onClickMyButton(sender: UIButton){
        // ビデオ出力に接続.
        let myVideoConnection = myImageOutput.connectionWithMediaType(AVMediaTypeVideo)
        
        // 接続から画像を取得.
        self.myImageOutput.captureStillImageAsynchronouslyFromConnection(myVideoConnection, completionHandler: { (imageDataBuffer, error) -> Void in
            
            // 取得したImageのDataBufferをJpegに変換.
            let myImageData : NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer)
            
            // JpegからUIIMageを作成.
            let myImage : UIImage = UIImage(data: myImageData)!
            
            // アルバムに追加.
            UIImageWriteToSavedPhotosAlbum(myImage, self, nil, nil)
        })  
    }    
}

実機へのビルド

Macbook airiPadをケーブルでつなぐと、Xcode画面のビルド先で、実際の端末を選択できるようになる。 ビルド先を選択してビルド。(Command + R)

動作の確認

とりあえず動作を確認できるところまではきた。

雑感

すぐに動くものが作れて楽しい。swiftもおもちゃみたいにコードが書けるので楽しそう。 これから開発を進めていくにしても、appleはドキュメントが充実しているので、特に本を買う必要はなさそうというのが印象。