開発メモ「開発メモ」カテゴリーアーカイブ開発技術に関する記事です。1.7.7f6PlayMakerをインポートしたプロジェクトをAndroid向けにビルドすると、以下の権限(パーミッション)が勝手に追加されます。/>Unity自体が、特定のAPIを使用した場合にビルド時に自動的に権限を追加する仕様になっています。Androidプロジェクトを吐き出してからビルドする場合は変更できますが、直接apkを書き出す場合は厄介です。該当する機能を使っていないのならば、PlayMakerのアクションを記述してあるスクリプトファイルを最初に削除してしまえば済むことです。・android.permission.VIBRATE/PlayMaker/Actions/DeviceVibrate.cs・android.permission.ACCESS_FINE_LOCATION/PlayMaker/Actions/GetLocationInfo.cs/PlayMaker/Actions/StartLocationServiceUpdates.cs/PlayMaker/Actions/StopLocationServiceUpdates.cs・android.permission.WAKE_LOCK/PlayMaker/Actions/DevicePlayFullScreenMovie.cs[参考]:apkに付与されている権限を調べる方法aaptというADT付属のツールで調べることが出来ます。詳しくはこちらを参考にさせて頂きました。カスタムアクション入門PlayMakerではアクションという処理の単位を組合せて、処理を記述していきます。PlayMaker公式アクションリファレンス(英語)標準でもかなりの数のアクションが用意されていますが、実際にPlayMakerを使って作業していると標準のものでは処理を実現できそうもない場合が出てきます。その場合はカスタムアクションを自分で作成して、標準のアクションと同様にPlayMakerで使用することができます。ここではPlayMaker標準で用意されている「IntOperator」アクションを例にとり、アクションの記述の仕方を解説していきます。「IntOperator」は2つのInt値と計算方法を指定し、その結果を指定のInt型変数に代入するアクションです。HutongGames.PlayMaker.Actions{・・・}独自のネームスペースを使うことも可能ですが、特に理由が無い限りはHutongGames.PlayMaker.Actionsを使用するのが無難です。FsmStateAction{・・・}}PlayMakerのアクションブラウザに表示される時のカテゴリを指定します。標準のカテゴリに追加することもできますし、独自のカテゴリに追加することもできます。独自のカテゴリに追加したい場合は以下のようにカテゴリ名を文字列で指定します。FsmStateAction{・・・}}アクションブラウザに表示するアクションの説明文を指定します。省略しても構いません。FsmStateAction{・・・}}HutongGames.PlayMaker.FsmStateActionを継承させます。everyFrame;PlayMakerエディタ上に表示されるパラメータとなります。「RequiredField」属性を指定すると省略不可となり、エディタ上で適切な値を指定しない場合にエラーとなります。「UIHint」属性を指定することで、エディタ上での表示の仕方を変えることができます。「UIHint.Variable」を指定した場合には、FSMで用意した変数から選択することしかできなくなります。メンバ変数の型を「Fsm〜」という型で指定することにより、エディタの機能を利用した便利な指定ができるようになります。ここではFsmIntしか登場しませんが、他にFsmFloatやFsmStringなど様々な型が用意されています。通情のC#の型も使用することができます。ここでは「everyFrame」がbool型で宣言されています。false;}新規にアクションを追加した場合の初期値、またはエディタ上でリセットをかけた場合にセットされる値を指定します。(!everyFrame)Finish();}アクションが実行される時に呼び出されます。この中に直接処理を記述しても構いませんが、ここでは実際の処理は「DoIntOperator()」の中に記述されています。処理の終了には必ず「Finish()」を呼び出す必要があります。ここでは毎フレームの処理を行う場合は処理を終了させたく無いのでeneryFameフラグにより条件分岐されています。OnUpdate(){DoIntOperator();}毎フレーム実行される処理を記述します。v2);break;}}「Fsm〜」型の変数はValueプロパティにより実際の値にアクセスすることができます。ようにカスタムアクションはとても簡単に作成することができます。GameObjectの参照をとったり、より複雑な処理をする場合は、標準のアクションの中から似たような処理をするものを見つけ、そのスクリプトを参考にすると良いでしょう。アクションブラウザ上でアクションの右クリックメニューから簡単にスクリプトを参照することができます。(2)今回はタイトル画面でスタートボタンが押された時の処理を解説していきます。StartButtonNGUIのUIButtonコンポーネントを持つボタンのGUI部品です。NGUIのイベントをFSMに通知するためにPlayMakerの開発元から提供されているNGUIアドインをセットしてあります。スタートボタンを押すと初回はプロローグ画面へ、その後はゲーム画面へ遷移するようになっています。Initシーンが読込まれPlayMakerFSMが動き出した時に初めに到達する状態(ステート)です。前回紹介したTitleControllerのInitとはほぼ同時(順不同)で動作します。UnityのスクリプトにおけるAwake()の実行順と同じとイメージすれば良いでしょう。PlayMakerの場合は実行順を制御する機構がないようですので、FSM同士の関連には注意が必要です。(※:未確認ですがUnityのスクリプトの実行順制御によりPlayMakerFSMの実行順も制御できるかもしれません。PlayMakerFSM自体も一種のコンポーネントですので。Indicator(カスタム)処理中を示すインジケーター(くるくる回転するアイコン)を停止・非表示にします。Idle何も行いません。CLICK」イベントが来るのを待ち受けます。OnClickIdleの状態からボタンが押下された時に遷移する状態です。BGM(カスタム)再生中のBGMを停止します。SE(カスタム)スタートボタン押下の効果音を再生します。CheckPrologueスタートボタン押下後に到達するステートです。初回起動かどうかを判断して、プロローグかゲーム画面に遷移を振り分けます。上記のOnClick中に書いても良い処理ですが、分かり易さのために分けてあります。Int(PlayerPrefs)PlayerPrefに保存されている物語の進行度を表す数値を取り出し、変数storyにセットします。Unity標準のPlayerPrefs.GetInt()と同様のアクションですが、複数の値を同時に扱えるのが少し便利です。Compare(Logic)さきほど取り出したstoryの値が1以上なら「START_GAME」イベントを発生しゲーム画面へ遷移する処理へ、1未満なら「FINISHED」イベントを発生しプロローグへ遷移する処理へ移ります。StartPrologue初めてスタートボタンを押した時に到達するステートです。Object(GameObject)インスペクタ上で指定したフェードアウト用のNGUIスプライトを有効にします。Unity標準のGameObject.SetActive()と同様のアクションです。Wait(Time)1.1秒間待機した後に指定のイベント(今回は指定してないのでFINISHEDイベント)を発生します。このように待機した後に処理を行いたい場合は、別の状態を用意してイベントにより遷移させる必要があります。このアクションが途中に挟まれていたとしても、以降のアクションも全て実行される点に注意が必要です。LoadLevelPrologueプロローグ画面へ遷移します。Banner(カスタム)広告バナーを画面外に隠します。Level(Level)「Prologue」という名前のシーンをロードします。UnityのApplication.LoadLevel()にあたるアクションですが、Additive/Asyncなどがオプションとして選択できるようになっています。StartGameすでにゲームをやったことがある場合にスタートボタンを押すと到達するステートです。StartPrologue」とほぼ同様なので説明は省略します。LoadLevelGameゲーム画面へ遷移します。さきほどのプロローグ画面への遷移と違いロード中画面を挟んだ遷移なので、アクションの内容が異なっています。BGM(カスタム)ゲーム画面用のBGMの再生を開始します。Idle」の何もアクションの無い状態が特徴的だったと思います。いう状態を用意することで、外部からの操作でイベントを飛ばしてもらって処理を行うというような記述が可能になります。プロローグの場合とゲーム画面の場合でフェードアウトの処理を変えていたり、BGMを止めたり、ロード中画面を挟んだりなど微妙な調整を色々としています。これがどのような違いを生むかは、もうじきリリース予定の「あ〜ちゃ〜の大冒険」でぜひ確認してみて欲しいと思います。(1)スマホアプリ「あ〜ちゃ〜の大冒険」(2014年12月下旬リリース予定)は、実験的にPlayMakerというコーディング無しで処理を記述できるアセットを全面的に利用して作りました。そこで実際にPlayMakerを使ってどのように処理を記述しているかを公開します。PlayMaker自体の詳細に関しては、公式の紹介動画・チュートリアル動画で概要は掴んで頂けると思います。少ないながらも日本語で解説されているサイトもありますのでそちらを参照して下さい。PlayMaker・公式サイト・アセットストア初回は、小手調べということでアプリのタイトル画面の初期化を管理しているFSM(PlayMakerの処理内容を記述したもの)をご紹介します。TitleControllerここでは広告の初期化、またアプリ内で唯一となる音源を管理するゲームオブジェクトAudioManagerを作成しBGMを再生します。Initシーンが読込まれPlayMakerFSMが動き出した時に初めに到達する状態(ステート)です。Banner(カスタム)自分で作成したカスタムアクションでiOS/Androidそれぞれのネイティブプラグインを呼び出し、広告バナーの初期化・表示を行います。カスタムアクションに関しては下記を参考にして下さい。Object(GameObjectカテゴリ)←括弧内はPlayMakerで用意されたアクションのカテゴリを示します。「AudioManager」というタグが付けられたGameObjectを取得し、変数audioManagerにセットします。存在しなければnullになります。Null(Logic)audioManagerがnullかどうかを調べます。nullの場合は「NO_AUDIO_MANAGER」というイベントを発生し遷移、nullでない場合は通常終了し「FINISHED」イベントによる遷移を行います。CreateAudioManagerInitでAudioManagerが存在しなかった場合に到達するステートです。このステートでは特に遷移イベントを指定していませんが、その場合は全てのアクション実行後に自動的にFINISHEDイベントによる遷移が行われます。Object(GameObject)インスペクタで指定してあるAudioManagerのプレファブからインスタンスを作成し、変数audioManagerにセットします。Load(Level)audioManagerがシーンロード時に破棄されないように設定します。PlayTitleBGMタイトル画面のBGMを再生します。(ステート)が3つ、それぞれのアクションも少ないですが、PlayMakerによる実装の感じは掴んで頂けたと思います。状態遷移というよりは処理の固まりを遷移していくようなイメージになっているのは私のクセという部分もあります。変数がFSM単位で用意され、スクリプトでいうところのメソッドのローカル変数のようなものが存在しないのが特徴と言えます。条件分岐の場合には必ず状態遷移を引き起こすというのもクセのあるところです。今回、これだけ少ないアクションの中で2ヶ所もカスタムアクションが登場しましたが、少し込み入ったことをしようと思うとカスタムアクションを作成した方が楽です。PlayMaker標準でMonoBehaviourのメソッドを呼び出すアクションが存在しますが、上手く利用出来ませんでした。次回はタイトル画面でスタートボタンを押した時のFSMを紹介する予定です。moku[Unity]:GenymotionでAndroidアプリを動作させるGenymotionとはAndroid端末のエミュレータです。Tools(ADT)にも標準で添付されていますが、もの凄く動作が遅いです。それに比べ、このGenymotionはとても快適に動作します。Unityで作成したAndroidアプリをGenymotionで動作させる際に少しハマったので、簡単にまとめておきます。Genymotionの導入に関しては、解説されている日本語サイトもたくさんありますのでそちらを参照して下さい。Boxというソフトを予めインストールしておく必要があります。hosts」というのがそれに当たります。GenymotionでAndroid端末のエミュレータが動作しても、そのままではUnityで作成したAndroidアプリのapkを実行することができません。Macで動作するGenymotionでは実行出来ませんでした。TranslationというモジュールをGenymotionの仮想端末に導入します。これに関しても解説されているサイトがたくさんありますので、そちらを参照下さい。Translationのモジュールをダウンロードするとzipが自動的に解凍されてしまいます。Genymotionに適用するにはzipのままでないといけないので、Safariの設定を変更して、zipを自動的に解凍しないようにしておく必要があります。Simulator上で動作を確認することができます。Simulator向けビルドはネイティブプラグインの呼び出しをサポートしておらず、ネイティブプラグイン呼び出し時に以下ようなのエラーを吐いて、動作しません。unknown>:0このエラーを回避し、ネイティブプラグインをシミュレータ上で動作させる方法がこちらのサイトで紹介されていました。画像付きですし分かり易いと思いますが、日本語で分かり易く紹介しておきます。Unityのバージョンは4.5.5f1で試しています。Simulatorビルドで吐き出されたXcodeプロジェクトの以下のソース中の2カ所に対して行います。RegisterMonoModules.cpp1.mono_dl_register_symbolの宣言を#ifディレクティブの外に出します。(void*)&UnityNSNotification_Name);}以上の2カ所を修正することにより、ネイティブプラグインがiOSシミュレータ上でも動作するようになります。95Unityエディタ上でモデルのメッシュをいじって簡単なモデリングが出来るツールです。イメージを掴むためにこの動画をお勧めします。Overview英語だし、音量が小さいですが、眺めるだけで良いです。すごくワクワクしますよ^^同社のPrototypeというツールはProBuilderの下位版という位置づけでいくらか制限があるようですが、2014年9月いっぱいは無料セールをやっているので是非試してみると良いでしょう。Bundleというバンドル製品には、ProBuilder以外に便利なツールが含まれており、特にProGridというツールはProBuilderで準必須となっているので、購入する場合はこちらの検討をした方が良いと思います。Bundleを購入した場合のインストールと編集モードの説明をします。踏み込んだ説明に関しては未定です。@mokusan)私もProCoreを購入してサラッとドキュメントを見ながら触ってみただけなのですが、分かることにはお応えしたいと思います。ProCoreをダウンロードしてインポートすると「ProCoreCompleteBundle」というフォルダの下に各ツールのunitypackageと各種ドキュメントがあるので、その中の「ProBuilder2-v〜」というパッケージをダブルクリックしてインストールします。インストール時にRelease版かSource版か選択できます。サンプルやActionツール(モデルやフェースの変換などの便利ツール)を使う場合はSource版が必要とのことですが、その代わりにスクリプトのコンパイル時に少し処理が重くなります。この時、「ProGrids2-v〜」も一緒にインストールしておくと良いでしょう。Window」を選択してProBuilderを有効にします。するとProBuilderのツールバーのフローティングウィンドウが表示され、Sceneビューには編集モード選択のためのボタンが表示されます。・編集モード3つの編集モードがあり、ProBuilderのツールバーのアイコンをクリック、シーンビューのボタンをクリックもしくはショートカットキーで切り替えが可能です。Editingモードを指します。Editing通常のUnityのエディタと同様にオブジェクトの選択、移動などができます。Editingメッシュデータの編集ができます。Blenderなどの3Dモデリングツールを使ったことがあれば分かり易いと思います。Editingにはさらに3つの選択モードがあり、ProBuilderツールバーのアイコンクリックもしくはショートカットキー’g’で切り替えが出来ます。Editingface(面)を選択・編集できます。Editingvertex(頂点)を選択・編集できます。Editingedge(辺)を選択・編集出来ます。Editingテクスチャの貼付・設定ができます。厳密に言うとマテリアルの貼付けなので、テクスチャなどを設定したマテリアルを予め用意しておく必要があります。最初の方にも書きましたが、もっと踏み込んだ説明に関しては未定です。4.5.2f1製作中のゲームで海面に大量のブイを並べて配置したいのですが、手作業ではとても無理なのでエディタ拡張を利用して、一定間隔でGameObjectを複製して配置する機能を作ってみました。エディタ拡張で間違ってる部分もありそうなので、ご意見など頂けたら幸いです。(@mokusan)先ず完成イメージは以下。このように必要なパラメータを設定して「Create」を押下すると、先に挙げたゲーム画面のようにブイが一定間隔で配置される。・エディタ拡張用のスクリプト「Editor」という名前のフォルダ配下に置く必要がある。Resourcesと同様で他のフォルダを掘って、その下に「Editor」フォルダを配置しても大丈夫。(スクリプト”CreateBuoys.cs”の内容全文はこの投稿の最後に掲載しておきます。通常のUnityEngine以外にUnityEditorを指定しておく。Other/”配下を指定することで、Hierarchyビューの「Create」のメニューにも追加される。Buoys」が選択された時に専用のウィンドウを表示する。必要なメンバ変数を定義し、OnGUI()内で記述する。{}}通常のOnGUI()でGUIを作るのと同じ要領だが、EditorGUILayoutのパーツが使える。詳細はリファレンスを参照。Selection.gameObjects[0];}ウィンドウ表示時に自動で呼ばれるメソッド。Selection.gameObjects[0];Repaint();}選択内容の変更時に自動で呼ばれるメソッド。intervalX;}}普通にInstantiate()すれば、Hierarchyに追加される。この際、Undoを設定しておくことにより、後で取り消しができる。(66行目)Editor拡張を利用したのは初めてだが、食わず嫌いだったと反省している。Unityで新規にGameObjectを作った時にHierarchyのトップに作成されてしまうというのは、良く聞く不満だが、Editor拡張を使えばその辺りも何とかできそうだと言うのが分かった。この方法で何らかの問題が発生しても当方では責任を負いかねますので、各自の責任の元に実行して頂きますようお願い致します。数日前からiPhoneのバックアップが出来ずに、以下のエラーが表示されるようになりました。バックアップはiTunesの「環境設定...」を開き、「デバイス」タブから削除できます。バックアップを一旦削除した後は、正常にバックアップを取れるようになりましたが、削除する前に念のため元のバックアップファイルの退避を行っておいた方が良いでしょう。moku[Unity]:スクリプトからシェーダの変数にアクセスする先ほどのエントリで、ノーマルマップのオフセットにアクセスする方法でつまづいたので追記。offset);}}マテリアルのInspectorの「Shader」右側にある「Edit...」を押下。↑組み込みシェーダの場合。それ意外の場合はエディタでシェーダのソースが表示される。Shader」を選択。Normalmap」の表記があり、ノーマルマップにアクセスするためには「_BumpMap」という変数名を使用すれば良いことが判る。キャンセル投稿を送信できませんでした。メールアドレスを確認してください。メール送信チェックに失敗しました。このブログではメールでの投稿共有はできません。