主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity
ラベル Unity の投稿を表示しています。 すべての投稿を表示
ラベル Unity の投稿を表示しています。 すべての投稿を表示

2016年5月31日火曜日

MacでUnityのmeta(隠し)ファイルを表示する


  • Windowsと違い、Macで隠しファイルを表示するにはターミナルからの操作が必要(参考)
  • なお、隠しファイルを表示するとデスクトップに.DS_Storeが表示されて気になる(参考)

2016年5月27日金曜日

MMD4MecanimFaciemの研究

Mebiustos様のブログ

■ノウハウ

細かい部分は上記リンクの通り。出力したアニメーションクリップは、出力元のMMDモデル専用のアニメーションとなっている。なので出力元のGameObjectにアニメーターを持たせ、そのアニメーターに出力したアニメーションクリップを配置する。


今回やりたいことは、弓を引くモーションに合わせて弓のMMDモデルをしならせること。なので、弓を引くアニメーションにアニメーションイベントを持たせ、そこで弓のアニメーターを制御することにした。下図のアニメーションイベントは左から順に、①弓の引き始めのモーション呼び出し、②(弓を放った為)弓の形状を元に戻す、③弾丸プレハブの呼び出し、④弓の形状を杖に戻す(そういう仕様の武器)。


なお、当初はbool代数で管理しようとしていたが、アニメーションイベントはbool代数を引数とする関数は呼出せなかったので、int型で管理することにした。

出来上がりは次のような感じなのだが、今回お借りした弓のMMDモデルには「矢」が同梱されており、モーフ制御では仕様上隠しきれない。


モデルはボーン単位で管理されているので、矢のボーンのscaleを0にすることで対応した。


最終的な結果がこちら。ちゃんとモーションに同期しつつ、矢を隠すことができている。


2016年5月26日木曜日

リリースしたアプリのバグ対応(Android編)

iPhone実機でもUnityでも正常に動くから、Androidでも正常に動くだろうと思っていたが甘かった。Androidを持っている友人に確認してもらったところ、学習を開始すると「時間切れ」でループするとのこと。

かなり前に購入したAndroidのタブレット端末でデバッグできないかトライしてみた。


タブレット用のスクリーンショットはアップロードしてなかったが、Google Playで検索したら普通に出てきた。そして普通にインストール&起動ができた。どうやら特別な対応をしなくてもタブレットで動くらしい。

実機で確認してみた感想としては、SQliteのDBが読み込まれてない気がする。現象から見て真っ先に気になるのは、StreamingAssetsへのアクセス。

とりあえず手元のタブレットで確認出来る事が分かったので、引き続き調査。

  • クローズドベータテストのやり方(参考)
    • 公開しないとベータテスト用のURLが提供されない
    • 製品版を公開中止にして、ベータテストのみ受け付けるということはできない模様
    • バージョンをカウントアップしたり、アップデートされるのを待たなきゃいけなかったりと大変なのでUSB転送を利用した方が良い
  • USBで端末に転送する(参考)
    • 予想以上に簡単にできた
  • Mono Developを使うとブレークポイントが設置できて便利(参考)

結果

  • データベースのコピーは正常に行われていた
  • splits.dllはApple製品には標準装備だが、それ以外の端末には初めから入っていない。これを同梱しなかったことが原因と思われる。ただ、これが意外と根深い問題のため現在試行錯誤中。
  •  多分、このあたりの話が絡んでくるのだと思う(参考)
  • 最終的にこちらのプラグインを利用させてもらうことで解決した(参考)


2016年5月25日水曜日

リリースしたアプリのバージョンアップ(Android編)


  • 基本的な流れ(参考:左側メニューの「APK」)
  • ビルド毎に電子署名のパスワード入力が必要
    • Unityを終了するとパスワードがリセットされる模様
  • バージョンとバージョンコードを更新してからビルドすること
    • バージョンが1.0.0のような表記をするのに対し、バージョンコードは1のような正の整数で表記する必要がある模様。必ず1づつカウントアップしていく。(参考)

