2017年4月10日月曜日

[git]cloneせずに新しいリポジトリを作成する手順

目的

ローカルにプロジェクトファイルを作成してからホスティングサービスにリポジトリを作るときの手順メモ。

ローカルにgitリポジトリを作る


まずはリポジトリの作成。
管理したいディレクトリのルートで
git init


ローカルリポジトリに.gitignoreを作成する。
https://github.com/github/gitignoreからコピーすると良し。

とりあえずコミットを作成する。
空のリポジトリの場合、空コミットを作成する。
git commit --allow-empty -m "empty commit"


リモートリポジトリの作成

ホスティングサービスで適当にリポジトリを作成する。

ローカルとリモートの関連付け

リモートリポジトリを追加する。
git remote add [リモートリポジトリ名] [リポジトリのURL]


以降リモートリポジトリ名はoriginとする。

プロキシを通す場合(global設定を使うなら必要なし)
git config --local remote.origin.proxy http://[プロキシユーザ名]:[プロキシパスワード]@[プロキシホスト]:[プロキシポート番号]


ユーザ名とメールアドレスをconfigに追加する。(global設定を使うなら必要なし)
git config --local user.name [ホスティングサービスのユーザ名]
git config --local user.email [ホスティングサービスのメールアドレス]


一回fetchする。
git fetch


masterブランチの追跡ブランチを指定する。
git branch --set-upstream-to=origin/master master


pullして衝突を解決する。
git pull


pushしてできあがり。
git push origin

2016年11月4日金曜日

[Android] アプリケーションがフォアグラウンドかどうかを判定する

対象

APIレベル24以前の全バージョン

何がしたい?

アプリ内から自分自身がフォアグラウンドかどうかを判定したい。
Activity遷移時に一瞬バックグラウンドになって欲しくない。

結論

Activity#onResumeとActivity#onPauseの回数を数えて、onResumeの方が多いとき、Activityはフォアグラウンド状態である。
Activity遷移時に一時的にフォアグラウンド状態でなくなる。

Activity#onStartとActivity#onStopの回数を数えて、onStartの方が多いとき、Activityはは表示中である。
Activity遷移時に一時的に非表示状態にならない。

用途に応じてどっちかをアプリケーションがフォアグラウンドであると定義して使用すべし。

なんで?

Android DevelopersのActivityのドキュメントを読むとこう書いてある。
The visible lifetime of an activity happens between a call to onStart() until a corresponding call to onStop(). During this time the user can see the activity on-screen, though it may not be in the foreground and interacting with the user. Between these two methods you can maintain resources that are needed to show the activity to the user. For example, you can register a BroadcastReceiver in onStart() to monitor for changes that impact your UI, and unregister it in onStop() when the user no longer sees what you are displaying. The onStart() and onStop() methods can be called multiple times, as the activity becomes visible and hidden to the user.
The foreground lifetime of an activity happens between a call to onResume() until a corresponding call to onPause(). During this time the activity is in front of all other activities and interacting with the user. An activity can frequently go between the resumed and paused states -- for example when the device goes to sleep, when an activity result is delivered, when a new intent is delivered -- so the code in these methods should be fairly lightweight.
onStartからonStopの間はvisible lifetimeで、onResumeからonPauseの間はforeground lifetimeであると。ただこれはActivityの状態のおはなしなので、アプリケーションとは直接関係ない。

Activity遷移時のonResume, onPause, onStart, onStopが呼ばれる順番を見てみと、以下の順番で呼び出されるのでonPauseとonResumeを数える方式では一時的に状態が変化する。
onStopとonStartを数える方式では一時的に状態が変化しない。

A→B遷移時

  1. A#onPause
  2. B#onStart
  3. B#onResume
  4. A#onStop

onPause, onResumeはこの順番で呼ばれるので、Android Developers的には一時的にバックグラウンドになるけど、onStop, onStartは呼ばれる順番が逆なのでAndroid Developers的には一時的に両方表示状態になる。

関連記事

まあこれぐらいのことは前例があるわけで
ただアプリケーションのフォアグラウンドとActivityのフォアグラウンドを分けて考えていない節があるので気をつけよう。

ソースコード

APIレベル14以上ではActivityLifecycleCallbacksなんてのが実装されているのでこちらを使うとActivityの基底クラスを作らなくてよくて楽な模様。
但しバックポートされてない。

以下、例はonStart,onStopを数える方式。
利用は全てのActivityをBaseActivityの派生クラスにして、HogeActivity.getInstance().isForeground()で判定する。


2016年8月8日月曜日

Unity関係のTwitter postまとめ(~2016/08/05ぐらい)

今日のUnityTipsを中心としたUnity関係のツイートまとめ

ポーズ処理のスクリプト


GetComponentsInChildrenでMonobehaviourを全部無効にするみたいな処理。ので、コルーチンは止まらない。コルーチンを一時的に止める方法があったら教えて欲しい。


一度に複数のInspectorを表示する


