2016年9月17日土曜日

[VRDevice] エラーの備忘録

Unityの設定をあれこれいじっていたら突然


[VRDevice] Initialization of device oculus failed.


こんなエラーが吐き出されて、実機でビルドすると落ちてしまう現象にはまったので備忘録。


Player Setting... > Android > OtherSettings > Virtual Reality Support

チェックを外したら直った!


いつも間にかチェックを入れてしまっていたのだろうか、、、

2016年8月14日日曜日

いまさらポケモンGO

いまさらながらポケモンGOについて。


社会現象になってた?ポケモンGOだけど、何がそんなに凄いのか、ゲーム作りのヒントになるかと思いダウンロードして、ちょいとハマってみた。




●職場は東京のど真ん中である千代田区はこんな感じ

























●23区外れた自宅付近はこんな感じ

























●お盆で帰省した田舎はこんな感じ


























<感想>

都内ではコンビニ以上にポケストップやらジムがありそれなりに楽しめた。
マクドナルドもジムになっている為か、仕事でたまに立ち寄る恵比寿のマクドナルドもほぼ満席、、、


一方、自宅付近ではときどきポケストップで桜が舞っているが、基本閑古鳥が鳴いてる、、、


ただし、図書館がジムになっているところでは、エアコンが聞いた中でジムバトルが出来る為か、ジムレベル8にも成長していたw


図書館恐るべし!



GoogleMapと連動しているシステムは面白いけど、エリアによってバラつきが出来てしまうので、
あくまで移動距離のみにスポットを当てたらまた違ったゲームが作れそう。

2016年7月17日日曜日

Unity学習Part2~Script編~

Unity学習を初めてそろそろ1ヶ月。

感想として、



とにかく楽でおもしろい!


libGDXに比べて、ゲーム作りに必要な便利グッツがなんでも用意されている。

こんなに裕福な家庭でぬるま湯に浸かってていいのか、と思うぐらい。

しかも、ゲーム作りがゲーム感覚で作れてしまうのがまたいい。

ガリガリコード書いて自分でロジック作り上げるのも楽しいけど、

Unity触ってしまうともうもとには戻れない気がする、、、



さて、せっかく勉強しているのでスクリプトの部分で勉強になったこともまとめておく。




<スクリプト編>

①キーの入力取得

 ・vector.x = Input.GetAxis("Horizontal") 左右カーソルキー(-1~1)

 ・vector.y = Input.GetAxis("Vertical")   上下カーソルキー(-1~1)

  Input.GetKey("z")                               zキー

  ・Input.GetButtonDown("Fire1")      画面タップやマウスのクリックを検知

 ※Fire1やHorizontalなどはInputManagerに事前設定されている入力名称
       Editメニュー → Project Settings → Input → Input Manager


②加速度センサー入力取得

 vector.x = Input.acceleration.x


③エディターと実機で処理を分ける

 ・if(Application.isEditor) {
         エディター処理
     } else {
   実機処理
     }

④接触検知

 ・OnTirggerEnter コライダ-にオブジェクトが入った

 ・OnTriggerExit   コライダ-からオブジェクトが外れた

 ・OnTriggerStay オブジェクト同士が接触している間、毎フレーム呼ばれる


⑤オブジェクトへ力を加える

 ・AddForce(direction * r.mass * 20.0f)
  ※directionは方向ベクトル


⑥ゲームがスタートしてからの秒数をfloat値で取得

 ・Time.time


⑦オブジェクトの位置に加算

 ・transform.Translate(100, 0, 0)
  x方向に100加算

 注:transform.position.x = 100 のように直接値を変更できない

 仮の変数にコピーする方法
 
 Vector3 pos = transform.position;
 pos.y = 100;
 transform.position = pos;


⑧Debugクラス

 ・Debug.Log関数   関数に渡した文字列とその場所のスタックトレースをConsoleビューで確認できる

 ・Debug.Break関数  呼び出されたタイミングでUnityプレビューを一時停止する



⑨プレファブからオブジェクトを動的に生成

 ・GameObject obj = (GameObject)Instantiate(プレファブ,位置,向き);


⑩Transformコンポーネントのforwardパラメータ

 ・Transform.forward  そのオブジェクトが向いている方向を取得


