Unity Cloud Buildでハマった所 vol2

はじめに

Vol1は↓

project-unknown.hatenablog.com

事象と解決策

Unity Cloud Buildに掛けると、突然以下の様なエラーが出てbuild失敗しました。

 161: [Unity] Shader compiler: internal error compiling shader snippet type=0 platform=5: Protocol error - failed to read correct magic number
 162: [Unity] Shader error in 'Unlit/Transparent': Internal error communicating with the shader compiler process
 163: [Unity] UnityEngine.Debug:LogWarning(Object)
 164: [Unity] Player export failed. Reason: Shader error in 'Unlit/Transparent': Internal error communicating with the shader compiler process
 165: ! build of 'ios' failed. compile failed
 166: publishing finished successfully.
 167: Finished: FAILURE

これが奇っ怪なのが、Androidは成功して、iOSのみ失敗なんですよね。。

グーグル先生にお尋ねした所、Clean buildで治ったとか、昔のOnGUIを使っていたのをuGUIに直したら動いたとかとか。あったので、それぞれやってみようと思います。

Clean -> Buildを試してみる。

Unity Cloud BuildにCleanが見つからへんがな …。

場所が変わった?
そもそも毎回Clean buildになったとか?
とりあえず、見当たらないので諦めます。

古いコードを取っ払う

OnGUI部分のコードがあったので、念のためこれを新しいものに置き換えて見た所、普通に成功しました。

結論

わからん(;・∀・)
再buildで治ったかもしれないですし、OnGUIの部分がやっぱり悪かったのかもしれないですし…。

今日は的を居ない記事になりましたが、こんな所で

Arbor2とUniRxで指定回数Click/Tapされたら次のStateへ遷移する機能を作る

はじめに