InspectorからInspectorへのドラッグアンドドロップができるので作業効率が上がる。ゲームオブジェクトやアセットを右クリックしたときに新しいInspectorをLock状態で表示する拡張が欲しい。気が向いたら作る。


StandaloneビルドやWebGLビルドでマウス入力を完全無視する


StandaloneInputModuleの代わりに使うスクリプト。StandaloneInputModuleからマウス関係の処理を機械的に削除しただけ。


2D用接触判定スクリプト


[Unity][2D]接地判定するスクリプトの強化版。
上下左右にBoxcastする。


Editor拡張でRichTextを使う


Editor拡張でも使えるよっていう機能紹介。


uGUIオブジェクトの透明化



CanvasGroupの機能紹介とAlphaをスライダーでいじれるようにするエディタ拡張。


軸に沿ったオブジェクトの反転


スケールに-1掛けると反転する。回転を使うよりも簡単で精度がいい。


スナップ移動、回転、拡大縮小



機能紹介。


RectToolのショートカット


Sceneビューでごりごり編集するときは作業効率が上がる。


Inspectorのデバッグモード


privateな変数の中身を参照するためによく使う。あとスクリプトからRectTransformを触るときに対応がわからなくなることがあるのでそのときも使う。


配列、リストのInspector操作


最近まで知らなくて不便を感じていた。知らないと真ん中らへんにある要素を削除するのがとても大変。


テストを書く


zunko is Kawaii が書きたかっただけ。
ゲームプログラミングではインターフェース周りの処理とロジックが密に結びついているケースが多くてあまりテストを書く習慣が無い印象。
実際私は趣味プログラミングではめんどくさくて書かない。


uGUIのアウトラインとシャドー



アウトラインは1pxまでしかまともに機能しないと思っていい。あと重い。
改善版アウトラインは探せば出てくる。


SpritePacker



機能紹介。実際効果的。SetPassのコールが目に見えて減る。
AssetBundleとの相性はあまり良くないと聞いたことがあるけど良く分からない。
Spriteを1枚だけ読み込むことができなくなるからかな?


GetComponet系メソッドで基底クラスの指定



ちゃんとクラス設計する意味はある。
型を指定するタイプのメソッドは似たようなことができるのでScriptableObjectとかもちゃんとクラス設計しよう。


オブジェクトを点滅させるスクリプト


ダメージ受けたときとかに使うやつ。
GetComponetsInChildrenでRenderer系を取ってきて点滅させる。


Shurikenのスケーリング


ScalingModeを設定してなくて上手くスケーリングできずに半日悩んだ。


UnityEvent



空クラスを実装することで引数付きイベントもInspectorで扱える。但し引数のクラスはシリアライズできる必要がある。
確か4引数ぐらいまでいけたはず。


TrailRenderer


TrailRendererの機能紹介。プロトタイプ段階ではよく使う。


Phisic Material, Phisics 2D Material




摩擦と反発の機能紹介。知らずに1から開発しようとしたことがある。
知った後でも自前で摩擦を実装したりしているけど...

2016年6月27日月曜日

[Unity][2D]接地判定するスクリプト

ローグライクの製作に疲れて息抜きにアクションゲームを作っているので、アクションゲーム用です。
キャラクターが空中に居るかどうかを判定する接地判定のメモとスクリプト。

前提

  • 接地判定用のBoxCollider2Dが存在する(キャラクターの当たり判定の流用でもOK)
  • 地形のColliderにLayerが設定されている

手順

UnityにはPhysics2D.BoxCastというメソッドが存在します。
このメソッドは特定の方向に四角いあたり判定を飛ばして、衝突を検出するメソッドです。Raycastのぶっとい版です。
(類似品にCircleCastや3D用のPhysics.BoxCast,Physics.SphereCastなどもあります)
このメソッドのdistanceパラメータで飛ばす距離を指定できるので、ごく短い距離のBoxCastを垂直下向きに飛ばして地面と接触したかを見れば接地判定できます。

但しひとつ注意点があって、Castを飛ばす元がすでに地形と接触している場合、BoxCastが反応せずにすり抜けてしまいます。
この現象はテラシュールブログさんの記事に詳しいです。
これを回避するために、BoxCastはBoxColliderの中心ではなく少し上から発射するように設定します。

スクリプト

というわけでスクリプトです。
このスクリプトをアタッチするとお手軽に接地判定ができるぞ。

2016年5月16日月曜日

[UnityEditor拡張]Inspectorの配列のラベルをenumに差し替える

Inspectorに配列やリストを表示すると要素のラベルが「Element 0」「Element 1」...になるのをenumで置き換えるエディタ拡張を作りました。
上を下に置き換える。


使い方

配列のフィールド属性にEnumLabelを付けるだけ。引数はtypeof(enumの型)。


ソースコード

配列要素のlabelの「Element 0」の数字部分をパースして対応するenumに置き換えているだけ。


問題点

sizeの入力を縛っていないので、enumの定義数と配列の要素数に関係がありません。
要素数がenumの定義より多い場合はこうなります。

