スマートデバイスプログラミング 第9回
カメラ機能を使ってみよう

GameCanvasについて

・GameCanvasの機能:今週使う変数、メソッド


<古いgameCanvasの情報です>
  ・int gc.CameraDeviceCount;
   ・カメラの数
  ・gc.StartCameraService(int camera_id)
   ・カメラの映像入力を有効にします。
  ・gc.StopCameraService()
   ・カメラの映像入力を無効にします。
  ・string gc.GetCameraDeviceName(int id)
   ・カメラの名前
  ・gc.DrawCameraImage(x,y);
   ・カメラ画像を座標xyに描画します。
  ・gc.DrawScaledRotateCameraImage(x,y,sizex,sizey,rot);
   ・カメラ画像を座標xyにsizex,sizeyの画像としてrod度回転して描画します。
<古い情報ここまで>

    ・gc.PlaySound(GcSound);
   ・BGM,SEを鳴らす命令です。
   ・引数はGcSound.XXXという形で指定します。
    (XXXはResフォルダ内のwavファイル名)
   ・音を追加したい場合は、下記の手順で追加します。
    ・wavファイルまたはmp3ファイルを用意
    ・Project窓でResフォルダを状態で、ファイルをドラッグ&ドロップ

    ・gc.PlaySound(GcSound,GcSoundTrack,bool loop);
   ・複数の音を同時に扱いたい時やループ再生させたい時に使います。
    (BGMを流しつつSEを鳴らしたい時など)
   ・2つ目の引数は以下の何れかを指定してください。
    GcSoundTrack.BGM1
    GcSoundTrack.BGM2
    GcSoundTrack.BGM3
    GcSoundTrack.Master
    GcSoundTrack.SE
   ・3つ目の引数はtrueにするとループ再生、falseにすると1回のみ再生します。
   ・引数1つのPlaySoundはGcSoundTrack.Masterで再生します。

    ・gc.StopSound(GcSoundTrack);
   ・鳴らした音を停める命令です。
   ・引数は以下の何れかを指定してください。
    GcSoundTrack.BGM1
    GcSoundTrack.BGM2
    GcSoundTrack.BGM3
    GcSoundTrack.Master
    GcSoundTrack.SE



    ・gc.Save(int key,int value);
    ・keyというidで数値valueを保存領域に保存します。



    ・int gc.TryLoad(id key); //旧gc用
    ・保存領域にkeyというidで保存された数値があれば、値を返します。



    ・gc.TryLoad(id key, out value);//新gc用
    ・保存領域にkeyというidで保存された数値があれば、値をvalueに入れます。

課題