⑪RigidBody.AddTorque

 ・回転する力を加える

 RigidBody.AddTorque(new Vector3(0, 10, 0))
 y軸に10の力、すなわち水平に回転


⑫ランダム値取得

 ・Random.Range(0, 10) 0~10のランダム値取得


クリックもしくはタップした位置を取得

 ・Input.mousePosition 


⑭親オブジェクトの設定

 ・obj.transform.parent = parentobj.transform


⑮オブジェクト削除

 ・Destroy(obj)

 ※ゲームオブジェクトだけでなくオブジェクトにアタッチされたコンポーネントに対しても有効



⑯疑似マルチスレッドのコルーチン

 ・あたかも並列処理しているかのように動作させることが出来る。
  疑似マルチスレッドのようなもの。

  ・コルーチンを開始させる関数
   StartCoroutine(コルーチン型)  

  ・コルーチンを定義
  IEnumerator コルーチン () {
   yield return new WaitForSeconds(1.0f); ←
   処理内容
  }
   ※WaitForSeconds(1.0f) 引数で指定した秒数が経過するまでその場でフレームをスキップ


⑰LateUpdate関数

 ・すべてのUpdate関数の処理が終わった後に処理される


⑱線形補間関数でスムージング

 ・Vector3.Lerp(現在のポジション,目標のポジション,一定の割合で距離を縮める)


⑲オブジェクトの表示非表示

 ・obj.SetActive(false)  非表示になる


⑳シーンの切り替え

 ・using UnityEngine.SceneManagementを追加

 ・SceneManager.LoadScene("sceneName");

  ※Unity5.3でApplication.LoadLevel("sceneName")は非推奨になったらしい

 ・File → Build Settings → Scene In Buildリストへシーンファイルを追加しておく
  追加したいシーンを編集画面に表示した状態でBuild Settingsを開きAdd Currentボタンを押す
 
  ※一番上に設定したシーンが起動時の最初のシーンとなるのでTitleシーンを一番最初に追加


㉑enableフラグ

 ・enabled = false;

  そのコンポーネントの機能を停止(Updateを止める)する
  ※Inspectorビュー上のコンポーネント名の左側のチェックボックスと紐づいている


㉒Invoke関数で時間差処理

 ・指定秒数後に指定メソッドを呼び出す

  Invoke("method", 2.0f);

㉓簡易的なデータ保存

 ・PlayerPrefs.GetInt(”HighScore”)  HighScoreラベルの値をInt型で読込

 ・PlayerPrefs.SetInt(”HighScore”)  HighScoreラベルの値をInt型で保存


㉔SendMessageでみんなに知らせる

 ・同オブジェクトに追加されているコンポーネントにイベントを通知する

  SendMessage(”イベント名”, オプション指定);

 ※オプションにSendMessageOptions.DontRequireReceiverを指定することでメッセージを送った先にメソッドがなくてもエラーを出力しない


㉕Awake関数で一番乗り

 ・オブジェクトが生成された瞬間に呼ばれる為、コンポーネントの取得をすべてのオブジェクトのStart関数より早く行える

 ※Start関数はオブジェクトが生成後、初めてのフレーム前で呼ばれる為、厳密にはロスが生じる

 ※Awake関数内で他オブジェクトを操作するコードを書くとNull参照が起こる可能性があるので注意


㉖Main Cameraを参照する

 ・Main Cameraオブジェクトには、デフォルトでMain Cameraタグが設定されている為、以下コードで参照が出来る

  Camera.main.メソッド


㉗複数のAudioSourceを扱う

 ・エフェクトなどを鳴らす場合はAudioSourceコンポーネントを追加してAudio Clipパラメータへデータをセットするのだが、AudioSourceコンポーネントには一つのAudioClipしか設定できない為、複数のエフェクトを扱う場合は複数のAudioSourceコンポーネントを追加することになる。
