スマートデバイスプログラミング 第10回
アプリを配信してみよう

アプリの配信ですが、SFCのwebサイトにapkファイルを置いて、
置いたurlにandroid端末からアクセスしてもらう方法が、
一番簡単な配信方法です。

(1)Androidアプリの公開

GooglePlayのストアに並べるには、色々準備が必要です。(かつお金も必要です)
・googleのアカウント
・デベロッパー登録(要25ドル、それを払う為のクレジットカード)
・アプリのアイコン
・ストアで表示するスクリーンショット、アプリの説明文
・宣伝用画像

費用がかかることもあり、説明は割愛します。
(検索すると手順を説明が書いてあるサイトが出て来ます)

(2)iOS向けアプリの公開

iOSのストアに並べるのも、同様の準備が必要となります。
・AppleID
・developer登録(要年間100ドル、それを払う為のクレジットカード)
・各種アイコン
・スクリーンショット、説明文

公開に審査がありますし、審査に時間(2~3週間)がかかります。
また、ガイドラインに即した内容で作る必要があります。
・https://developer.apple.com/jp/support/appstore/app-review/

費用がかかることもあり、説明は割愛します。
(検索すると手順を説明が書いてあるサイトが出て来ます)


β版しか出ていませんが、xcode7を使うと無料で実機デバッグできる
(=実機で動かして試せる)ようです。

unityのFile→BuildSettingでセッティング画面を出してiOSを選んで
「Build」ボタンを押すと、フォルダ名を聞かれます。
フォルダ名を指定すると、xcodeで開けるプロジェクトフォルダが生成されます。

できたフォルダをxcodeで開くと、buildできたりエミュレータでの実行、
その他もろもろ、できるようになります。
(正式にリリースされたらテキストの実機で動かす回に追記予定ですが、
興味のある方は色々試してみてください)

今回は、ガイドラインに即したアプリが作れるよう、
リリースまでに知っておいた方が良いこと、最終課題で有効に使えそうな
ことを学びます。

課題