(1)カメラの映像を画面に表示させてみましょう。
(2)課題7のプレイヤーをカメラ画像に変えてみましょう。
ついでに、playerの速度を3に、敵の出現数を、最初は5体、
10秒経過するごとに1体増える(最大10体)にと、バランスを変えてみましょう。
(3)音を鳴らしたり、ハイスコアを保存領域に保存できるようにしてみましょう。
(4)その他、プログラムを改良したり、学んだ技術を駆使して、何か面白いことをやってみましょう。
作ったC#のプログラムを添付してください。
(プロジェクトを保存したフォルダのasset以下にあると思います。
コメント欄には、どこまでやったかと、ゲームが動いた人はハイスコアを書いてください。

課題の進め方

前回、apkが作れなかった人、xcodeを用いてうまく実機で動かせなかったmax&iOSユーザーは、前回の課題の問題解決から始めましょう。
「課題の進め方」
※今回は第9回なので、フォルダはk09に改名してください。
サンプルの起動を確認し、スクリプトが編集できる状態になったら、
続きを読み進めてください。

課題1をやってみましょう(新gameCanvas用)

  1. プログラムを編集

    (クラスに入った直後)に変数の宣言を足す

    
        int camera_id=0; 
        int camera_num;
        string camera_name= ""; 
        GcCameraDevice? m_Camera;
    

    (InitGame()の中)に初期化処理を足す

    
            gc.SetResolution(640,480);
    
            if (gc.HasUserAuthorizedPermissionCamera)
            {
                PlayCamera(0);
            }
            else
            {
                gc.RequestUserAuthorizedPermissionCameraAsync(success =>
                {
                    if (success)
                    {
                        PlayCamera(0);
                    }
                    else
                    {
                        camera_name = "Error: no permission";
                    }
                });
            }
    

    (UpdateGame()の中)に下記の行を足す

    
    if (gc.GetPointerFrameCount(0) ==1 ){
      camera_id++;
      if (camera_id >= gc.UpdateCameraDevice()) camera_id= 0; 
     PlayCamera(camera_id);
    } 
    

    DrawGame()の中に下記の行を記載

    
    gc.ClearScreen();
    gc.DrawCameraImage(m_Camera,0f,0f,0.25f,0.25f,0f,true);
    gc.DrawString(camera_name,0,0);
    

    クラスを閉じるかっこの手前にメソッドを追加

    
        void PlayCamera(int id)
        {
            if(id>= gc.UpdateCameraDevice()){
                id = 0;
            }
    
            if (gc.TryGetCameraImageAll(out var devices))
            {
                m_Camera = devices[id];
                camera_name = m_Camera.DeviceName;
            }
            else
            {
                camera_name = "Warn: no camera";
            }
        }
    
  2. セーブして実行してみましょう。
  3. カメラが付いているPCの場合、カメラ映像が表示されます。
  4. unityRemoteで実行したり、apkを作ったり、 xcodeでビルドしてiOS端末で動かしたもしてみましょう。
  5. (apkで画面が真っ白になってしまう人は、一度アプリを終了してから再度起動してみてください)

課題1をやってみましょう(古いgameCanvas使用者用

  1. プログラムを編集

    (クラスに入った直後)に変数の宣言を足す

    
    	    int camera_id; 
    	    string camera_name; 
    

    (InitGame()の中)に初期化処理を足す

    
            gc.SetResolution(640, 480);
    	camera_id = 0; 
    	camera_name = gc.GetCameraDeviceName(camera_id); 
    	gc.StartCameraService(camera_id); 
    

    (UpdateGame()の中)に下記の行を足す

    
    if (gc.GetPointerFrameCount(0) ==1 ){
      camera_id++;
      if (camera_id >= gc.CameraDeviceCount) camera_id= 0; 
      camera_name = gc.GetCameraDeviceName(camera_id); 
      gc.StartCameraService(camera_id); 
    } 
    

    DrawGame()の中に下記の行を記載

    
    gc.ClearScreen();
    gc.DrawScaledRotateCameraImage(100, 100, 25, 25, gc.CurrentCameraRotation); 
    gc.DrawString(camera_name, 15, 15); 
    
  2. セーブして実行してみましょう。
  3. カメラが付いているPCの場合、カメラ映像が表示されます。
  4. unityRemoteで実行したり、apkを作ったり、 xcodeでビルドしてiOS端末で動かしたもしてみましょう。

課題2のヒント


DrawImageの代わりにDrawCameraImageを使いましょう。

(新しいgameCanvasの方はこちらを使用)
gc.DrawCameraImage(m_Camera,player_x,player_y,0.1f,0.1f,0f,true);

(古いgameCanvasの方はこちらは使用)
画像が大きすぎる場合はgc.DrawScaledCameraImageを使いましょう。
(0.1f倍にしてから調整してみましょう)
gc.DrawScaledRotateCameraImage(player_x,player_y,5,7,gc.CurrentCameraRotation);


バランスの変更は下記を参考にしてみましょう。

int player_speed = 3;
int active_box_num = 0;

active_box_num = 5 + count/600;
if(active_box_num > BOX_NUM){
  active_box_num = BOX_NUM;
}

//箱を動かすfor文の繰り返し回数を変えましょう
// BOX_NUM から active_box_numに変える
for(int i = 0;i < active_box_num; i++ ){
  //繰り返す内容(箱を動かす、プレイヤーとの接触判定)
}

課題3のヒント

下記を適宜配置したりなどしてみましょう。
//変数宣言に追加
int high_score = 0;

//initGame内に追加
gc.TryLoad("hs",out high_score);

//updateGameの中
//scoreが変った時に呼ぶ
if(score>high_score){
  high_score = score;
}

//ゲームオーバーになったタイミングで呼ぶ
gc.Save("hs",high_score);

//別途、音を鳴らしたいタイミングで以下を呼びましょう
gc.PlaySound(GcSound.Click1);

//音をループ再生させたい時、音を停めたい時は以下の命令を入れます
//例えば、ゲームオーバーになった時に鳴らす、
//ゲームオーバー画面でクリックすると停まる、など。
gc.PlaySound(GcSound.Click2,GcSoundTrack.BGM1,true);
gc.StopSound(GcSoundTrack.BGM1);

//drawの中
//ハイスコアも表示してあげましょう。(ゲーム中、終了時)
gc.DrawString("HIGH:"+high_score,0,60);


課題4のヒント

より良くする案を考えてみましょう。

補足

よくある質問

スクリプトを更新したのに、何も変わらない

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

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

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