2016年5月24日火曜日

アプリリリース(Android編)

  • 基本的な流れ(参考)
  • Android SDKが必要(参考、参考2)
    • ビルド時にSDKを見つからなかった場合は、インストール先のフォルダ指定を要求される(公式マニュアル該当ページ末尾)
    • 公式ページに行くとAndroid StudioやJDKは見つけられても、SDKが見つけられないのでちょっと彷徨った。Android Studioのページの末尾(Download Options)にSDKだけダウンロードできる場所がある。


    • DLしたSDKフォルダのtools中にAndroidと言うファイルがあるので、これをダブルクリック。インストールするパッケージを選ばされるので、初めからチェックが付いているものをインストールする。(参考)
    • インストール時にはパッケージごとに規約の同意が必要
    • このインストールだけで1時間近くかかった。SDKのフォルダを確認してみたら32GBになっていた。重すぎ。Unityでパスを指定すればいいだけだから、外付けHDDに移そうと思う。
    • SDKインストール後は正常にビルドできた。
  • UnityのPlayerSettingsにあるPublishingSettingsのKeyが初期状態だとunsignedになっている。この状態でもビルドできるが、GooglePlayにアップロードした時に弾かれる(参考)。
  • 電子署名の組織名などは、個人の場合は未入力でOK(参考)
  • GooglePlayの登録時には「ヘッダー画像(横1024 x 縦500)」が必要。無料の背景素材に文字を入れて加工して作成した。
  • GooglePlayのアイコンの大きさは512x512で、iTunesよりは小さくて済む
  • レーディング方式が変わった模様。別項目に存在する「コンテンツのレーディング」に回答すると自動で適用される。
  • 教育向けGooglePlayの定義が厳しくなっていた。英語学習アプリだが、「Google Play for Education」の定義に当てはまらなかったのでチェック入れなかった。
  • 同意事項に「マーケティングの除外」という良く分からない項目がある。要は「Google社はGooglePlay以外では登録された画像等は使わないから安心してね。裏を返すと、GooglePlay内ではGoogle社の判断で勝手に宣伝することもあるよ」ということらしい(参照)

2016年5月22日日曜日

MMD4Uの研究

MMD4Uでステージなどのモデルを取り込めば、影を落とせるのではないかと考えた。現在でもMMD4Uが使えるというエントリーがあった(参考)。

  • Unityにインポートするとエラーが出るが、それをコメントアウトすると確かにエラーが消えた。
  • しかし、いざプレハブに変換するとエラーが発生して消えなかった。
    • もしかしたら、Windowsなら発生しないのかもしれない。



2016年5月19日木曜日

アプリリリース (iOS編)

基本的な手順

  • アプリ名の設定(参考)
  • Texture Typeの変更(参考)
  • iPhone/Android override(参考)
  • iconの設定方法(参考)
  • その他リリースに必要な設定(参考)
  • 登録関係(参考1、参考2、参考3)
  • iTune Connectのスクリーンショット関連
    • Launch Kit等(参考)
    • iMage Tools(参考)
    • X-codeのiOSシミュレーター(参考)

実際やってみて詰まったところ

  • AppIDを作る時にチェックを外せない項目がある

  •  XcodeのAppIconを見ると一部空になっているが特に問題無し
  • Achieveのやり方が分かりづらい(参考)
  • Achieveで表示されるBinary and Entitlementsの名前がどこで設定したものか不明
  • Validateの場所が分かりづらい

  • "Upload to AppleStore"直後に"Missing Push Notification Entitlement"についての警告メールが届く。内容としては「送ってもらったものは受理したけど、プッシュ通知機能つけてるよね。署名にはプッシュ通知使わないってあるよ。…プッシュ通知つけてなければ気にしなくていいよ」というもの。…どこで設定するんだろう。とりあえず無視(参考)。

