CS_INDUSTRIAL

AR/VRエンジニアの趣味ブログ

【Unity】XcodeのプロジェクトからTARGETSを消してはならない!

発生した問題

UnityでiOS向けにBuildしてXcodeのプロジェクトに変換したときに以下のエラーが出てビルドできない。

Exception: Deletion of either of the "Unity-iPhone" or "Unity-iPhone Tests" targets is not supported

原因

Xcode側でTARGETSから「Unity-iPhone Tests」を消していた。
※「Unity-iPhone」「Unity-iPhone Tests」は残しておき、名前も変えない。

解決策

UnityでFileからBuild Settingsを選び、BuildかBuild And Runでファイルを選択するときに出てくるWindowで「Replace」を選択する。
f:id:nanokanato:20170728134716p:plain:w300

Append(追記)じゃなくReplace(置換)することでTARGETSを作成してくれる。
しかし、Xcode側から設定した内容が消えているので注意です。

【GAS】GoogleAppScriptをはじめよう

GoogleAppScriptとは

Google Apps Script(GAS)はGoogleが提供する11のサービスをクラウド上でスクリプトを実行することで操作できるサービスです。
言語はJavaScriptをベースとしています。

例えば一定時間ごとにデータを集計したり、SNSに投稿するBotを作ったり、GoogleSpleatSheetを編集したりなどが可能です。

以下のGoogleの機能と標準で連携することができるのでいろいろな使い方が可能です。

  • カレンダー
  • コンタクト
  • ドライブ
  • ドキュメント
  • スプレッドシート
  • フォーム
  • Gmail
  • グループ
  • マップ
  • サイト
  • Languages

GASを用意しよう

GoogleDriveに入って右クリックで「その他 > Google Apps Script」を選択。
※その他に無い場合はアプリを追加で探してみてください。
f:id:nanokanato:20170725121811p:plain:w300

GASを使ってみよう

上のアプリを追加で作成された無題のプロジェクトです。
左上の「無題のプロジェクト」の部分をクリックすることでプロジェクト名を変更できます。
f:id:nanokanato:20170725122209p:plain:w300

左の「コード.gs」の部分にgsファイルが並びます。
ファイル名の右の▽をクリックすることでファイル名を変更したり、ファイルを削除、コピーできます。
f:id:nanokanato:20170725122915p:plain:w200

とりあえず動かそう

プロジェクト名、ファイル名、メソッド名を「test」に変えてみました。
f:id:nanokanato:20170725130009p:plain:w300

function test() {
    Logger.log("Hello World!");
}

Logger.log(string)でログを表示します。

f:id:nanokanato:20170725131256p:plain:w16ボタンをクリックで実行されます。

初回実行時のみ、Googleアカウントの認証が必要です。
f:id:nanokanato:20170906121531p:plain:w300

実行後「⌘+Enter(Mac)」でログが表示されます。

f:id:nanokanato:20170725130553p:plain:w300


行数の部分をクリックすることでブレークポイントを設定できます。
f:id:nanokanato:20170725131350p:plain:w16ボタンを押すことでブレークポイントで停止してくれます。
f:id:nanokanato:20170725130702p:plain:w300
2017/07/25現在ではブレークポイントで止まってくれるのは実行開始したファイル内だけのようです。
別のファイルのブレークポイントで止めたい場合は、メソッドから別のファイルのメソッドを呼び出しているところで一度止めてから、f:id:nanokanato:20170725131414p:plain:w16ステップインすることで呼び出し先の別ファイルのメソッドへ移動できます。
別のファイルに移動した後であればそのファイルのブレークポイントに止まってくれました。

他に何ができるかは以下を参考にどうぞ
Calendar Service  |  Apps Script  |  Google Developers

トリガーの設定

定期的に集計などをしたい場合、その都度再生ボタンを押すのは面倒です。
トリガーとは再生ボタンを押さなくても一定時間ごとに指定したメソッドを実行してくれます。
f:id:nanokanato:20170725131906p:plain:w16ボタンを押して、トリガーを設定してください。

トリガーを設定するウィンドウが表示されました。
最初は青文字のリンクを押すことでトリガーを追加できます。
f:id:nanokanato:20170725132009p:plain:w300

実行の部分はメソッド名が入ります。ここではtestを選んでいます。
イベントには実行周期を登録します。
「特定の日時」「月タイマー」「週タイマー」「日タイマー」「時タイマー」「分タイマー」から選べます。
また、「新しいトリガーを追加」で新しいトリガーを追加できます。
f:id:nanokanato:20170725132339p:plain:w300