複数のAudioSourceコンポーネントをScriptで扱うには以下のようにする


    //メンバ変数
    AudioSource jumpSound;

    AudioSource breakSound;
    AudioSource[] audioSources;

    void Start ()
    {
        //配列としてオーディオソース取得
        audioSources = GetComponents<AudioSource>();
   //※GetComponentではなく後ろにsを付ける
        jumpSound = audioSources[0]; 
        breakSound = audioSources[1]; 
   //※AudioSourceを追加した順番に配列に格納される
    }

    //ジャンプボタンが押されたらジャンプ処理実行
    void jump ()
    {
        //サウンド再生
        jumpSound.Play();

    }


    //何かに衝突したら死亡処理
    void OnCollisionEnter2D (Collision2D collision)
    {
        //サウンド再生
        breakSound.Play();

    }


㉘最大値と最小値をさくっと管理

 ・value = Mathf.Clamp(value, min, max);

  たったこの一文で指定範囲を超えたら最大値、最小値で補正してくれる優れもの!


㉙円で指定した半径の中だけで移動させる

 ・ pkayer : キャラクター
  center : 円の中心
  radius : 半径

  Vector3 dist = player.position - center.transform.position;
    dist = Vector3.ClampMagnitude(dist, radius);
    player.transform.position = center.transform.position + dist;

  ClampMagnitudeでベクトル間距離が指定した最大値以上にならないように管理






<あとがき>
Unity&C#初心者なもので、一冊読み終わるころには項目数が結構伸びてしまった、、、
思ったよりも便利な関数がたくさんあり、さすがC#、いやUnityのおかげかな。



2016年7月10日日曜日

Unity開発:XCodeでビルド出来ない



サンプルアプリも出来上がったのでiOS用にビルドして、


ブンブンうるさいMacminiへデータ移行


これでついにiOS用にアプリを動かせる~


と期待を込めてXCodeで読み込もうとすると



MapFileParser.sh: Permission deniedなるエラーログ吐き出し。。。

いろいろググってみるとここが参考になった


http://forum.unity3d.com/threads/mapfileparser-sh-permission-denied-not-set-as-executable-in-unity-4-6-8p1.352136/


どうやら、MapFileParser.sh ファイルに実行可能権限がないことが問題らしい。


ターミナルを使って対象ファイルに実行権限を付ければいいのだが、



Macでターミナルってどこにあるの?



そもそもコマンド忘れてる、、、


っでここ参考にしながらターミナル起動


http://techacademy.jp/magazine/5155

アプリケーションフォルダ > ユーティリティフォルダ > ターミナル.app 



っでプロジェクトファイルはデスクトップに置いてあるので以下コマンドでフォルダ移動

cd Desktop/[プロジェクトファイル名]

っで、ファイルに付いている権限を確認してみる

ls -l

問題のMapFileParser.shファイルの権限は以下の通りだった

-rw-r--r-- 

やはり実行権限を表す  がなかったので実行権限を以下コマンドで追加してやる

chmod +x MapFileParser.sh

コマンド実行後、再度権限を確認してみると、

-rwxr-xr-x

うん、ちゃんと実行権限が追加された。

改めてビルドしてみると、ちゃんと実機で動いた!!
感動です。


今回は慣れないコマンドまで使っただけあって、達成感が半端ねぇだで。



2016年7月3日日曜日

Unity学習Part1~オブジェクト編~

Unityも無料化されて手を出しやすくなったので手を出してみた。




さっそくAmazonさんと相談した結果



Unity5 3D/2Dゲーム開発実践入門 作りながら覚えるスマートフォンゲーム開発 
吉谷 幹人










この本でスタートダッシュ!




せっかくなので、勉強しつつ覚えた事をまとめてみようかと。



<オブジェクト編>


①アセットのインポート
 
 Assetsメニュー → Import Package → Custom Pacage

 インポートする素材にチェックを入れて右下のImportボタンをクリック


②オブジェクト

 ・Cube
  
  Hierarche → Create → 3D Object → Cube

  ※オブジェクト名変更はF2押しながら選択
  ※オブジェクトの複製はCtrl + D


コライダ―のみ範囲を変更する場合

 オブジェクト選択 → Inspector ビュー → Box Colliderコンポーネント → Edit Colliderボタンをクリック

 Sceneビュー中のコライダ―範囲(緑色の枠)をドラッグして編集


④マテリアル作成

 Project → Create → Material


⑤マテリアルにテクスチャ適用

 Material選択 → Inspectorビュー → Albedoへテクスチャをドラッグ&ドロップ
 
 ※直接色を指定する場合はAlbedoをクリックして色を指定する