PropertyDrawer.OnGUIの引数のpropertyで取れるのが配列要素のpropertyなので、配列全体のGUIを制御することができずこの実装となりました。
配列やリスト全体の表示を描き換える方法ってないんですかね?

2017/12/23追記

コメントにて指摘をいただきましたので反映いたしました。ありがとうございます!
EditorGUILayout#PropertyField()はbool値で子要素を展開するかを指定できるようです。常にtrueでいいような...
ちなみにこの記事の内容は古くて最新のUnityに対応しているかはわかりません。ちゃんと動作させた環境の情報は書こうな...

2016年5月9日月曜日

[Unity]ミニマップ(レーダー)をuGUIとして表示する

RenderTextureを使ってミニマップをuGUIとして表示するおはなし。
少し引っかかったのでメモ。
例は2Dだけど3Dにも適用できるはず。

ミニマップっていうのはコレのこと。

手順

仕組みはすごく単純です。
ミニマップ用のカメラを用意して、カメラでレンダリングされたイメージをテクスチャとして持っておき、RawImageで表示するというだけです。
  1. ミニマップ用のカメラにだけ写るオブジェクトを作る
  2. RenderTextureを用意する
  3. ミニマップ用のカメラを用意し、TargetをRenderTextureに設定する
  4. CanvasにRawImageを追加してTextureをRenderTextureに設定する

ミニマップ用のカメラにだけ写るオブジェクトを作る

ミニマップに表示したいオブジェクトの子要素として新しいGameObjectを作ります。
GameObjectに各種Rendererをアタッチしてカメラに写るようにします。
また、GameObjectのLayerにミニマップ用のレイヤーを追加して設定しておきます。
メインカメラのCullingMaskをからミニマップ用のレイヤーのチェックを外しておきます。

RenderTextureを用意する

プロジェクトビューからAssetsに新しいRenderTextureを追加します。
RenderTextureのサイズは表示したいミニマップの解像度を設定します。(今回の例では表示領域が400x300と決まっているので400x300に設定)

ミニマップ用のカメラを用意し、TargetをRenderTextureに設定する

ミニマップ用のカメラを作ります。
このカメラにはミニマップ用のレイヤーのみが写るようにCullingMaskを設定します。
TargetTextureを作成したRenderTextureに設定しておきます。このカメラでレンダリングした結果がRenderTextureに保持されるようになります。
ちなみに、カメラのアスペクト比はRenderTextureのサイズで決まるようです。

CanvasにRawImageを追加してTextureをRenderTextureに設定する

UIオブジェクトを追加し、RawImageをアタッチします。
RawImageのTextureに作成したRenderImageを設定します。

まとめ

  • ミニマップ用のカメラを用意しレンダリング結果をRenderTextureに描き出す
  • RawImageでRenderTextureを表示する

2016年5月2日月曜日

[Unity]ポリモーフィズムなScriptableObjectのJSONシリアライズに挑戦する

クラス階層構造のあるScriptableObjectをJSONシリアライズしたいというお話。
もっといい方法があるなら教えてください。切実に。

シリアライズされたオブジェクトは型情報を含まない

含みません。ということはデシリアライズするときに意図した型に復元することはできません。
Itemクラスを継承したWeaponクラスのインスタンスをシリアライズしたとして、
復元時にはそのアイテムが武器なのか消費アイテムなのか判断がつかないということです。

ゲーム中に変更の無い情報はアセットのパスをシリアライズすれば事足りる

考えた構造がこちら。
SerializableItemクラスはシリアライズ専用のクラスです。
ItemのインスタンスをResourcesに保持しておき、そのパスをアイテムに持たせておくという構造です。
これによって、ScriptableObject.Instantiate(Resources.Load(assetPath))で型情報を復元することができます。

型名をシリアライズしておいてリフレクションで復元するという方法もありますが、固定の情報(ここでいうとIronSwordのpower)のリストアが手間だったりするので、こちらのほうがスマートでしょう。

インスタンスにいちいちassetPathを設定するのが面倒と思われるかもしれませんが、エディタ拡張で自動化すれば手間にはなりません。
projectウィンドウが更新されたときにすべてのItem型アセットを更新して保存するようにします。


ゲーム中で動的に変化する情報はどうする?

例えば武器に強化値があったとします。この情報はゲーム内で動的に変化するため、アセットに持たせるわけにはいかず、シリアライズの必要があります。
これに対してはいい方法が思いついていません。一応動作する実装は可能ですが...

現状の実装はこんな感じになっています。
サブクラスに固有のフィールドをExtensionクラスのインスタンスとkeyで紐付けて保持する。
で、シリアライズするときはオーバーライドされたCreateExtensionsでExtensionのリストを作ってSerializableItemに持たせ、デシリアライズするときはオーバーライドされたRestoreExtensonsで各フィールドに値を設定しなおすってことをやってます。
typeのenumはint, float, bool, stringの4種類で事足りるはず。(足りないものはJson化してstringとして保持することが可能なはず)

まとめ

  • アセットのパスをシリアライズしとけば型を復元できるよ
  • もっといい方法があれば教えてください