時タイマーで設定して1時間ごとにはなりますが、0:16→1:15のように0分ぴったりでは無いので注意です。

ぴったりの時間に処理したい場合は以下のように毎分に設定し、NowMin(分)が0であることを確認すれば間違いないです。
これで毎時0分ぴったりに処理することになります。

    var Nowymdhms = new Date();
    var NowYear = Nowymdhms.getYear();
    var NowMon = Nowymdhms.getMonth() + 1;
    var NowDay = Nowymdhms.getDate();
    var NowHour = Nowymdhms.getHours();
    var NowMin = Nowymdhms.getMinutes();
    if (NowMin == 0) {

    }

【Unity】パズドラ風パズル作ってみた

はじめに

最近いろんなゲームをやりつつ、戦略系などが好きなんだなーと実感しました。
その中でも単純なんだけど考えるようなものは暇つぶしには最適で、それがパズルでした。

パズルと言ったらパズドラということもあり(1週間くらいしかやったことないが...)
作ってみることにしました。

完成した動作が以下です。
レイアウト等はまだまだですが一応パズルできる...という感じです。
これにコンボやスコアを設定すれば完璧、作り上簡単にカスタマイズできるはずです。


実装内容

実装後に違うパズルに改造してしている途中なので確かこうだったなぁという復元になってますが、動かない場合はコメント等にておしらせください。

Line3Block

パズルのピースを用意します。
80x80のPrefabです。
f:id:nanokanato:20170616113854p:plain:w300

階層構造はBlock(CreateEmpty:空のGameObject)に
BackGround(UI.Image)とIcon(UI.Image)を用意します。
f:id:nanokanato:20170616113815p:plain:w300

Blockには以下のScriptを追加します。
主にピースの移動後の座標と種類を管理しています。

InspectorからBlockの色(BlockColors)とキャラアイコン(BlockCharas)を設定します。
BackGroundとIconにはBlockの下層に作った同じ名前のUI.Imageを設定します。
f:id:nanokanato:20170616114234p:plain:w300

設定したBlockの色とキャラアイコンの数だけピースの種類が増えます。

Line3Puzzle

BlockのPrefabを生成したり、ピースが揃っているか確認する部分です。

階層構造はCanvas以下にBoard(CreateEmpty:空のGameObject)を配置しているだけです。
Canvasは640x1136で、Boardは560x760です。
Camera等の設定は省きます。
f:id:nanokanato:20170616114904p:plain:w300

Canvasには以下のScriptを追加します。
Blockの生成と破棄、タップ操作の管理、ピースが揃ったかどうかの確認、アニメーションなどを行なっています。

InspectorのBoardにはCanvas下層のBoardを、BlockPrefabにはBlockを設定してください。
f:id:nanokanato:20170616115225p:plain:w300

ビルド

あとはビルドすることでCanvas > BoardにBlockが生成され、操作待ちになります。

処理の手順は以下になります。

  1. ピースの生成 → 2
  2. 揃っているか確認
    揃っていた場合 → 3
    揃っていない場合 → 6
  3. 揃っていたピースを消す → 4
  4. ピースを下に詰める
    空いている場所には上から新たなピースを落とす → 5
  5. 移動後に再確認 → 2
  6. 移動するピースの選択待ち → 7
  7. ピースを移動して入れ替える
    指が離されたら移動を確定 → 2

まとめ

パズルって単純なゲームなのに内部では色々なロジックが動いており面白いです。
結構出尽くしている感もありますがぜひオリジナルのパズルを作ってみてください。

UnityのAssetBundleを簡単にしてみた

はじめに

AssetBundleを使用するときにAssetBundleを読み込んでローカルに保存、Spriteの取得というのが毎回実装していると手間なので以下のように呼び出せるようにしました。
f:id:nanokanato:20170615115801p:plain:w300

AssetBundleMan


キャッシュ→StreamingAssets→ローカルの保存場所→サーバーの順にAssetBundleを探しに行きます。
一度取得したAssetBundleはキャッシュされます。

サーバーとローカルへの通信はWWWクラスを使用したWWWManを使っています。
madgenius.hateblo.jp

使用方法

Spriteを取得する場合
AssetBundleMan.GetAssetBundleSprite("AssetBundle名", "ファイル名.png", (Sprite sprite) => {
    image.sprite = sprite;
});