地獄のiTunes Connect編

  • iTunes Connectのビルドの場所が不明。そして、自動でビルドされているっぽい。→数分後にビルド完了の通知が来た。やはりビルドは自動化されたとみて良さそう。

  • iTurns用の1024x1024のアイコンが必要。解像度高過ィ!

  • とりあえず項目を埋めて「審査」ボタンを押してみると、最後に幾つかの確認を求められる。
    • コンテンツ配信権がよく分からず悩んだ。著作権全般らしいので、とりあえず素材等を使っていることから「はい」を選んだ。
    • このほか広告を使用しているかという項目があるが、将来使う予定でも今使っていなければ「いいえ」にしなければいけないとのこと(参考)



iTunes Connectのスクリーンショット用意が、かなり苦行

  • 各解像度の画像が個別に必要
  • iTunes Connectの何処で設定するのか分かりづらい
  • X-codeのwindow > deviceからスクリーンショットの撮影が可能。画像はデスクトップに保存される。(参考)
    • しかし、ボタンを押したタイミングと撮影のタイミングが一致しない
  • Quick Time Playerで動画にしてからスクリーンショットに撮る
    • 影がつく
    • 影はoptionを押しながらクリックすると影無しになる(参考)
    • 動画1つを用意すれば、どの端末でも同じに表示されるのでは?
      • 動画の解像度も合わせなければ行かない模様
    • 結局、iMage Toolsを使った
      • 一括してリサイズできるので便利
      • 3.5インチはアクペクト比崩れるので横長になるが諦めた iMage Toolsのストロークを使えば縁取りを追加することが可能。これで余白を追加した後、プレビューで画像をコピー→サイズ変更→ペースト→位置調整をすれば、余白を追加できる。

    • 一応iPadのスクリーンショットも用意したが、iPad非対応であれば不要とのことだった。(どこで設定したかもはや覚えていない)


    • 進捗ステータスの最終段階は「配信準備完了(Ready for Sale)」(参考)
      • ただし、設定した配信開始日になってリリースされることになる
      • レーティングの設定に問題があると配信されない
      • iOS用のアプリの場合、PCのAppleStoreには表示されない模様
        • このせいで一向にリリースされていないと思っていた
    • 提出してから4日でリリースされた。想像していた以上に早い。
      • 5/20:提出
      • 5/22:レビュー待ち
      • 5/24, 朝2時:レビュー中
      • 5/24, 朝8時:配信準備完了

    2016年5月18日水曜日

    AudioSourceの管理について

    次第に手を焼くであろうAudioSourceの管理。どの音楽ファイルも一律AudioSourceで表示されるので分かりづらい。

    AudioSourceがアタッチされたオブジェクトが参照されるので、AudioSource毎にオブジェクトを作成し、そのオブジェクトに管理しやすい名前をつけてあげるのが一番分かりやすいように思う。


      完成形はこんな感じ。

    <追記>
    2DゲームやUIの音であれば、シングルトンのクラスを作ったほうが便利(参考)。ただし3D効果を利用する場合は、この手法だと一律同じ場所から聞こえてしまう。3Dの場合は音源となるオブジェクトにAudioSourceコンポーネントを付与することを考える必要がある。

    2016年5月16日月曜日

    MMDのモーション(VMD)利用 with MMD4Mecanim

    1. FBXのRigをHumanoidにAplayしてから、アニメーションファイルを複製で取り出す。このようにしないとHumanoidでモーションを使い回すことができない。(ただし、汎用モーション化しなければ、MMDの物理演算にしたがって髪の毛などがちゃんと動く。使いまわさないなら専用モーションのままでいいかも)
    2. モーションの一部だけを利用したい場合、キーが大量にあるので、これを削除したり動かしたりするとかなりのマシンパワーが必要になる。
    3. FBXに紐付けされたアニメーションクリップは開始位置と終了位置が指定可能。ここで指定した上でcommand+D(windowsの場合はCtrl+D)で複製すると、任意の箇所のモーションをアニメーションとして取り出すことができる(参考)。

    • 今回使用したモーションのZ軸は弓を射る方向ではなく、体の向きだった。
    • アニメーションで回転させようとしたが、これは不可能だった(原因不明)。
    • 取り出したアニメーションファイルはオフセットの指定が可能。

    • これにより初めから回転させることができた。

    2016年5月14日土曜日

    uGUI Textをくっきり見せる小技

    色文字を背景色に埋もれくことなく表示したい…。しかし、文字色とアウトラインをどういじっても上手くいかない。そんな時、重宝した小技。



    Shadowコンポーネントを2つ使い文字を影で囲う。浮き出てくれ見える上に、割と無茶な色同士でも上手く見えてくれる。

    アウトラインの太さを2にするのもコツ。色を変えるのはアウトラインだけでOK。

    2016年5月13日金曜日

    uGUI Textの改行について




    1. BDの設問文の末尾に改行を表す/nを記載していたのだが、str1 + str2では改行されなかった。str1 + "\n" + str2とすると改行された。
    2. Unityの自動改行の基準は半角スペースの模様。英語と日本語の混在する文章の場合、日本語は異様に長い単語として認識されている。自動改行の結果、表示が変になる場合は半角スペースと適宜入れる工夫が必要。

    Vertical Layout Groupで起こる矩形の再計算について


    詳細には突き詰めていないが、Vertical Layout Group Scroll RectコンポーネントがついたGameObjectの高さが変わると、大→小になった時再計算が行われる模様。その時、上から降ってくる感じになり下詰めになってしまう。

    <追記1>
    下図の条件の場合は発生しなかった。


    アンカーとピボットが絡んでいる模様。

    <追記2>
    結論
    PivotのYが1以外だと発生する。アンカーは関係なし。…左下のボタンから出たり戻ったりする感じが好きだったんだけどな。

    2016年4月27日水曜日

    UnityのInputFieldはちょっと面倒

    入力時の処理をスクリプト側で追加したい時の話である。まずはスクリプトを先に見てもらいたい。


    Buttonをクリックした時に呼び出すメソッドは、10・12行目の通り、単純にメソッド名を書くだけで良い。

    さて、InputFieldも同じだろうと思って記述してみたらエラーが出てしまった。それで、正しい書き方というのが33・38行目というわけである。まだよく理解できていないので、公式リファレンスを真似して書いてみた。呼び出すメソッドの引数にはInputFieldが必要な模様。面白いことにこの引数から入力された文字を参照することができる。

    詳しいことが分かったら、またここに追記しようと思う。

    2016年4月23日土曜日

    Unityで作ったゲームをiPhoneでテストしてみる

    Xcode7から開発テストは無料でできるようになったらしい。昨年購入した開発ライセンスも契約が切れたので、試しに無料でやるにはどういった手順になるのか試しながら忘備録を残そうと思う。

    ビルド方法はもう覚えていないので、とりあえずBuild & Runsしてみてエラーのたびに対応していくことにする。

    まず出てきたエラーがこちら。

    UnityException: Launching iOS project via Xcode4 failed. Check editor log for details

    UnityがXcodeを通してビルドするのに必要なプラグインを信用していいのか確認される。スキップすべきではないと判断し、Load Bundleを選択。
    インストールを要求されるのでインストール。
    パスワードも要求されるので、入力してOKを選択。なお、この時点でビルドは中止されている。

    もう一度ビルドすると同じエラーは出ずにXcodeの画面に移行する。ただし、今度はDesk Image の件でビルドが中止される。


    この問題は書き出し先のiOSのバージョンに対応できてないという意味らしい。次のパス先に、対応するフォルダを用意してあげる必要があるとのこと。(参考1、参考2)

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

    このパス先はこんな感じ。
    出力先のiOSのバージョンはこんな感じ。


    なるほど、確かに対応していない。確認してみたら、使用しているXcodeのバージョンは7.2.1で、最新版は7.3だった。しかし、なぜか最新版にアップデートできない。どうやら、一度Xcodeをアンインストールしてから入れなおす必要があるらしい(参考)。…で、アンインストールしてみたら今度はOSXのバージョンアップが必要だった。


    OSをYoesemiteからEl Capitanにバージョンアップして、Xcodeを入れ直した。入れ直した後にBuild & Runをしてみると、今度はXcodeの追加コンポーネントを入れるように促されたので、これを承認。
    再度Build & Runをしてみると「Build Successful」と表示されてXcodeが立ち上がるが、そこで処理が終わってしまう。どうやらXcode用のフォルダは出力したから、後は自分でXcodeから実機にビルドしてねということらしい。今までのように自動でやってくれない。とりあえず、出力されたプロジェクトを開いてみる。

    立ち上がった画面から下図の項目を選ぶと、identifierの画面に到達できた。ここからの手順はこちらのサイトを参考にした。


    TeamがNoneになっているのが問題なので、これをクリックするとアカウントの追加画面になる。追加されたアカウントにはFreeの文字がある。

    その後、アカウント画面を閉じてidentifierの画面に戻る。再びTeamをクリックすると、追加したアカウントが選べるようになっているのでこれを指定する。その後、Fix Issueを選択してみるが、Bundle Identifierが初期値のため修正するように促される。とりあえず企業名を自分の名前、商品名をとりあえずTestAppとした。

    再度、Fix Issueを押すと今度はちゃんと問題が消えた。

    後は左上にある再生ボタンを押せば、実機へのビルドが始まる。もちろん実機にはケーブルで接続している必要がある。ただ、実際にやってみたら次のようなエラーが出た。


    最初はプロファイルのことかと思ったが、単に画面ロック(スライドでロック解除するやつ)のことだった。実機側のロックを解除するとiPhoneに作成したゲームのアイコンが現れ、ゲームが起動した。

    iPhone側でゲームを終了すれば、後はXcodeは終了してケーブルを外しても大丈夫。

    2016年4月22日金曜日

    ScriptableObjectのListにクエリやラムダ式を使ってみる

    前回ScriptableObjectを作成したが、今回はそのListから任意のデータや並び替えを行いたい。下記は実際にラムダ式を使ったクラスの一部抜粋である。名前空間にSystem.Linqが必要になるので、忘れないように注意。


    14行目:FindAll

    ここでは、現在選択中のカテゴリIDと一致する設問データを抽出している。カッコ内左側で任意の名前の仮引数を作り、=> の右側に条件文を書く。これが基本的なルールであり、割と気軽に使える。


    18行目:OrderBy

     OrderByは任意のパラメータの昇順で並び替える。上記同様、カッコ内の左側が仮引数、右側が条件文。ここではDateTime型のパラメータで並び替えている。

    OrderByは元のListを変更せずに、並び替えた仮想のリストを返してくる。この型は今の所よく分わからないのでvarで受けている IOrderedEnumerable<T>。Listに使えるメソッドは使えず、IEnumerableクラスのクエリメソッドが使える。詳しくはこちら。ソートが実際に行われるのはForeachなどで列挙操作が行われた時なので注意が必要。よって列挙操作なしに並び替え後の要素を取り出すことができない。

    <追記>

    ちなみにGuidと組み合わせることで、セキュリティ性能の高いシャッフルを実装できる(参考)。なお、UnityではSystem.Guidとする必要があった。

    2016年4月21日木曜日

    解像度対応のTips

    参考

    1. uGUIのレイアウトを理解する 〜 多種解像度対応 : Canvas Scaler(参考)
      1. 公式マニュアルにも説明あり(参考)
      2. ひよこエッセンス様の解説(参考)
    2. Unity5.4新機能:ビュースケール調整(参考)
    3. アンカーの踏み込んだ使い方

    2016年4月20日水曜日

    SQLiteの読み書き

    ■読み込み

    前回やった内容を少し発展させ、inspectorからではなくSQLiteのデータベースファイルからidを参照する。データベースは暫定的に次のようにした。


    この値を取ってくるには次のようにする。


    これによりデータベースに保存されているIDの内容を表示することが可能となった。


    ■書き込み

    メニューのボタンを押したとき、データベースを更新するようにする。ボタンを押すと、下記のSellectメソッドが呼び出されるようにした。データベースの書き換えは2~6行目で行われている。



    ■まとめ

    ここまでで作った内容は下図である。メニューのボタンの内容はScriptableObjectを参照している。ボタンを押すとデータベースのselectingIDが更新される。ホーム画面上部にある文字はデータベースのselectingIDに応じて内容が変わる。


    なお本筋は、NPOIの使い方、ScriptableObjectの使い方、SQLiteの使い方、必要となるエディタ拡張の説明なので、それ以外の部分は説明を割愛した。

    ゲームを再生しなくてもuGUIの表示内容をスクリプト制御できるようにする

    「ユーザーがゲームを進めていくと、選べる項目が増えていく」というメニュー画面を作りたい。アンロック形式なので、初めから全てのボタンをHierarchy上に置いておき、未開放分は非アクティブにしておく形式を取ることにする。

    表示内容はScriptableObjectの内容に追従して欲しい。ただ、表示の変更はゲーム再生中だけではなく編集中にも行われて欲しい。このような場合には、[ExecuteInEditMode]を使うと良い。(参考)


    これにより、パラメーターの変更があるとUpdate関数が呼び出され、編集中にボタンの表示内容が変更される。


    注意点
    1. Updateはパラメータに変更のあったオブジェクトだけではなく、[ExecuteInEditMode]のUpdateを持つ全てのオブジェクトで実行される。今回の場合で言えばボタンの数だけログが吐き出されるので、IDに変更のあったオブジェクトだけ処理を行うようにした。
    2. inspectorでidを変更する際に一度空欄になるが、このときの値はNullではなく0である。

    2016年4月19日火曜日

    SQLiteUnityKitを使う with Mac(データーベース用意編)

    データベース作成


    作成

    SQLite対応のGUIを使った方が容易なので、今回はLitaを使用し作成する。直感的に分かりやすいインターフェイスなので説明は割愛。
    テーブルの作成やパラメーターの編集が容易。ただし、作成したパラメータのNullの許容などは後から変更できない模様。

    後で要素を足したりする可能性を考えて、Default Value(初期値)を設定しておいたほうが良い。後々要素を足した時にクエリ(検索)で抽出できなくなる事態を避けられる。

    〜DATE型の注意点〜

    SQLiteにおけるDATE型は正確には決まっていない(参考)。DATE型の初期値は"2000-01-01"のような形で入力できた。


    ただし、最初はLitaでも2000-01-01と表示されていたのに、途中から何故か表示されなくなった(値はちゃんと保持している)。また、SQL文で現在時刻を入力するとDouble型で入力される。型を統一しないと、C#側で使うのが非常に厄介である。

    最終的にTEXT型で保存し、C#側でdatetime型に変換するようにした。この場合、現在時刻を打刻するとちゃんと"2000-01-01 00:00:00"のような形で保存される。なお、日付によるソートは、DBではなくC#側のListで行うことにした。

    〜閑話休題〜

    作成が終わったらExportで出力可能。ただし、このとき拡張子をつけてないとただのテキストファイルになる。ターミナルから作成した場合は不要らしい。拡張子は.dbや.sqlite3にするのが一般的とのこと。


    また、Lataではデータの編集も容易なので、単純なものであればこれで作ってしまった方が早い。SQL文も使うことができ、意図した動作をしているかチェックできるので重宝する。


    ターミナルについて

    一応、Litaが出力したファイルがsqlite3なのか確認してみた。ターミナルはアプリケーションのユーティリティの中にある。ターミナルが起動したらsqlite3と入力した後、半角スペースを入れてからデータベースファイルのパスを入力する。

    パスにスペースの含まれるフォルダが含まれているとアクセスできなかった。その場合は、デスクトップなどに一旦移すと良い。入力が終わったらエンターを押す。
    これにより、Macに標準搭載されている現在のSQLiteのバージョンが確認できる。ちゃんとアクセスできている場合、.databaseを入力してエンターを押すと上図のようにfileのパスが表示される。終了する場合は.exit。