⑥オブジェクトへマテリアルを適用

 オブジェクト選択 → Inspectorビュー → Mesh Renderer → MaterialsのElement 0 へマテリアルをドラッグ&ドロップ


⑦マテリアルの質感

 マテリアルを選択 → Inspectorビュー

  ・Metallicパラメーター     どれだけ金属らしいか、低いと土や石っぽくなる
  ・Smmothnessパラメーター  表面のなめらかさ


⑧周囲の映り込みを反映した鏡のような素材

 Hierarche → Create → Light → Reflection Probe


⑨各コンポーネント

 オブジェクトに対してコンポーネントを追加することで機能を上乗せできる

 ・Transformコンポーネント
  位置、大きさを扱う
  オブジェクトに対してデフォルトで設定されているコンポーネント
 
 ・Mesh Filterコンポーネント
  3Dの形を制御する機能

 ・Mesh Filterコンポーネント
  見た目をカメラに描画する機能

 ・Rigidbodyコンポーネント
  オブジェクトに物理挙動をさせる(重力など)

  オブジェクト選択 → Componentメニュー → Physics → Rigidbody

   ・Massパラメータ       物体の重さ(動きにくくなる)
   ・Dragパラメータ      空気抵抗(大きくすると翅のような遅い落下速度)
   ・Angular Dragパラメータ  回転に対する空気抵抗(回転が止まりやすくなる)
   ・Is Kinematicパラメータ   物理エンジンによって動かなくなる(Scriptで制御可能)
   ・Constraintsパラメータ   物理的な制約(指定した方向には動かなくなる)


⑩ある一点から物体を照らす光源

 Hierarchyビュー → Create → Light → Point Light

  ※Render Mode 
  そのライトが重要かどうかの設定
  重要でない場合は簡略化され負荷を下げる 


⑪透明のオブジェクト

 ・空のオブジェクト作成 
  Hierarche → Create → Create Empty

 ・空のオブジェクト選択 → Componentメニュー → Physics → Box Collider


⑫Rigidbodyのスリープ

 外部から力をくわえられない限り物理的な挙動はしなくなりCPU節約の為スリープモードになる

 スリープになることが都合が悪い場合は、スリープモードを解除する

 オブジェクト選択 → Editメニュー → Project Settings → Physics → Sleep Thresholdを0にする


⑬Physics Material

 物質的な材質を表現してゴムのように跳ねるボールなどを作成できる

 Projectビュー → Create → Phisic Material

  Bouncinessパラメータ  反発係数

 適用したいオブジェクト選択 → Sphere Colliderコンポーネント → Materialパラメータへドラッグ&ドロップ


⑭タグの設定

 Edit → Project Settings → Tags And Layers → Inspectorビュー → Tagsトグルから+ボタンで追加

 タグを設定したいオブジェクト選択 → Inspectorビュー → Tagをドロップダウンリストから選択





<Sceneビュー操作編>


 ・シーンギズモ
 
  右上に表示されているやつで各軸にカメラの向きを合わせられる。


 ・投影モード
  シーンギズモの下部にラベルで表示されている

  ○Perspectiveモード  シーンの奥行きなども考慮したパースがかかる状態
  ○Isometricモード    パースがかからない状態


 ・ライティングの設定

 Hierarche → Directional Light

  Intensityパラメータで明るさ調整

  Show Typeで影の有無

 
 ・環境光の調整

  Windowメニュー → Lighting → Inspectorビュー → Ambient Intensity



<その他設定編>

 ・エディターの変更

  Preferences → External tools → External Script Editorから変更

  ※デフォルトではMonoDevelopエディタ


 ・実機検証の為の設定

  Editメニュー → Project Settings → Player → Inspector → ビルドするプラットフォームのアイコンタブ選択

   ・Default Orientation 端末の向き設定

   ・Other Settings        プロジェクトを一意に識別する為のパッケージ名
                 ※Macでビルドする際に重要になる

2016年7月1日金曜日

Google Analyticswを使ってみる

さて、アプリをGooglePlayへ無事送り出すことが出来て、

GooglePlayDeveloperConsoleでダウンロード数や訪問者数とかは確認出来るし、

AdMobの管理画面で広告の表示回数とクリック数がチェックできるから楽しいんだけど、