(1)タイトル画面用のシーン、ゲーム用のシーンを作成して、切り替えられるようにしてみよう。
(2)Canvasをコピーしてpause用のCanvasを作り、ボタンを押したら表示を切り替えられるようにしてみましょう。
(3)Unityアセットストアにアクセスしてみましょう。
(4)学んだことを使って、何か作ってみましょう。
作ったC#のプログラムを添付してください。
(プロジェクトを保存したフォルダのasset以下にあると思います。
コメント欄には、どこまでやったかと、最終課題に向け、追加で教わっておきたいことがあれば書いておいてください。(スマートデバイスプログラミング向け、かつ、希望が多い物については、サンプルを追加で用意する予定です)

  1. 複数のシーンを使ったアプリを作ってみましょう。タイトル画面とゲーム画面を分ける想定です。
  2. 新規プロジェクトを作る(「2D」プロジェクトを選びましょう)
  3. スクリプトを貼りつける、空のゲームオブジェクトを作りましょう(GameObject→Create Empty)
  4. 情報表示用のテキストを作りましょう(GameObject→UI→Text)
  5. 座標はx0,y0,サイズはw300,h300にしましょう
  6. Text欄には「タイトル画面」と入力してください。
  7. CharacterのFontSizeを40にして文字を大きくしましょう
  8. ParagraphのAlingmentが2種類設定できるので、それぞれ中央のボタンを押しましょう。画面中央に文字が来るようになります。
  9. 新規スクリプトを作成しましょう。名前はTitleManagerで。
  10. スクリプトを編集しましょう。
    
    //class名が違っていたら上書き
    public class TitleManager : MonoBehaviour {
    
    //Update内を下記に
    void Update () {
      if (Input.GetMouseButtonDown (0)) {
        Application.LoadLevel ("Game");
      }
    }
    
  11. TitleManageをGameObjectにAddComponentして実行してみましょう。
  12. 起動して、画面をクリックすると、アプリが一時停止状態になります。
  13. "Game"というシーンが無いので、エラーが出て停まっている状態です。
  14. (クリックしても何も起きない場合は、AddComponentし忘れ、またはプログラムミスを疑いましょう)
  15. Gameのシーンを作る為に、シーンに名前をつけて保存しましょう。(File→SaveSceneでTitleと名前を付けて保存)
  16. 新しいシーンを作りましょう。File→NewScene
  17. 空のゲームオブジェクト、テキスト(サイズ等はTitle画面と同じで作り、Text欄には「ゲーム画面」と入力)を設置しましょう。
  18. 新規スクリプトを作成しましょう。名前はGameManagerで。
  19. スクリプトを編集しましょう。
    
    //class名が違っていたら上書き
    public class GameManager : MonoBehaviour {
    
    //Update内を下記に
    void Update () {
      if (Input.GetMouseButtonDown (0)) {
        Application.LoadLevel ("Title");
      }
    }
    
  20. GameManageをGameObjectにAddComponentして実行してみましょう。
  21. 先ほどと同じく、クリックするとエラーが出て一時停止状態になります。
  22. シーンを遷移する為には、BuildSetteingにシーンを登録する必要があります。
  23. まず、ゲーム画面もシーン名をつけて保存しましょう。(File→SaveSceneでGameと名前を付けて保存)
  24. 次に、ProjectViewのAsset以下にあるTitleという名前のUnityアイコン(これがSceneです)をダブルクリックして、Titleのシーンを開いてください。
  25. File→BuildSettingsを選んで、BuildSettingsの窓を出して、「Add Current」ボタンを押すと、Titleが追加されます。
  26. BuildSettingsの窓を閉じて、今度はGameのシーンを開いてから、再度BuildSetting窓を出し、「Add Current」ボタンを押しましょう。
  27. これで、GameとTitleのシーンがビルド時に組み込まれるようになり、シーンを行き来できるようになります。
  28. 実行して画面をタップしてみましょう。ゲーム画面←→タイトル画面を行き来できるようになります。
  29. (補足)実行ファイルを作ってアプリを起動した時、最初に「Add Current」したシーンが実行されます。実行順序をいじりたいt時は、BuildSettings窓でDelキーを押すと追加したシーンを消せますので、消去して登録しなおしてください。
  30. (補足)シーン遷移により、すべての変数の値が破棄されます。
  31. (補足)シーン間で値を共有したい場合は、前回使ったPlayerPrefsを使って保存領域に一旦保存して、新しいシーンで読み込むのが、シンプルかつ簡単です。(他にも方法はあります)
  1. Canvasにボタンを配置しましょう。右上に置きましょう。
  2. ボタンの文字はPauseにしてください。
  3. Canvasを右クリックして、コピーを選んで、ペーストしましょう。
  4. Canvas1という名前の物ができるので、PauseCanvasに変えましょう。
  5. テキストについては「ポーズ画面」に変更、ボタンの文字もPauseからUnPauseにしましょう。
  6. 文字、ボタンの座標をずらすと切り替えが分かりやすいです。
  7. スクリプトを編集しましょう。
    
    //3行目に追加
    using UnityEngine.UI;
    
    //class名が違っていたら上書き
    public class GameManager : MonoBehaviour {
    
    //クラス入ってすぐのところに変数の宣言を追加
    GameObject pauseWindow;
    GameObject canvasWindow;
    
    //Start内を下記に
    //<は半角に戻してください。
    void Start () {
      pauseWindow = GameObject.Find ("PauseCanvas");
      canvasWindow = GameObject.Find ("Canvas");
      pauseWindow.GetComponent<Canvas> ().enabled = false;
    }
    
    //Update内のTitleに戻る命令はコメントアウトしましょう(優先して実行されてしまうため)
    void Update () {
      if (Input.GetMouseButtonDown (0)) {
    //    Application.LoadLevel ("Title");
      }
    }
    
    //ボタンを押した時のメソッドを追加
    //<は半角に戻してください。
    public void changePauseState(){
      if(canvasWindow.GetComponent<Canvas> ().enabled){
        pauseWindow.GetComponent<Canvas> ().enabled = true;
        canvasWindow.GetComponent<Canvas> ().enabled = false;
      }
      else {
        pauseWindow.GetComponent<Canvas> ().enabled = false;
        canvasWindow.GetComponent<Canvas> ().enabled = true;
      }
    }
    
  8. ボタンがクリックされた時に、changePauseStateが呼ばれるようにしましょう。
  9. pauseボタン、unpauseボタンそれぞれで設定が必要です。
  10. (OnClickの欄で「+」を押して、「None」を選んでGameObjectを選択、「NoFunction」を選んでGameManager以下のchangePauseState選択)
  11. プログラムを実行してみましょう。表示されるwindowがボタンを押す度に切りかわるようになります。
  1. 次に、Unityのアセットストアにアクセスしてみましょう。
  2. https://www.assetstore.unity3d.com/jp/
  3. 絵のデータ、音のデータなど、こちらで入手可能です。
  4. それ以外にも、プログラム、シーン、3Dモデル、その他もろもろ、ゲームで必要な素材は入手できます。
  5. 無料の物と有料のものがあります。作った物をストアで売ることもできます。
  6. DLするにはアカウントが必要です。(無い人は作成する必要があります)
  7. 最終課題ではアセットストアから入手した物を使用して構いません。ただし、何を使ったかはreadmeに明記してください。

よくある質問

スクリプトを更新したのに、InspectorViewの変数が増えない

プログラムが間違っていてビルドエラーが出ている可能性が高いです。

エディタ上でbuildしてみましょう。

{}の対応が間違っていないか、全角スペースが入っているかなど、確認してみましょう

ビルドエラーが出ていないのに、スクリプトをobjectに追加できない

classの大文字と小文字が違っている可能性があります。

エディタのbuildエラーが出ませんが、Unityでは読み込めない、という状況が確認されています。

保存して再度開いたらブロックやボールが消えた

unityの仕様(不具合)かなと思います。

BG(背景画像)の描画優先度を下げることで解決します。

BGのInspectorViewでOrder in Layerを-1にしてください

(テキストの手順にも追記しておきました)