スマートデバイスプログラミング 第6回
色々なセンサーを使ってみよう

課題

(1)タッチ情報を取得してみましょう。 (2)加速度センサーの値を取得してみましょう。 (3)加速度センサーを使って、簡単な遊びを作ってみましょう。 (4)その他、プログラムを改良したり、学んだ技術を駆使して、何か面白いことをやってみましょう。
作ったC#のプログラムを添付してください。
(プロジェクトを保存したフォルダのasset以下にあると思います。
コメント欄には、どこまでやったかと、(3)のハイスコア書いてください。

  1. 新規プロジェクトを作る(「2D」プロジェクトを選びましょう)
  2. スクリプトを貼りつける、空のゲームオブジェクトを作りましょう
  3. 表示用のテキストを作りましょう
  4. 座標はx0,y0,サイズはw300,h300にしましょう
  5. colorを白く(rgbそれぞれ255に)しましょう
  6. 新規スクリプトを作成しましょう。名前はGameManagerで。
  7. スクリプトを編集しましょう。
    
    //3行目に追加
    using UnityEngine.UI;
    
    //class名が違っていたら上書き
    public class GameManager : MonoBehaviour {
    
    //入ってすぐのところに
    public Text t;
    
    //Update内を下記に
    void Update () {
      t.text = "touch:"+ Input.touchCount ;
      for (int i = 0; i < Input.touchCount; i++) {
        Touch touch = Input.GetTouch (i);
        t.text = t.text + string.Format("\nid:{0} x:{1:f1}y:{2:f1}", i,touch.position.x, touch.position.y);
      }
    }
    
  8. GameObjectにスクリプトをaddComponentして、tの欄にテキストをドラッグ&ドロップしましょう。
  9. UnityRemoteの設定をしましょう。Edit→ProjectSetting→EditorでDeviceの項目を変更します。
  10. 端末をUSBケーブルでつないでunityRemote4を起動
  11. アプリを実行してみましょう。
  12. タッチすると表示される情報が変わります(タッチ数、それぞれの座標が表示されます)。
  13. うまく動かない時は、端末を再接続、再起動、Unityの再接続、再起度を試みましょう。(Scene名はSensorsとして保存しておきましょう)
  1. 次に、加速度センサーを試してみましょう。
  2. Scriptを再度編集します。Update内を下記に書き換えてください。
  3. 
    //Update内を下記に
    void Update () {
      Vector3 acce = Input.acceleration;
      t.text = string.Format("x: {0:f4}\ny: {1:f4}\nz: {2:f4}", acce.x, acce.y, acce.z);
    }
    
  4. 保存して、実行してみましょう。
  5. 端末を上下左右に動かすと、値が変わります。
  6. センサーのxyz軸にかかっている加速度が表示されます。
  7. zがマイナス1になっているのは、重力がかかっているからです。
  8. xの値は左右に傾けると変わります。
  9. yの値は上下に傾けると変わります。
  10. 端末を上下左右にすばやく動かすと、加速が発生するので、値が変化します。
  11. たまにノイズが入るので、何フレームか計測して平均値を取って使うようにすると、より動きが安定します。
  • 次に、テニスボールを表示させ、携帯を傾けたら動くようにしてみましょう。
  • まずはテニスボールを表示してみましょう。
  • resフォルダを作成、画像をドラッグ&ドロップ(座標は0,0に)
  • SceneViewに画像をドラッグ&ドロップ
  • 新規スクリプトを作成して、YellowBall.csにして、下記を書き足しましょう。
  • 
    //Update内を下記に
    void Update () {
      Vector3 acce = Input.acceleration;
      float r = 1.0f;
      GetComponent<Rigidbody2D> ().AddForce (new Vector2 (acce.x *r,acce.y*r));
    }
    //※<>は半角に置き換えてください。
    
  • 画像のオブジェクトにscriptをaddComponetしましょう。
  • 画像のオブジェクトにrigidBody2DをaddComponetしましょう。重力は0にしてください。
  • 起動してみましょう。(画面を傾けることで、ボールが移動するようになります)
  • 赤いボールも追加して、赤いボールにrigidbody2Dと、circleCollider2dをAddComponentしましょう。
  • 手法は問いませんので、60秒以内に赤いボールに何回タッチできたかチャレンジするゲームをつくってみましょう。
  • YellowBallに足すプログラム。
  • 
    void OnCollisionEnter2D(Collision2D collision){
      if (collision.gameObject.name == "RedBall") {
        collision.gameObject.transform.position = new Vector3 ((Random.value - 0.5f) * 1.5f, (Random.value -0.5f) * 1.5f, 0);
      }
    }
    
  • 玉と玉が接触した際ワープするようになります。
  • Cameraのsizeは2にすると遊びやすいです。
  • RedBallの初期座標をx=1,y=0にしてみましょう。
  • RedBallのrigidBody2DのIsKinematicのチェックボックスにチェックを入れましょう。(赤いボールがワープ後動かないようになります)
  • あとは、タイムカウンター等はk03()からコピーしてきましょう。
  • 
    //3行目
    using UnityEngine.UI;
    
    //class入ってすぐ
    public Text t;
    int score=0;
    float time=60.0f;
          
    //Updateに足す
    time -= Time.deltaTime;
    if (time >= 0.0f) {
      t.text = string.Format ("score:{0} time:{1:f1}", score, time);
    } else {
      t.text = string.Format ("score:{0} finished!", score);
    }
    
    //接触時(玉をワープさせた時)の処理に足す
    if (time >= 0.0f) {
      score++;
    }
    
  • 新規にTextを作って(座標を0,0に変えて)、tのところにドラッグ&ドロップしてあげましょう。
  • よくある質問

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

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

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

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

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

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

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

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

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

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

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

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