やっぱりもっと詳しい情報知りたくなるもので、、



ってことで、Google Analyticsを組み込んでみようとチャレンジ!



https://developers.google.com/analytics/devguides/collection/android/v4/

ここの説明通りいろいろ手を加えてみた!
(正直もうGradleには触れたくなかったが)



① build.gradle(Project:プロジェクト名)にちょこちょこっとコード追加
   ・classpath 'com.google.gms:google-services:1.5.0-beta2'

② build.gradle(Module:android)にもちょこちょこ追加
   ・apply plugin: 'com.google.gms.google-services'
   ・compile 'com.google.android.gms:play-services-analytics:8.4.0'

③ダウンロードした 

google-services.json

ファイルをプロジェクトフォルダのandroidフォルダ直下へぶち込み



いざビルドしてみると、こんなエラー
















エラーログ:
Error:Gradle: Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/internal/zzpq;

Error:Gradle: Execution failed for task ':android:transformClassesWithDexForDebug'.

> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_45\bin\java.exe'' finished with non-zero exit value 2




しかも
build.gradle(Module:android)の

compile 'com.google.android.gms:play-services-base:9.0.1'compile 'com.google.android.gms:play-services-ads:9.0.1'compile 'com.google.android.gms:play-services-auth:9.0.1'compile 'com.google.android.gms:play-services-gcm:9.0.1'compile 'com.google.android.gms:play-services-analytics:9.0.1'



compile 'com.google.android.gms:play-services-base:9.0.1'

部分に波線が、、、っでこんなメッセージが、

All com.google.android.gms libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 9.0.1, 8.4.0. Examples include com.google.android.gms:play-services-base:9.0.1 and com.google.android.gms:play-services-analytics:8.4.0




いろいろググってみたもののいまいち解決につながるヒントなく、、、
とりあえず、Google翻訳様に通訳してもらうと、

すべてのcom.google.android.gmsライブラリは(混合バージョンは、実行時のクラッシュを引き起こす可能性が)まったく同じバージョンの仕様を使用する必要があります。見つかったバージョン9.0.1、8.4.0。プレイサービスベース:9.0.1とcom.google.android.gms:例としてはcom.google.android.gmsを含むプレイ-サービス-分析を:8.4.0 


要するに、、、

「9.0.1と8.4.0のバージョンが違うだら~」



っで、

compile 'com.google.android.gms:play-services-analytics:8.4.0'

の部分を

compile 'com.google.android.gms:play-services-analytics:9.0.1'

に書き換えたらビルド通った!!



あと、

apply plugin: 'com.google.gms.google-services'

これも削除しないとダメっぽい。


公式の説明通りにやればいいってものじゃないのか。。

トリック多すぎ



さてさて、あとはAnalyticsを組み込んだapkでリリースして、
無事訪問者の履歴が取得できれば問題ないのだが、、、
公式通りやってないのが一つ不安材料として残る。

2016年6月26日日曜日

AndroidGameリリースへ

初のandroidゲームが完成した。

その名も「AMAMORI」


ちょうど一年前にlibGDXを勉強がてらサンプルゲーム作りから始まって、ようやくリリースにこぎつけた!
長い長い道のり、、、

備忘録に載せるべきネタがたくさんあったにもかかわらず、一度データが吹っ飛んだおかげでネタも吹っ飛んだ。

よって、備忘録ではなくただの思い出を箇条書きにしてみようと思う。



1.『GDX Texture Packer』 を使ってテクスチャアトラスを半自動化させ作業効率UP!



2.フリーフォントを探しまくって、ゲームっぽいBitMapFont導入!


3.『Piskel』でドットキャラ作りまくり!



4.『Pixi Tracker』でSoundEffect作りまくり


5.Google、EclipseでAndroid開発サポート終了!
  に伴いAndroidStudioへお引越し

  ここからビルドエラーやらなんやらで2週間足止め、、、
  (ここんとこの備忘録たくさんあったのになぁ)


6.Google Play Developer Console へ登録
















7.そしてリリース  





レトロで暇つぶしゲーム、いわゆるカジュアルゲームを目指してみた。


でも結局、iPhone用にビルドできずAndroid専用となってしまった。



クロスプラットフォームも楽じゃない。