取得失敗の可能性もあるのでnullチェックしておくとベストです。
AssetBundleとSpriteの取得後に呼ばれて画像が反映されます。

GameObject,Prefabを取得する場合
AssetBundleMan.GetAssetBundleGameObject("AssetBundle名", "ファイル名.prefab", (GameObject prefab) => {
    GameObject gameObject = Instantiate (prefab, this.transform);
});

取得失敗の可能性もあるのでnullチェックしておくとベストです。
AssetBundleとGameObjectの取得後に呼ばれてPrefabから生成されます。

UnityのWWW通信をCallBackで受けとるクラス

簡単にメモ程度ですが、WWWでの通信を簡単に行うために作成しました。
以下の画像の通り、Coroutineを使わずにCallBackでProgress(進捗度)と通信結果を受け取ることができます。
f:id:nanokanato:20170608185914p:plain:w300

staticのクラスなのでどこからでも呼び出すことができます。
MonoBehaviourを通信開始時に取得してCoroutineの処理をしているのでその部分のみ指定のMonoBehaviourに差し替えて使用することもできます。
現状、タイムアウトの処理がないので今後実装するかもしれません。

Unity for MacでVisualStudioを使用する

UnityをWindowsでやっていた人が、Macでやり始めると思うこと?にMonoDevelopってなんだ?ってのがあるかと思い調べてみた。
MacだとVisualStudioではなくMonoDevelopなので使い勝手がいいほうのエディターに変えたいという人もいるだろう。

Visual Studioをインストール

まず、MacにはVisualStudioはない....(完)
だが、VisualStudioCodeというEditorがあるのでそちらを使うことにする。

サイトのトップよりダウンロードができるのでインストールする。
f:id:nanokanato:20170417115610p:plain:w300

単品で使った場合、WindowsのVisualStadioとはレイアウトなどが違うが、使い勝手や機能は大体同じのようだ。

Unityと連携させるために...

Unityで普通にEditorを変更させようとしたがVisualStudioCodeが起動してそこからMonoDevelopが起動してしまう。

調べているとこんなものが…
VisualStadioCodeをUnityに追加するためのScriptらしい。
VSCode - Unity Visual Studio Code Integration

これをAssets以下に追加する
f:id:nanokanato:20170417115716p:plain:w300

Editorを変更

UnityのツールバーからUnity > Preferencesを選択。
f:id:nanokanato:20170417115749p:plain:w300

PreferencesのWindowが開く
VSCode.csを追加したのでVSCodeという欄が増えている
f:id:nanokanato:20170417115818p:plain:w300

External Toolsを選択してEditor AttachingをCodeに変更
もしくはBrowse...からVisualStudioCodeを選択する。
f:id:nanokanato:20170417115836p:plain:w300

これで連携が完了です。EditorがVisualStudioCodeになりました。

インテリセンス(自動補完)を利用する

VisualStudioCodeをEditorに設定し無事Scriptを編集できたのですが、MonoDevelopにはあるインテリセンスがなかったので設定する。

左側のタブから拡張機能( f:id:nanokanato:20170417115947p:plain:w12 )を選択。OmniSharpで検索してインストールしてください。
f:id:nanokanato:20170417120024p:plain:w300

使い心地

Editorとしては最高だと思います。

  • 拡張機能でインストールすることで多言語対応
  • Windows,Mac,LinaxなどのOSで利用でき、OS間の操作感の違いを吸収
  • Microsoftや利用者の更新頻度が高く、機能拡張が増えている。
  • Methodやif,forなどで折りたたむことができる
  • 左右でエディターの分割ができる。(コピペや他プロジェクトとの比較が楽)
  • 上書き保存していないScriptに応じて左上にバッジ表示(自動保存もあり)
  • インテリセンスは機能拡張から追加できるので独自のものも可能?

など...

f:id:nanokanato:20170417120050p:plain:w300

しかし、Unityで使うには以下の点よりまだ早いようです。

  • Projectに常にVSCode.csを追加しないといけない
  • Debug時にBuild構成ファイルやタスクランナーの構成が必要
  • ブレークポイントの設定がし辛い?
  • Unityでの利用者が少ないので何か起こると困るしかない

それでも多くのOSと多言語に対応しているMicrosoftのフリーエディタですのでどこかのすごい人が解決していそうです。
解決策があればぜひ教えていただきたいです。