最近、少しずつLinqを覚え始め(C#はまだ毛が生えた程度のSkillなので)、ずっとやりたかったUniRxを使ってみました。
また、折角なので最近一番のお気に入りのAssetのArbor2と組み合わせて何か便利な挙動が作れないかしらと思い、タイトルの通りの機能を造ります。

UniRx

詳しい使い方等は、沢山のサイト様があるので、そちらにおまかせします

Arbor2

project-unknown.hatenablog.com

今回作る仕様

  • 指定回数クリックされたら次のStateに移る
  • クリックを受け付ける入力期間を指定出来るようにする

作ってみた

gist.github.com

上記をコピペするだけで動くと思います。

すると挙動追加で、「Original > Transition > MultiClick」で以下の様な画面が出ると思います。

f:id:project-unknown:20170822004744p:plain

上記のSampleだと、10回クリックされたら次のStateに移るようになります。

実行結果をキャプって見たのですが、動画でも何やっているのかわからなかったのでキャプチャは割愛。

さいごに

UniRxはまだまだ使い慣れていないけど、これまで面倒な処理を書いていたのが簡潔に掛けるのが良いですね。
特に可読性(Linqのskillは必要になってくるけど、ソースファイルの至る所まで処理を追いかけなくても良い意味で)が上がってくると思います。

UnityのuGUI Text周り

はじめに

ずっとTextMesh Pro使ってみたいなぁ〜と思って居た所、

Unity アセット真夏のアドベントカレンダー 2017青木ととさんの以下の記事を読んで、衝撃を受けました。
qiita.com

Alt text
え!?無料なん!?
(2017/8/21現在無料でした)

という訳で、欲しい欲しいと思っていたTextMesh Proを早速導入して、使おうと思ったのですが、
そもそもUnity uGUIのTextを、なぁなぁで使っていた為、ちゃんとプロパティとかの意味をおさらいしておこうと復習がてらにこの記事を書いてます。

当たり前の事含め、はたと私が記憶喪失になった際のマニュアルとして残しておきます。

テキストの作成

Hierarchyで右クリック -> UI -> Textで作成。
(GameObjectメニュー -> UI -> Textでも作成可能)
Textを作成した際に、CanvasがまだScene上に無ければ自動で作成されます。

Textコンポーネント

f:id:project-unknown:20170821012525p:plain
(Fontの部分は第三者の著作権に当たるものを利用させて戴いている為、モザイク加工してます)

Text

表示する文字を入力。

Font

その名の通り表示する文字のFont

Font Style

フォントのスタイルを指定。

  • Normal : 標準
  • Bold : 太字
  • Italic : イタリック
  • Bold Italic : 太イタリック

Font Size

フォントサイズ(ピクセル単位)

Line Spacing

行と行のマージンを指定。
1.0が標準

Rich Text

これをONにすると、Textプロパティの内容をリッチテキストとして取り扱える。

Alignment

配置(左寄せ、中央寄せなどなど

Holizontal Overflow

横の指定領域を文字列がオーバーした際にどうするかを設定。

  • Wrap : 自動折り返し
  • Overflow : そのまま表示(領域無視)

Vertical Overflow

縦の指定領域を文字列がオーバーした際にどうするかを設定。

  • Wrap : 自動折り返し
  • Overfloaw : そのまま表示(領域無視)

Best Fit

文字列がテキストの領域に収まるように自動的にフォントサイズを変更。
BestFitを指定するとFont Sizeで指定したサイズは無視され、Min/Max Sizeプロパティで設定した最大値の間のフォントサイズが採用される。

Color

文字列の色を設定。
リッチテキストで色指定している場合は、この影響を受けない

Material

テキストに使用されるマテリアルを設定。

Rich Text

HTMLライクに装飾出来る。

f:id:project-unknown:20170821013532p:plain

こうすると

f:id:project-unknown:20170821013542p:plain

こうなる。

Font

いずれ書きます

Bitmap Font

いずれ書きます

今日はあまりブログ書いている時間がなかったので、最後尻切れトンボになってしまった。(;・∀・)
端折った部分はいずれ書きます。(一番復習したかったBitmap Fontができひんかった

Arborを使ってハマったこと - 常駐ステート

はじめに

今日はArbor 2を使っていて少しハマった所を記載。

事象と解決策

前回書いた以下の記事

project-unknown.hatenablog.com


で、扉の開閉を検知してボタンの活性/非活性を行う処理を、
最初以下のように、ボタンを押した時の処理と常駐ステートでボタンの活性/非活性を同一FSM内で定義してました。

f:id:project-unknown:20170815231353p:plain


これを実行すると、以下みたいになります。

f:id:project-unknown:20170815231111g:plain

常駐ステートの方は動くのですが、ボタンクリックの方が検知してくれていない。

原因としては、以下の公式に記載されている通り、常駐ステートの位置付けは「割り込み」である為に、
ボタンよりも常に条件が合致する常駐ステートの方が優先して処理されてしまっていたと推察しています。

arbor.caitsithware.com

この件の対応としては、GameObjectに別なArbor FSMをアタッチして、新規に作成したFSMの方に常駐ステートを置いて想定通りの動作が実現できるようになりました。
↓な感じ

f:id:project-unknown:20170815231829p:plain


今日は簡単ですが、以上で。

Unity Cloud Buildで、The name `クラス名' does not exist in the current contextでbuildエラーになった時の対処法

はじめに

本日は掲題の通り、Unity Cloud Buildで盛大にハマった事の、私なりの解決法をご紹介。

Unity Cloud BuildでiOS用にbuildすると、以下の様なエラーが発生してbuildが通りません。(該当箇所だけ抜粋しています)
以下は、UK_NumberUtilityというクラスが見当たらないとなっているのですが、Unity Editor上にもMonoDevelop上もちゃんとあるし、ローカルだと正常に実行できているからさっぱり原因が分からず詰んでしまいました。

19: [Unity] Assets/PatapataUnon/Scripts/Behavior/BehaviourUtil.cs(126,10): error CS0103: The name `UK_NumberUtility' does not exist in the current context

グーグル先生にも色々お尋ねしたのですが、ちゃんとした解決法が載っておらず…。

フォルダ名にLibraryを使っているのが原因

色々試行錯誤した結果は後述するとして、結論から先に書くとどうもフォルダ名にLibraryを使っているのが問題っぽいです。
該当するUK_NumberUtilityは以下のキャプチャの用に、「Scripts/Library/UK_NumberUtility」に配置していました。

(キャプチャは試行錯誤の過程でファイル名をNumberUtilitysにリネームしてます)
f:id:project-unknown:20170816124951p:plain

ここで、LibraryをLibrarysにリネームし、buildすると正常にbuildが通りました。

以下、試行錯誤でやったこと

単純に、愚痴りたいと言う意味で書いています。
どれも効果がなかったので、上述のLibraryをリネームすればOKだと思います。

呼び出しているClassをリネームして.meta周りで怒られた事があったので、別ファイルを生成してbuild

ClassをMonoDevelop上で、リネームした際にUnityEditorで何かアラートが出たことがあります(.metaがどうたら…覚えてない)。
なので、この際に.meta情報が欠損して、該当クラスのロードに失敗したかと思い、以下を実施。

  • 前のファイルは残したまま(コメントアウトだけした)
  • 別なファイル・クラスを生成して、メソッドだけコピー

結果 : エラー

呼び出し先のファイルを別ファイルにうつしてbuild

結果 : エラー

Scriptの呼び出し順を変更してみる

該当するクラスは、以下の用にMonoBehaviorを継承していないですし、呼び出し順とかは問題無いかもしれませんが、これもやってみました。

以下のExecution Orderを以下に設定
f:id:project-unknown:20170816125500p:plain

かなり優先度を上げたロードを実施するようにした。
f:id:project-unknown:20170816125634p:plain

結果 : エラー


結論

フォルダの階層を下ったとしても、予約されるものは使わないでおくに越したことないですね。
過去のディレクトリ構成の記事も一緒に更新しておきました。

project-unknown.hatenablog.com

開発効率を上げ、手軽に拡張できるFSM「Arbor2」紹介

この記事はUnity アセット真夏のアドベントカレンダー 2017 : ATND 17日目の記事です。

はじめに

つらつらとArbor2の事例紹介の記事を書いていたら、Arbor2の作者のケットシーウェア @caitsithwareさんに、アドカレの紹介を戴いたので、勢いで参加です(∩´∀`)∩

さて、本題です。

Arbor2

Arbor2を導入する事で、FSMベースのヴィジュアルスクリプティングを実現することが出来ます。(↓な感じ

f:id:project-unknown:20170816212003p:plain
プログラムベースじゃなくて、上記みたいに状態遷移図をポチポチしていくだけである程度のゲームが作れてしまうと言う夢のような機能ですね。

(勝手ながら私が思うに)Arbor2の競合として、PlayMakerが挙げられると思うのですが、PlayMakerと比べて私が特に秀でていると思うのは以下の通りです

  • 拡張性の高さ(拡張難易度が低い)
  • サポートが日本語
  • シンプルで迷うことが殆ど無い

拡張性が高いため、簡単に機能追加していけます。
例えば↓みたいに機能をエンジニアが用意し、プランナーやデザイナーがゲームを構築すると言う形で分業もし易いです。

f:id:project-unknown:20170816194149g:plain

この記事の構成

  • まず最初に導入部分として、簡単な機能を作る所まで
  • 拡張性が高い所の紹介
  • 実際開発している最中の機能事例の紹介

上記で行こうと思います。
後、2Dベースで紹介していますが、勿論3Dでも使えますよ!

説明を文字に起こすとかなりごちゃごちゃしてますが、実際にやってみるとビックリするほど簡単ですよ!
無料試用版もあるので、是非使ってみてください。

導入

より詳しい説明はArbor2公式のチュートリアルを参照いただく事として、ここでは最初の足がかりを紹介します。

ここでは、以下のgifの用に、画面クリックで吹き出しが切り替わる単純な動作を作る所まで紹介します。 (さり気なく宣伝ですが、キャラクタは活動中のProject.Unknownのマスコットキャラの「う〜のん」を使ってます。

f:id:project-unknown:20170816165936g:plain

上記の構成は以下の4つのSpriteで構成されています。

  • 「背景」Sprite
  • 「う〜のん」Sprite
  • 「・・・」Sprite
  • 「?」Sprite

でわでわ、早速作っていきます。

AssetStoreからimport

特に何も考えず全部Projectに突っ込みます。
f:id:project-unknown:20170816163211p:plain

CommponentからArborFSMでアタッチ

ArborをアタッチしたいGameObjectのInspectorから以下の用にArborFSMをアタッチ。
f:id:project-unknown:20170816164122p:plain

次に、下の画像のOpen Editorをクリックします。
f:id:project-unknown:20170816164428p:plain

専用のEditorが表示されます。ここにステートを設定していきます。 f:id:project-unknown:20170816164506p:plain

「マウスクリックで次のステートへ」機能を作成

右クリックすると下の画像のようになるので、「ステートを作成」をクリックします。 f:id:project-unknown:20170816164617p:plain

これで空っぽのステートが作成されます。 f:id:project-unknown:20170816164644p:plain

「New State」と書いてある右側の歯車をクリックして「挙動を追加」をクリックします。
f:id:project-unknown:20170816164756p:plain

すると初期に用意された機能一覧が表示されます。
f:id:project-unknown:20170816164851p:plain

Behaviorから「Transition > Input > ButtonDownTransition」を選択。
Transitionは、次のステートに遷移させる事を指しています。今回選択した、ButtonDownTransitionは、マウス等がクリックされれば次のステートに遷移します。

現段階で、Arbor Editorが以下の用になっていると思うので、

f:id:project-unknown:20170816170632p:plain

遷移させたいステートを造ります。先ほどと同じ要領で右クリック -> 「ステートを作成」をクリック。

f:id:project-unknown:20170816170728p:plain

後は、「開始ステート」のButton Down Transitionの遷移先に、追加で作ったステートを選択します。

f:id:project-unknown:20170816171015g:plain
(キャプったら荒ぶった感じになってしまった(;・∀・)

Sprite変更

ここで、吹き出しを切り替える設定を埋め込みます。
追加で作ったステートで、挙動の追加 -> 「Renderer > SetSprite」を選択。
Targetと、Spriteに入力する所があるので、今回はSprite部分に切り替えたいSpriteをセットします。

また、次にクリックされた際に、別ステートに選択させたいので、先程と同様に、ButtonDownTransitionを追加します。

f:id:project-unknown:20170816171509p:plain

仕上げ

吹き出しを元に戻すステートを追加し、全てのステートをつなぎ合わせると以下のようになります。

f:id:project-unknown:20170816171624p:plain

動作確認

f:id:project-unknown:20170816173200g:plain

見て頂ければ分かるのですが、現在どのステートに居るのか、そのステートは何回目遷移してきたのかが視覚化されており、デバッグ機能としても非常に優秀です。

拡張性

お次は、拡張性の所を少しご紹介します。
Arbor2は、最初から用意されている機能を修正する事も出来ますし、自分で挙動をホイホイと追加することもできます。

既存の機能の修正

ArborのライセンスはEULAとなるかと思うので、デフォルトにあるコードを載せておりません。一部コードの抜粋で紹介を行いますが、問題がある場合は削除するのでご連絡ください。

導入部分でも登場した、ButtonDownTransitionに、ボタンが押された際に現在どのステートなのかをLogに出力するように改修を加えてみましょう。
まず、先程の例だと、全て「New State」になっているので、Logが分からないことになるので、以下のキャプチャのようにステート名を変更します。

f:id:project-unknown:20170816190642p:plain
(それぞれ「Start」「QuestionState」「SilentState」で名前を設定)

次に、実際にコードをいじっていきます。
↓の用に「スクリプト編集」をクリックすると該当するコードを直接編集できるようになります。

f:id:project-unknown:20170816181005p:plain

Updateメソッド内のInput.GetButtonDownのif文の中に以下のコードを埋め込む。

Debug.Log("Current State : " + state.name);

「state.name」で現在のステート名を取得できます。stateについての詳細はArbor 3: FSM & BT Graph Editor: State Class Referenceを御覧ください。

これを実行すると、ログはこんな感じで出力されます。

f:id:project-unknown:20170816191002p:plain

新規に挙動を追加

次に自分の好きなようにArbor2に機能(挙動)を追加します。

ここで作るものは、SpriteRendererの色を変更する機能を追加してみます。

Project Windowで、右クリック -> Create -> Arbor -> StateBehaviour -> 言語を選択
ファイル名は「ArborChangeSpriteColor.cs」としました。

f:id:project-unknown:20170816202126p:plain

コードの中身は以下な感じです。
(Arborに関する所にコメントを入れてます。

gist.github.com

上記で保存すると、ArborFSMの挙動追加で↓みたいに今回追加した機能を追加出来ます。
f:id:project-unknown:20170816204851g:plain

でわ、早速これを導入部分で作ったものに組み込んでみます。
1秒に1度う〜のんの色が変わるようにします。

う〜のんにArborFSMをアタッチして、こんな感じでFSMを編集します。
f:id:project-unknown:20170816204239p:plain

  • TimeTransitionは指定した秒数が経過したら次のステートに遷移させる機能です。
  • Arbor Change Sprite Colorに変更したいSpriteRendererを登録し、色もセットします

実行してみます。

f:id:project-unknown:20170816204456g:plain
(う〜のんがこわい…

こんな感じで、機能を自分で埋め込んでいくと、最終的に以下のように、開発しているゲーム独自に特化した機能を揃えることができ、
コアに作り込まないと行けない所は、ゴリゴリコードを書いて、
レベルデザイン等は、Arbor上で行うと言った作業の割り振りが出来そうです。

f:id:project-unknown:20170816194149g:plain
(懺悔すると、上記はgif用にメニューを用意しただけで、中身は空っぽの機能だらけです

他の機能実例

以下に、これまでに記載したより具体的なArbor2の実例を記してますので、もし興味があればmm

project-unknown.hatenablog.com

project-unknown.hatenablog.com

まとめ

紹介のはずがダラダラと色々詰め込んでしまいました(;・∀・)
総括すると、デフォルトで用意されている機能だけでもだいぶ効率的に開発出来ますし、
かゆい所に手が届かなかったら自分でサクッと機能追加出来る意味で、おすすめなAssetですよ(∩´∀`)∩

Unity アセット真夏のアドベントカレンダー 2017 : ATND次の担当は、baba_sさんで「Hierarchy を拡張する多機能アセット「PRO Hierarchy + Memory Monitoring + Navigator for Selecting」紹介」ですね!個人的に勢いで買ったは良いけど使わずにいるAssetなので凄い楽しみです。

baba-s.hatenablog.com


参考

ArborでuGUIのボタンを活性/非活性にする

はじめに

Arbor上からuGUIのボタンのinteractableをいじりたい時のサンプルです。

凄い簡単ですが、以下のコードを「ArborButtonInteractable.cs」とかで好きな場所に保存すると、「挙動追加 > UI > Button > ボタンの活性、非活性」から使えるようになります。

gist.github.com

使い方Sample

前回の↓の記事の延長で行います。

project-unknown.hatenablog.com

やりたい事

  • 戸棚が開いていたらまたたびボタンを活性化させたい
  • 逆に戸棚が閉まったらまたたびボタンを非活性化させたい

戸棚の状態を見てState先を変えるコード

今回はArborの常駐ステートで常に監視する方針ですすめます。
まずは、以下のコードで戸棚の状態を見て、戸棚が開いていたら遷移するステート、逆にしまっていたら遷移するステートを選択できるようなコードを用意します。

gist.github.com

Arbor FSM編集

  • ArborOpenDoorTransition
  • ArborButtonInteractable

上記を、↓のように組みます。

f:id:project-unknown:20170815225646p:plain

以下が実行結果です。

f:id:project-unknown:20170815230020g:plain

(ふと思ったけど、こうも開発中の画面をポンポンだして良いものだろうか…(;・∀・)

Arbor2で状態に応じてButtonの表示/非表示、Buttonタップ時のMessageを検知する

書こう書こうと思っていたArbor2の備忘録を書いていきます。

やろうとすること

凄いざっくりですが、以下の事をやろうと思います。

  • ゲームにとあるキャラ(今回は猫としてます)が登場したら、ボタンが表示される
  • ボタンをタップしたら、GameManagerクラス等でイベントキャッチと非表示処理

はじめに

インストール等、Arbor2って?と言うところは以下の公式を参照してください。

arbor.caitsithware.com

また、今回は絶賛開発中のゲームから抜粋してきているので、名前の付け方等、所々「?」となるかもですがご容赦ください。

Hierarchyを準備する。

今回はuGUIを使います。なので、Canvasに、以下の構成でぶら下げます。

f:id:project-unknown:20170814164316p:plain

Canvasは空のオブジェクトです。
Matatabiというのは、今回のゲームは「またたびボタン」としたいので、その名前をおいています。Matatabi自体はCanvasです。
MatatabiButtonが今回、非表示/表示処理を行いたい対象で、Buttonを置いてます。

Matatabi(Canvas)の作業

Matatabiには、MatatabiButtonの表示/非表示処理を担ってもらいます。
MatatabiのInspectorに以下のComponentを追加します。

f:id:project-unknown:20170814164723p:plain

Arborの状態遷移を追加しています。
Open Editorで状態遷移を開きます。
ここで以下のような遷移を作成しています。

f:id:project-unknown:20170814164853p:plain

上記状態について一つずつ説明していきます。

ArborCatStateStageIn

これ自前で用意したものです。
猫が登場したらまたたびボタンを表示すると言う事を行いたい為、Catオブジェクトの状態をチェックし、Catオブジェクトのステータスが茂みに登場したら次の「またたびボタン表示」状態へ遷移させます。

実際にArborCatStateStageInは以下の処理を行ってます。

gist.github.com

if (_Cat.CurrentState == Cat.CatState.Stay_StageIn) {

で、Catオブジェクトの現在の状態を監視している簡単なScriptです。

これで保存すると、Arbor2上では以下の挙動が追加されてます。

f:id:project-unknown:20170814165406p:plain

(初めてこれを見た時、Arborすげええええええ!!!ってなった

後は、上記からArborCatStateStageInを選択し、Catオブジェクトをセットし、次のステートに紐付けを行います。

ActivateGameObject

この挙動はStateに入る直前とStateから出ていく時にGameObjectのActive, 非Activeを設定出来ます。

ここでは、このStateに入る時にActiveにしたいのと、非表示処理はボタンをタップした時に実施するので、EndActiveもチェックを入れた状態にします。

MatatabiButtonの作業

次はMatatabiButtonの作業を行います。
こいつにはボタンを押した時の処理を担ってもらいます。

Stateは以下な感じです。

f:id:project-unknown:20170814165828p:plain

Start

開始ステートは、MatatabiButtonがタップされたかだけ見ており、タップされたら、次の「またたびを投げる」Stateへ遷移させてます。

またたびを投げる

SendMessageGameObjectで、指定したGameObjectのメソッドを読んでいます。
上記の例では、GameManagerオブジェクトのDidTapMatatabiButton()をコールしています。
これで、GameManagerはMatatabiButtonがタップされたことを検知出来るようになります。

また、このStateのActivateGameObjectで、非表示処理を行いボタンを消してます。

実行結果

MatatabiとMatatabiButtonそれぞれでの実行結果を貼っておきます

Matatabi(Canvas)

f:id:project-unknown:20170814170438g:plain

MatatabiButton

f:id:project-unknown:20170814170501g:plain


最後に

Arbor2はまだまだ全然使いこなせていないですが、簡単に自分で機能を追加が出来るのは本当に便利です。
まだ購入していない人は是非Asset Storeで買っちゃいましょう!

UnityのPosition周りの共通っぽい処理

Writtern by ゆう@あんのうん

はじめに

以下のゲームジャムに参加し、その成果物をアプリ化すべく、現在リファクタリングを行っているのですが、
今後のゲームジャムであると私が楽になりそうな共通処理を抜き出しました。

project-unknown.hatenablog.com

Tranform.positionの各座標の操作は、readonlyになっている為、一度別な変数に置き換えて、編集してから再代入しないといけなく、その手間を省いたものです。
staticクラス化して外部から読めるようにしているのは、

ゲームジャムだと時間がまったくなく、クラス設計がぐちゃぐちゃになって1つのクラスで他のGameObjectをいじりまくるシーンが頻発しているので、 外部参照出来るようにしています。

※本来はPosiitonをいじる時点で専用のクラス化を行うのが設計上正しいと思ってます。

「BehaviourUtility.cs」と「NumberUtility.cs」のクラスを作成して、以下のソースコードを丸コピすれば動く(はずです。
コードより下に、軽い説明を記載していますので、一緒に参照ください。

gistが使い慣れていないせいか、space4, spaceインデント設定なのにtab化されてしまってます。申し訳orz

gist.github.com

以下、各コードを軽く紹介。

NumberUtility.cs

Utilityと書いてますが、2つしか機能がありません。

GetValueOrMaximum(float value, float limit)

いわゆる 「x %= y;」とかをするメソッドです。
ただ、私自身がコードのど真ん中に「x %= y;」とか書いてあると、ん?とコードリーディングが止まったりするので、私自身への可読性向上の為に、回りくどい書き方をしています。
使用例としては、

// GameObjectのX座標を10以上いかないようにする。
float x = gameObject.transform.position.x
x++;
NumberUtility.GetValueOrMaximum(x, 10);
GetValueOrMinimum(float value, float limit)

GetValurOrMaximumの逆です。説明は省略。

BehaviourUtility.cs

BehaviourUtility.PositionX,Y,Z

引数として渡されたGameObjectの各座標を取得します。

float posX = BehaviourUtility.PositionX(gameObject);

BehaviourUtility.PositionFrom

GameObjectの座標を引数で渡されたVectorで加算/減算します。

// gameObjectの座標を、Vector3(1,0,0)へ移動させます
BehaviourUtility.PositionFrom(ref gameObject, new Vector3(1,0,0));

BehaviourUtility.PositionFromX,Y,Z

BehaviourUtility.PositionFromの各座標のみ指定するVerです。

// gameObjectのX座標を1ずらします
BehaviourUtility.PositionFromX(ref gameObject, 1);
// gameObjectのY座標を1ずらします
BehaviourUtility.PositionFromY(ref gameObject, 1);
// gameObjectのZ座標を1ずらします
BehaviourUtility.PositionFromZ(ref gameObject, 1);

BehaviourUtility.PositionAt

GameObjectのTransform.positionを引数で渡されたVector3で置き換えます。
(単純に毎回gameObject.transform.positionと書きたくなかっただけです)

// gameObjectをVector3(1,0,0)でセットします
BehaviourUtility.PositionAt(gameObject, new Vector3(1, 0, 0));

BehaviourUtility.PositionAtX,Y,Z

BehaviourUtility.PositionAtの各座標Ver, 説明は省略

BehaviourUtility.PositionAtToMaximum, BehaviourUtility. PositionAtToMinimum

BehaviourUtility.PositionAtの最大値以上/最小値以下に移動しないように制限する機能です。

BehaviourUtility.PositionAtToMaximumX,Y,Z
// gameObjectを+1移動させます。(最大値の10を超えると、10がセットされたままになります)
BehaviourUtility.PositionAtToMaximumX(ref gameObject, 1, 10);
BehaviourUtility. PositionAtToMinimumX,Y,Z
// gameObjectを-1移動させます。(最小値の0より下回ると、10がセットされたままになります)
BehaviourUtility.PositionAtToMinimumX(ref gameObject, 1, 0);

余談 自分自身のPositionを変更する場合

今回公開したコードは、あくまで別クラスからの操作に特化させています。
自分自身のpositionをいじる場合は、上記みたいな煩雑なやり方をしなくても、親クラスに以下のようなコードを記載しておいて、PositionXとかでいじったほうが良いと思います。
(コードはWebで他の先人たちのコードを取り込んでいます。

gist.github.com

Unity 1 Week Game Jam お題「夏」

f:id:project-unknown:20170624232237p:plain Unity 1週間ゲームジャム | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

今回も性懲りも無く参加しました!
んで、性懲りもなくレポート書いてきます!

作ったゲーム

https://unityroom.com/games/patapata-unon

↑からPlayできるので是非遊んでみてください!

f:id:project-unknown:20170805131631g:plain

ずっとずっとやりたかった、我がProjectのマスコット(何もタイトル出してないのにマスコットだけは作っていた)のう〜のんを使ったゲームです。

企画

前回、ギリギリまで参加する/しないで悩んでいて、結果作業時間が殆ど確保出来なかったので、同じ轍は踏まないように、月曜の朝から通勤時間を用いてデザイナのぽぽたとSlackを用いて相談。

夏と言えば?でパッと思いついたもので以下のものが絞れました。

  • スイカ
  • 風鈴
  • 汗 (俺の一押し)

企画の詰め

スイカ

真っ先に考えたのが、スイカでFPSの案でした。

  • 主人公はスイカの種を口から発射してEnemyを倒す
  • スイカの種は、口の中からなくなったら、新しく食べてリロード
  • 腹がいっぱいの場合はスイカが食べられないから、動き回って空腹ゲージを増やす
  • スイカはお母さんから補充されて、たまに種無しスイカが出て来る所にイライラポイントを作る

個人的に満腹ゲージの反対を行くと言う所と、スイカのFPSという所がおもろいやんと思ったのですが、
いかんせん開発が間に合いそうに無いと言う理由で見送りました(いずれ作ってみたい

通勤時間中、汗だくになっていたと言うのあって思いついた案でした。

  • 満員電車で汗が垂れ落ちてくるので、他の人に飛び散る前に拭き取る
  • あまりに連続して拭くと周りの女性から痴漢と勘違いされ人生が詰む

ここまで考えて、痴漢の所が最近話題と言うのと、社会的倫理としてどうよと思ったので没

風鈴

  • あるクーラーが買えない貧乏一家が暑くて耐えられなく、風鈴を拾ってくる。
  • ただ風が一切無い状態なので、風鈴が鳴らず哀愁を漂わせている。
    • 結局貧乏は止めて、おじいさんが風鈴が鳴らずに困っている設定になりました。
  • そこに主人公がこっそり影で風鈴を鳴らして涼しさを提供すると言うゲーム案が出ました。
  • パッと考えた感じでぽぽたと完全に意見があったのでこれで行こうと言う事になりました。

言い訳開始

前回でも載せてた以下のつぶやきですが、

完了と書いておきながら、現在この記事を書いている間も続行中です
なので、平日は家に帰るのが日付を超えてからじゃないと帰れなかったのでまったく作業出来ませんでした。

土曜

この日からガッツリ作業する予定だったのですが、

kenjin.unity3d.jp

上記に参加した為、作業を開始したのは夜でした。(凄い勉強になったので、個人的には行って良かったです。

夜から、ぽぽたと合流して、製作開始です。

折角、今回新規に参加するんだから、Unityのバージョンを上げてしまえと勢いで2017.1.03fへupdateを行ったら、ものの見事につまりました。
(以下の記事に詰まった詳細を載せております)

project-unknown.hatenablog.com

予めどんなことをやるのかの大枠を決めていたと言うのと、
主人公を我がProjectのマスコットである「う〜のん」を使うと言う所もあり、
あまり議論を交わさずとも、殆どゴールの共有が出来ていました。
↓う〜のんのイメージ図

f:id:project-unknown:20170806030024p:plain f:id:project-unknown:20170806030034p:plain

ここでなんとなくでゴールの共有が出来ていたのは、自分らの中でう〜のんのキャラ付けが強烈に出来上がっていた為、
う〜のんをゲームに登場させると言うだけで、どんなタッチのゲームになるのかが想像できていたと言うのがでかいです。
(こう考えると、インパクトの強いキャラから考えてもゲーム企画もそうですが、コミュニケーションコストがかなり軽減出来るかもですね

この日は画像を用意してもらって、Unity上でざっくり動作させる所(以下Gif参照)で力尽きる。

f:id:project-unknown:20170806030631g:plain

日曜(最終日)

この日はお昼からガッツリ開発開始。
bitbucketに並べたかんばんのタスクが30個から一切減らない(消化スピードより、新たに見つかるもののスピードの方が早い)という絶望を噛み締めながら仕上げていきます。
相変わらず夜になっても、半分くらいしか開発が終わっていなく、ゲームデザインの調整をしている暇も無く、締め切りの20時が過ぎ去っていきます。

23時頃にある程度の完成の目処がたち、WebGLに初めて書き出してみたのですが、ここでWebGLで表示するとuGUIが尽く想定の斜め上を行く現象が発生
おそらくLayoutあたりの指定が甘かったのがあるのだと思うのですが、尽く小さくなっちゃってUIとしての機能を果たしてくれない状態でした。
(結局四の五の行っている状況ではなかったので、全てのUIを固定幅で指定してUploadしました。

開発部分のお話

2Dを採用した理由

これまで世に出していないだけで、色々ゲームは作っていて、2Dの方が経験値として高かったと言うのと、やはりう〜のんのキャラ的に2Dの方が遥かに映えるので、ここは特に考えることも無く2Dで製造しました。

AI(おじいさんの実装)

  • 理想
    • 一定時間で振り向く
    • 引き戸を素早く開くと音に反応する
    • 風鈴が鳴りすぎると振り向く
  • 現実
    • 一定時間(乱数)で振り向く

余り作り込めて無いです。そのせいで挙動不審な勢いで振り向く時があります。

タッチ判定

なんだかんだでここに時間がかかってしまいました。(Asset買っておけば良かった...)
Eventシステムが余り使い慣れていないと言うのもあり、ドラッグとクリックでうまく処理を分ける所につまずいて居ました。
色々グーグル先生に尋ねたりして、UI周りのHandlerにDelegateを突っ込む形で実現

public class TouchEventHandler : BaseSingletonMonoBehaviourOnGameObject<TouchEventHandler>, IPointerDownHandler, IPointerUpHandler, IBeginDragHandler, IEndDragHandler, IDragHandler{

    //タップ中
    private bool _isPressing = false;
    public  bool  IsPressing{
        get{return _isPressing;}
    }

    //ドラック中か
    private bool _isDragging = false;
    public  bool  IsDragging{
        get{return _isDragging;}
    }

    //ピンチ中かのフラグ
    private bool _isPinching = false;
    public  bool  IsPinching{
        get{return _isPinching;}
    }

    //全フレームでのドラック位置(ワールド座標)
    private Vector3 _beforeTapWorldPoint;

    //ピンチ開始時の指の距離
    private float _beforeDistanceOfPinch;

    //タップ関係
    public event Action<bool> onPress       = delegate {};
    public event Action        onBeginPress  = delegate {};
    public event Action        onEndPress    = delegate {};

    //ドラッグ
    public event Action<Vector2> onDrag      = delegate {};
    public event Action<Vector3> onDragIn3D  = delegate {};
    public event Action          onBeginDrag = delegate {};
    public event Action          onEndDrag   = delegate {};

    //ビンチ
    public event Action<float> onPinch      = delegate {};
    public event Action        onBeginPinch = delegate {};
    public event Action        onEndPinch   = delegate {};

/* 以下省略 */

Animation

簡単なAnimationが多かったので、メカニムを使うのではなく、ここもコードでパラパラ漫画を使って乗り切ってます。
(どんだけ追い込まれているんだ…)
基本はAnimation部分をコルーチン化しておき、条件に応じてコルーチンを発動と言う形で動かしています。

利用したAsset

拡張しやすいFSM:『Arbor 2』

主に画面遷移、ボタン操作等に利用

このブログでも何度か登場していますので、以下も御覧ください。

www.project-unknown.jp

www.project-unknown.jp

www.project-unknown.jp

www.project-unknown.jp

DOTween

簡単なAnimation等は、Animator等を使うより、こっちでコードベースで書き起こしたほうが早いです。

Easy Save - The Complete Save & Load Tool for Unity

主に保存機能の時に利用。
ノリはiOSのUserDefaultsみたいに軽いノリで掛けるのが個人的に神がかっているAssetです。

Game Music Pack - SUITE

ゲームミュージックの詰め合わせです。
バリエーションが豊富で、1つ持っていれば大体のゲームに使えそうですし、何よりクオリティが高い。

4500 GUI Elements Pack

ひと昔前のゲームは全てこのAsset使ってたんじゃないのか?と言うレベルに見たことがあるパーツの組み合わせです。
ちょっと古いアイコンが多いですが、それでもまだまだ現役で使えるようなアイコンが数多くあり、重宝しています。

反省点

Unityの機能を使いこなせてない

Unityそこそこ使ってきたつもりで居たけど、まったく使いこなせていない。
Unityの機能を使うより、コードで書いたほうが早いと言う判断が出る時点で駄目。

息をするように使えるようにスキルを挙げないといかん

共通化処理をもっと纏める。

前回書いていた処理を今回も書いていたと言うところはいただけないので、共通化する。
また、今回詰まったドラッグ+クリック周りの処理は良く出てくるはずなので、これも共通化処理として纏めておく。
ちなみに、今纏め始めている最中で、以下の用に纏めつつあります。

f:id:project-unknown:20170806034123p:plain

オブジェクト脳を鍛える

やっぱりテンパると1つのクラスの処理を纏めがちになっており、現在リファクタしているのですが、非常に読みにくい。
もっとオブジェクト脳を鍛えていかないといけないなーと猛省しております。
(業務でもSwiftとかバリバリオブジェクト指向で書いているので、ここは自信があったのですがダメダメでした。

感想

前回と同じ所で、やっぱり期限とお題があるのは本当にありがたいです。
このイベントのお陰で、今自分が持っている武器はなんだろう?しかもその武器は速度が出るのか?を常に考えて実装に入っているので、今自分が置かれている状況・スキルセットを振り返る良い機会になります。
また、一緒に弱点も見えて来るのと、勉強したい事柄も見えて来ます。

ぱたぱたう〜のんの今後

前回のFallStoneもやろうとして出来て居なかったのですが、折角ここまでの形にしたので、アプリ化を目指して現在進めています。
以下は、開発中のかんばん f:id:project-unknown:20170806034259p:plain

(既にタスクが30個もツンである(;・∀・)

そこまでクオリティある所まで持っていくのは厳しいかもですが、より遊び要素を追加したものを開発中ですので、リリースできた際は是非遊んでみてくださいね!

Unity2017.1.0f3にUpdateした際につまずいた所

はじめに

ゆう@あんのうんです。

先週Unity1週間ゲームジャムに参加するにあたり、どうせならUnityを最新版にして参加しようとし、Updateした際に思いっきりつまずいた所の紹介と、私が取った解決法を記載します。

発生環境

  • Macbook Pro 2014モデル
  • OS Sierra
  • Unity5.3.x系からUnity2017.1.0f3へのUpdateで発生

発生した問題

japan.unity3d.com
上記Unity公式から、Unityの最新版へUpdateした際、インストールの最後に以下のエラーダイアログが表示されました。

Copying /Library/Application Support/Unity/Unity_v5.x.ulf to /Library/Application Support/Unity/Unity_lic.ulf: No such file or directory

なんかライセンサの更新の所に思いっきり引っかかっていそうなエラーです。
Google先生にご教示頂いた所、ライセンサのエラーは何個か見つかったのですが、私の様なエラーは発生していないような感じがします。

とりあえず、このままだとよくわからないので、Unityを立ち上げてみると、また上記と同じエラーダイアログが出ます。

対応内容

エラー内容を見る限りだと、Unity5系からUnity2017系にUpdateする際に、ライセンサをリネームしようとしている感じがしているので、ここを手動で行ってみます。

$ sudo cp /Library/Application Support/Unity/Unity_v5.x.ulf /Library/Application Support/Unity/Unity_v5.x.ulf.bk
$ sudo cp /Library/Application Support/Unity/Unity_v5.x.ulf /Library/Application Support/Unity/Unity_lic.ulf

(1行目は念のためのbackupを取ってます。)

これで立ち上げると、アカウントのActivate画面となった為、画面に従ってActivate処理を行います。
すると、Activateの最後に以下のエラーダイアログが表示されました。

Failed to write "/Library/Application Support/Unity/Unity_lic.ulf". Please verify you have write permissions to this file.

エラー内容を見る限りパーミションのエラーだったので、該当ファイルのパーミションを変更します。
(他のライセンサの所有者がMacのユーザ名だったので、rootからユーザへ変更します。

$ sudo chown {アカウント名} /Library/Application Support/Unity/Unity_lic.ulf

最終的に、ライセンサが格納されているディレクトリは以下の構成となりました

$ls -al /Library/Application Support/Unity/
drwxrwxr-x 6 root wheel 204 7 30 02:14 .
drwxr-xr-x 20 root admin 680 12 10 2016 ..
-rw-r-----@ 1 {アカウント名} wheel 1999 7 30 02:17 Unity_lic.ulf
-rw-r--r-- 1 {アカウント名} admin 1967 9 26 2015 Unity_v4.x.ulf
-rw-r-----@ 1 {アカウント名} wheel 1996 7 28 23:08 Unity_v5.x.ulf
-rw-r----- 1 root wheel 1996 7 30 02:14 Unity_v5.x.ulf.bk

上記対応後、再度Unityを立ち上げると再びアカウントのActivateに移ったのですが、Activate後は問題なく利用することが出来るようになりました。

この対応は問題なかったのか?

手動でライセンサをコピーしたり、パーミション変更を加えているので、対応が正しいのか不明だったのでUnityサポートに問い合わせさせていただきました。

以下が回答

稀有な現象で同様の事例については情報がないのですが、
あいにく動作を保証することはできません。しかし、おそらく問題はないかと思います。
何かしら問題が発生しましたら再度お問い合わせいただければと思います。

Unityサポートでも把握していない事象のようです。
一旦、問題なく利用できるようになりましたので、引き続きこのまま利用させていただこうと思います。
状況に進展がありましたら、またこちらで報告します。

Unity 1 Week Game Jam お題「積む」

出来の良いゲームじゃないけど、生意気にも参加レポート書いていきます。

f:id:project-unknown:20170624232237p:plain Unity 1週間ゲームジャム | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

作ったゲーム

f:id:project-unknown:20170626005355g:plain

よくありがちな、足場を作って下に降りていくゲームです。

https://unityroom.com/games/fall-stone/webgl
↑からPlay出来ます。

はじめに(言い訳)

Unity 1 Weekにずっと参加したかったのですが、中々時間を捻出する事が出来ず、今まで見ているだけでしたが、
今回は中途半端になっても良いので参加しました!

(踏ん切りが付いたのが木曜日、既に大分日数が過ぎています)

ただ、運が無いと言うかなんと言うか、職場のアプリで大規模障害が発生し、そのヘルプに駆り出されて全く作業が出来ませんでした。
と言うのは言い訳ですね。

というわけで、土曜の夜から製作開始です。

企画開始

元々Unityはちょくちょく触っているのですが、

  1. 企画する
  2. プロトタイプを作る
  3. 絶望的につまらない
  4. 1に戻る

上記でエンドレスな為、これまで一度もゲームをリリースしたことがありません。

というわけで、壊滅的に企画力に自信がありません
それに加えて、期間が残り1日しか無い。

ここで既に思考停止気味ですが、色々と開き直って企画開始。

まず思い浮かんだもの。

とにかく足場を造りながら下に降りて行くもの。

f:id:project-unknown:20170624233459g:plain

(キャラクターライセンス© UTJ/UCL)

やばいものすごくつまらない (これはユニティちゃんに失礼なゲームになってしまう)

練り直し

落下して且つ、ある程度の高さから落ちたらGameOverにしようと考えました。
となると、少しの段差から落下したらOUTなものってなんだろうか…
(速攻でスペ○ンカーが思いつきましたが流石にまずい)

後は、人がモン○ンみたいに卵を持って落下すると割れてしまうと言うのも思ったのですが、

絶望的にモデリング(その前の絵心)のskillが無い

もう時間も無いので、ガラス玉と言う想定で進めます。

勝手にPlayer(ガラス玉)があるきだすので、足場を作ったり、ブロックで壁を作ったりして誘導しながら降りていくものを造ります。

f:id:project-unknown:20170624234057g:plain

いい感じにカオスになった

(この時点で土曜の23:30 blog書いてる余裕無いな…)

詰む現象

お題が積むだから、そのままでも良い気がしてもないですが、

f:id:project-unknown:20170624234350g:plain

こうなると完全に詰んだ状態になりまた思考停止。

うし、足場が一定時間経ったら壊れるようにしよう

f:id:project-unknown:20170624235441g:plain

とんでもないことになった…。

寝る

全く進捗が無く、且つ、モンスターにゼナを摂取しても眠気がひどくガッツリ寝る。

落ちる時の制限を考えてみる

別なアプローチとして、落ちる時に即座に落ちてしまうんじゃなくて、
落下できる状態になったら、落下してみる方向で考えてみる。
ついでに、ある程度落下したらゲームオーバーもやめる方向で。

f:id:project-unknown:20170625135452g:plain (Scoreも入れてみた)

なんか一歩前進した気がする。
ただ、衝突判定がうまく言っていないのか、床抜けするバグが中々直せない。
(やばい、後6時間や)

煮詰まって来たので、デザインの方を考えてみる

キャラを作る余裕が無いので、このまま球体をPlayerとして扱う方向で。
となると、はじめはファンタジックな見た目にしようと思っていたのですが、幾何学的な見た目の方にしようと、
ウチのデザイナーのぽぽたに依頼。

f:id:project-unknown:20170626005739p:plain

かなり良さげな背景が仕上がって来ました。
(これを見て、足場とかも全て立方体に直そうと思ったのですが、時間が無くてそのままに。)

タイトル画面を作る

f:id:project-unknown:20170626005903p:plain

カジュアルさと、一貫性を担保する意味で、ゲームの背景とタイトル画面を同一なタッチで仕上げる。
タイトル画面だけ見ると、スタイリッシュに仕上がったなーと。
(期限まで残り30分)

仕上げ

もうここからの追加のゲーム性を求めるのは無理なので、気になるバグ取りと、UI、レベルデザインの方にフォーカスしていきます。

心残りな所

敵キャラ的な位置づけのものや、今はただ平たいステージだけですが、斜めの物を用意したりと、
ちょこちょこと追加要素は企画まで出来ていたのが作り込めなかったのが心残り。
後は最低限Twitter機能は入れたかった…。

感想

期限があり、お題があるって本当に良いなーと言うのが素直な感想で、
期限があると、エターナル現象が発生していても目を瞑って先に突き進むしか出来ないし、お題があると「あれも」「これも」と放散しまくるアイデアにやんわりと制限を加える事ができ、物を生み出す上で、凄い大事なことだなと。
今まで終わりまでゲームを仕上げたことがなかった自分にはものすごい刺激になり、
また、途中多少つまらないと思っても、推敲を繰り返していくことで、なんとか遊べる程度のゲームが出来ると言う所で感動した次第でした。

次回ですが、今回で時間が無い中でもなんとかなったと言うのもありましたし、
ものすごい勉強になったのもあるので、可能な限り参加させていただきたいと思いますヽ(=´▽`=)ノ


以下蛇足

unityroomに投稿

なんとかゲームとして動くようになってUploadしようとしたら、なんぼやっても502 Bad Gatewayで弾かれる…。
期限過ぎてから出そうとしたので、他の方がガッツリゲームをやっている時間帯だったし、サーバの負荷的な問題か、Upload容量制限なのかなと思い、
自分で出来る解決策としたら、使っていないファイルを削除して可能な限り軽くしようと不要そうなファイルを削除していった所。
ガッツリモデリングファイルまで消してしまって、ゲームが動かなくなる
一応git管理をしていたので、ゼロと言う事はなかったけど、それでも結構な手戻りが発生し、リリース直前に心が折れかかりました(;・∀・)
(なんとか復元したけど

そんな中、@naichilab さんのメッセージが、参加者を大事にしてくださっているんだなーと凄い嬉しかったです。

利用したAsset

拡張しやすいFSM:『Arbor 2』

今回のゲームでちょこちょこAssetは使ったのですが、その中で一番お世話になったのはarbor2ですね。
これのお陰で、何回も作り直しをしたのですが、ぱっと組み立てられるし、ある程度自分専用の拡張をしていたので、構築がメチャクチャ早かったです。
素敵なAsset有難うございます!

www.project-unknown.jp

www.project-unknown.jp

www.project-unknown.jp

www.project-unknown.jp

First Fantasy for Mobile

主にステージや、爆発などの表現に利用してます。

FX Mega Pack

エフェクトのAssetです。カートゥーンな表現のエフェクトが盛りだくさんで、使い所は限られてるかもしれませんが、世界観さえ合致すればかなり有用性の高いアセットです。

Unityのディレクトリ/フォルダ構成 (2017年8月時点)

はじめに

Unityが初心者すぎるが所以か、ディレクトリ構成にものすごく毎日頭を悩ませております。 (神経質過ぎる性格なせいで、ディレクトリ等のProject管理系がしっかりしていないと何事も集中できない面倒な性格です。。。)

なので、一回自分なりに管理しやすいUnityのディレクトリ管理について纏めます。 多分正解はないと思うし、日々updateしていく考え方だと思うので、定期的にこの記事は更新できれば良いなーと思う所存です。

参考にさせていただいたサイト様

以下2つを参考にさせていただいております

http://komaken.me/blog/2016/09/01/unity%E3%82%AA%E3%83%AC%E3%82%AA%E3%83%AC%E3%81%8A%E3%81%99%E3%81%99%E3%82%81unity%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90%E3%81%A8git%E7%AE%A1%E7%90%86/komaken.me

qiita.com

2017年6月時点でのディレクトリ構成

Assets/
{$GameName}/ Gameの名前のディレクトリを1つ作って、開発するものをこの中に全部突っ込む。AssetStore等で外部から持ってきたAssetがフォルダを崩さないようにする(上述サイト様の受け売り)
Animations/ Gameで使うAnimationを設置
Audio/ Gameで使う音楽ファイルを設置
Fonts/ Gameで使うフォントを設置
Shaders/ Gameで使うシェーダーを設置
Materials/ Gameで使うMaterialを設置
Scripts/ Gameで使うScriptを設置
{$namaspace}/ 名前空間ごとにフォルダを切る(これは目からウロコ)Arborとかで作ったものをここに置くと良いかも
Editor/ エディタ拡張用
Behavior/ MonoBehaviorを継承したもの
Librarys/ MonoBehaviorを継承していないが他で使いたいもの
Scene/ Scene設置
Test/ Test用のScene
Game/ ゲームで使うScene
Prefabs/ ゲームで利用するPrefab
Object/ 基本はここ以下に設置。量が増えるので種類ごとに分ける
Particle/ パーティクル
Etc/ その他
Physics Materials/ ゲーム内の物理エンジンで利用するPhysics Materialを設置
Texture/ ゲームで利用するTextureを設置
Editor/ Unityのエディタ拡張の為設置
Externals/ AssetStoreunitypackageで取ってきたものを設置
License/ LICENSE(主にAssetsや他の作者様の物を使った時等)とかを纏めておく
Models/ FBXとか
Plugins/ dll置き場
ProjectUnknown-Kit/ 自分達のProject共通Package
{$Framework_name} フレームワーク毎にフォルダを命名します(バッティング防止の為) 、これより以下は、上記{$GameName}/と同じ構成
Resources/ Resources.Loadで読み込むものを設置

一旦これですすめようと思います。 他に良い管理法があればご教示頂ければmm

A* Pathfinding Project Proを使ってみる

はじめに

Navmeshの使い方もままならないのに、A* Pathfindingに手を出してしまって、Sample的な使い方をしているのでそのメモ。

10,000円以上払ったのだから是非とも自分のものにしないと!

A* Pathfinding Project Pro

以下は今回作ったものです。 適当にTerrainを用意して、カプセルをPlayerに、スフィアを目的地としています。

パターン1 直線距離で移動できる f:id:project-unknown:20170601012308g:plain

パターン2 直線距離を崖で塞ぐ f:id:project-unknown:20170601012440g:plain

うむ、まだNavmeshとの機能差異はさっぱわからない(;・∀・)

とりあえず、ここまでやった内容をメモがてらに記載します。


(Terrainとカプセル、スフィアを作るところは流石に割愛)

まず、A*をSceneに配置する為に空のGameObjectを置きます。 このObjectに「Pathfinder」をアタッチします。 f:id:project-unknown:20170601012719p:plain (Pathfinderでアタッチしたのに、ComponentがAster Path(Script)となっているのは気にしない)

そうすると、↓のようなComponentがアタッチされます。 f:id:project-unknown:20170601012830p:plain

GraphsがNavmeshっぽい所を意味しているっぽく、とりあえず意味も分からず「Grid Graph」を選択します。 すると追加されるので、Grid Graphの中身を見てみます。

f:id:project-unknown:20170601013022p:plain 上記のWidthとDepthはAの適用範囲を指しており、1010で指定すると以下のように見えます (後述しますが、nodeのサイズを10*10で敷き詰めています)

f:id:project-unknown:20170601013153p:plain 今回のTerrainを100100に設定しているので、Aもそれに合わせておきます。

次にnodeですが、これを細かく設定するときめ細やかにA*が設定され、小道などの小回りが聞くようになりますが高負荷っぽいです。 以下は、0.1で設定した際のキャプチャ f:id:project-unknown:20170601013545p:plain 今度は2で設定した際のキャプチャ f:id:project-unknown:20170601013608p:plain

Max Climbは登ることが出来る高さを設定しているっぽく、ここを大きく設定すると、頑張って崖を登るようになりました。 f:id:project-unknown:20170601013807g:plain

後はまだ良くわかってないので割愛(;・∀・)

このタイミングで、Scanを押してみると、設定したA*がどのように貼られるのかが見ることが出来ます。 f:id:project-unknown:20170601013858p:plain

次にカプセルにNavmeshで言うところのagent設定を行います。

まず、SeekerのComponentをアタッチします。 f:id:project-unknown:20170601014022p:plain

次に、カプセルにagent設定を行います。 今回はサンプルとして、「SampleAI.cs」を作って最低限必要な処理を書きます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Seeker))]
public class SampleAI : AIPath {

    void Start () {
        base.Start();
    }
    
    void Update () {
    }
}

(ほんとうに基礎の基礎ですな…

[RequireComponent(typeof(Seeker))]

を宣言することで、HierarchyでA* agentのパラメータが設定出来るようになります。

f:id:project-unknown:20170601014337p:plain ここのTargetにゴールとなるGameObjectを設定し、Speedとかをちょいちょいといじります。

void Start() {
    base.Start();
}

上記で経路探索して、移動を開始します。

途中で経路を再計算したい際は

base.Update();

で行けるっぽい。

ここまで設定することで、以下のように簡単に経路探索が出来るようになりました。 f:id:project-unknown:20170601012440g:plain

まだまだ初歩の初歩なのでNavmeshのほうが遥かに使えそうに見えますが…もうちょい勉強を重ねます。。。


https://www.assetstore.unity3d.com/jp/#!/content/87744

A* Pathfinding Project

Unity Cloud Buildを試す for iOS

はじめに

今日はUnity Cloud Buildを試した際の話です。
Cliud buildはこの記事以外の所で散々にハマっているので、作業中お困りの事があれば、

www.project-unknown.jp

上記でも色々紹介しているので是非参考になれば

やりかた

Unity Developerにアクセスして、Projectを作成。

Do it!をClick f:id:project-unknown:20170531220232p:plain

Git(私はBitbucketを利用しました)のURLを入力 f:id:project-unknown:20170531220510p:plain

BitbucketをPrivateにしている場合(大体はそうだと思います)、Unity Cloud BuildからアクセスするためのSSHを登録する必要があります。 まず、Privateな場合、以下の画面になっていると思うので、SSH鍵をコピーします。 f:id:project-unknown:20170531220950p:plain

次に、管理しているBitbucketのリポジトリを開いて、設定をClick(最近BitbucketのUIが少し変わりましたね… f:id:project-unknown:20170531221130p:plain

Access keysをClick f:id:project-unknown:20170531221238p:plain

鍵を追加をClick f:id:project-unknown:20170531221310p:plain

Labelは管理しやすい適当な文言で、Keyのところに先程コピーしたSSH鍵を入力し鍵を追加ボタンをClickします。 f:id:project-unknown:20170531221346p:plain

ここで、Unity Cloud Buildに戻りNext. 暫くUnityのロゴが回転するのを行儀よく待ちます。

暫く待つと、以下の画面になります。 f:id:project-unknown:20170531221622p:plain

ここでは、iOSを選択します。

次に表示される画面でBuildの基本設定を入力します。

  • ラベルにBuildを識別出来る名前
  • Branch(Master以外のBranchを指定したい場合は選択)
  • Project Subfolderに、GitのRoot直下にProjectファイルやAssetsがなければ、それがあるところまでのPath
  • Unity Versionに、実行したいUnityのVersion(Always Use Latest 5.xで5系以上の最新版)

f:id:project-unknown:20170531222048p:plain

ここまで設定したらNext すると、次の画面でiOSアプリとしての設定が求められます。 f:id:project-unknown:20170531222733p:plain

一応細かく設定を見ていきます。

Bundle ID XCodeで指定するBundle Identifierですね。 ↓なやつ。 f:id:project-unknown:20170531222903p:plain

XCodeのバージョン 見たまんまなので割愛

Choose iOS Credentials 最初「お?」って思いましたが、見た感じProvisioning Profileを指していそうです。 ちょっとAndroid等の事はよくわかっていないのですが、iOSの場合実機等でBuildする場合、専用の証明書(Profile)が必要になります。 且つ、Buildの環境毎に違った種類のProvisioning Profileを用意する必要があります。 Unity Cloud Buildの場合、AdHocに該当するので、AdHoc用のProvisioning Profileを用意する必要があります(実機を接続しての証明書は使えません)

んで、今手元に丁度良いAdHocの証明書が無いので、この際に発行します。 以下のApple Developer Programにアクセスして、

アカウントから証明書を作成します。 Identifierから適当なAppIDを作成し、Provisitoning ProfileからAdHocを選択して、ContinueをClick f:id:project-unknown:20170531222615p:plain

次に、先程作成したAppIDを選択 f:id:project-unknown:20170531223544p:plain

次に紐付ける証明書を選択(Distributionで設定してください。 f:id:project-unknown:20170531223637p:plain

実機実行したいデバイスを選択してContinue f:id:project-unknown:20170531223728p:plain

これで証明書(AdHocなのでDistribusion形式)が作成出来ました f:id:project-unknown:20170531223854p:plain

後は、この証明書をダウンロードしておきます。

次にまたUnity Cloud Buildに戻り証明書を登録します。 f:id:project-unknown:20170531223959p:plain

以下のキャプチャにある通り、設定していきます。

  • 名前にKeyとして登録する名前(ラベル)
  • Mobile Prov Fileに先程作成したProvisioning Profileをuploadします。
  • p12ファイルにProvisioning Profileと紐付いているp12ファイルをuploadします(p12ファイルを紛失して酷い目にあいました。Keychainから取ってくればよかっただけだったのですが…
  • p12 passwordにp12ファイルを書き出した際に設定したPasswordを設定します

f:id:project-unknown:20170531224814p:plain

次にNextを押すと、buildが開始します。 f:id:project-unknown:20170531230512p:plain


ちなみにp12ファイルを紛失した際に、心が折れかけたキャプチャ f:id:project-unknown:20170531230611p:plain