古いバージョンのUnityスクリプトリファレンスのURL

Unity5で開発をしている最中にUnity5.1がリリースされてUnity公式のAPIリファレンスも5.1に対応されたため、過去のAPIが確認できなくなってしまいとても焦った。 いろいろ調べて旧バージョンのUnityAPIを確認する方法がわかったので忘れないように残しておく

Unityの公式ページからスクリプトリファレンスのURLは下記になっている
(要は最新のスクリプトリファレンス)
http://docs.unity3d.com/ScriptReference/index.html

過去バージョンのスクリプトリファレンスを見たい場合はこちら
http://docs.unity3d.com/(version)/Documentation/ScriptReference/index.html

(バージョン)と書いてある所をUnity5なら500にして
http://docs.unity3d.com/500/Documentation/ScriptReference/index.html
Unity4.6ならば
http://docs.unity3d.com/460/Documentation/ScriptReference/index.html

としてアクセスすれば過去バージョンのAPIが確認できるっぽい。
ただ、マイナーバージョンの単位では存在するわけでなく、APIに更新の入るミドルバージョン以上の単位で存在する様に思われる。(ざっくりしか見てないからあってるのかわからないけど)
少なくとも 460, 500, 510は存在することを確認

UnityのPropertyDrawerでReorderableListを利用する

UnityでReorderableListが使えるようになっていたのでPropertyDrawerで指定出来るようにしてみた

ReorderableList

本当なら

public class ReorderableListTest : MonoBehaviour
{
    [ReorderableList]public List<int> data_;
}

こんな形でIntReorderableListみたいなクラスを作らないでメンバー変数に直接Listを持たせてAttributeの指定をすればいい形にしたかったがやり方がわからん。
Listに直接Attributeの指定をしてもサイズが1以上ないとPropertyDrawer側の関数が呼ばれなく、呼ばれたあともListクラスが保持しているメンバー変数がserializedPropertyに投げられるためReorderableListの生成が出来なかった。

そのためLIstを持ったクラスを宣言して、メンバーに持たせることでとりえあず回避。 Inspector拡張を利用すればこんな形にしなくて済みそうだが、ReorderableListのためだけに書くとなるとちょっと面倒。

なんか良い方法ないかなーー

初めてのcmake備忘録

最近vimを利用してC++を書く関係でmakefileを調べたりしてたが、先日cmakeを利用してのプロジェクト構築がmakefile書くよりも楽で便利にとても気に入ったので忘れないように備忘録として書いておこう。

ワーキングディレクトリ(cmakeの実行結果出力先)はどこでもいいが、引数で指定するcmkaeのソースパスにはCMakeLists.txtが配置されている必要がある。

実験で記載していたglfw、glew, boostを利用したプロジェクトのCMakeLists.txtはこちら。(自分の環境がmacなのでそれ以外は考えない!!)

初めてのcmake

CMakeLists.txtの用意ができてしまえばcmakeコマンドを実行して ビルド方法によって各ファイルを出力するだけ。

project_root
.
├── CMakeLists.txt
├── build
└── src
    └── main.

プロジェクトの構成としてはこんな感じになる。

ワーキングディレクトリがproject_rootだとしてそこで

cmake ./

とすることでproject_root直下にmake用の設定ファイルが出力される。

ワーキングディレクトリがproject_root/build にいる場合

cmake ../

因みにmakeではなくてxcodeで出力したい場合

cmake -G Xcode ./

と"-G Xcode"とオプションを指定すれば良い。

一番大事なCMakeLists.txtがほぼコピペで理解が浅いが一先ず使うことはできるので一先ずここまでにして後はちょいちょい調べてわかったことから徐々に記載していこう!!

vagrant使い方まとめ

1.box取得

vagrant box add [**Box名**][**BoxのURL**]

上記のコマンドでboxを追加することができる。

DLするBoxはVagrantbox.esに記載されているのでこの中から選択して追加してやる

※追加したboxを確認する場合

vagrant box list

で確認することができる。

2.仮想マシンの作成

Boxの取得が完了したら仮想サーバーを作成してやる。 ※Vagrantoはサーバー単位でディレクトリを用意してやる必要があるので注意

サーバー用のディレクトリを作成したら移動を行い

vagrant init [**Box名**]

とすると現在いるディレクトリに"Vagrantfile"ファイルが作成される。 これが今作ったサーバーの設定ファイルとなる。

仮想サーバーの作成が完了したら

vagrant up

でサーバーが立ち上がる。

コマンド一覧

コマンド 内容
up 立ち上げ
halt 停止
status 状態
sleep スリープ
suspend スリープからの復帰
reload 再起動
destroy 削除

上記コマンドは

vagrant [コマンド]

の形で実行することができる。

vagrantで仮想サーバーを立ち上げる場合"Vagrantfile"とヒモ付されてるサーバーとなる。複数作成していた場合立ち上げたい対象を間違えないように気をつけよう!!

3.仮想マシンに接続

vagrant ssh

とすると立ち上げた仮想サーバーにvagrantユーザーでssh接続をしてのログインが行える。

4.ローカルネットワークでのアクセス

vagrantを立ち上げて色々と行った後にローカルネットワークでvagrantoにアクセスしたい場合"Vagrantfile"を編集してやる必要がある。 変更したいマシンの"Vagrantfile"を開いたら27行目のコメントアウトを解除してやれば同じ行に記載されているIPでアクセスが可能となる。

5.共有フォルダ

vagrantoは構築した時既に仮想マシン内の特定のディレクトリと"vagrantfile"があるディレクトリが最初から共有状態になっている。 共有されているディレクトリはルート直下の"/vagrant/" このディレクトリを外部公開ディレクトリに対してシンボリックリンクを貼ってやればファイル更新が楽になりそう。

試しに

vagrant ssh
cd /vagrant/
touch test.txt
exit
ls

とやればサーバーにログインして作ったファイルがホストOS側でも存在しているのが確認できる。(バージョン管理ソフト利用して落として来てもいいわけですが)

6.Provisioning

Provisioningとは"vagrant up"を行った後にシェルスクリプトなどを自動で実行してくれる。 同じサーバー設定を行いたい場合、この機能を利用してやることでより簡単に環境の構築を行える。

設定の方法はVagrantfileに "config.vm.provision :shell, :path => "provision.sh" とすることでpathで指定したシェルスクリプトの実行を行ってくれる。

vagranto upでProvisioningを実行してくれるのは初回立ち上げ時のようで2回目以降は実行してくれない様子

一度立ち上げた後にProvisioningを実行したい場合

vagrant provision

とすることで再度Provisioningの実行をしてくれる。

7.自分のBoxを作成する

必要なソフトをインストールした仮想マシンをパッケージングすることで、同じ状態のサーバーを再構築又はチーム内に共有を行うことができる。 作成した仮想マシンをパッケージングする場合

vagrant package

とすることでboxを作成することができる。 処理が終わったら現在のディレクトリにpackage.boxというファイルが出来る。 あとは工程1の時に行ったのと同じようにbox add [Box名][ファイル名**]とすることで自分で作成したBoxを新たに追加することができる。

Boxを追加した後の使い方は今までと同じ。(initで仮想マシンを作成、upで立ち上げ)

node.jsを始めました。

最近作りたいものがなくていろいろとやってたけど、"node.js"でやりたいことができたので暫くこれで記事更新ができるといいな。。。 とりあえず環境設定から

nvmインストール

"node.js"を始めようとして調べてたら"python"とか"ruby"とかでもあったように"nvm"というバージョン管理ツールを見つけたのでこいつを使ってバージョン切り替えが出来るようにしよう!!

homebrewで"nvm"は入れることが出来るようなので早速実行

brew install nvm

インストールに成功したようなので早速実行

nvm

(;゚ Д゚) …!?

(つд⊂)ゴシゴシ

(;゚ Д゚) …!?

command not found: nvm

homebrewで入れたのにコマンドがない言われる。なぜじゃ。。。 先に"node.js"をインストールしているとダメみたいな記事を見つけたりしたので uninstallを試したけど入ってないよ的なエラーで怒られた。。。 調べてもエラーの原因は見つからずにgitから直でDLして起動みたいな記事をよく見つけたのでそちらに切り替え

brew uninstall nvm # ひとまずbrewで入れたnvmを削除
git clone git://github.com/creationix/nvm.git ~/.nvm # gitリポジトリからnvmをDL
source ~/.nvm/nvm.sh

で起動する形にしたら無事成功!!(ちょっと疑問が残るがひとまずは無視して先に)

node.jsインストール

これで"nvm"コマンドが利用可能になったので今度こそ"node.js"をインストールしていく。 せっかくバージョン管理ツールを入れたので、適当にいれないでちょっとバージョンを確認指定して入れてこう

nvm ls-remote

このコマンドで現在インストール出来る"node.js"のバージョン確認ができる。 ※ちなみに、Node.jsはバージョン番号が偶数が安定バージョン、奇数は開発バージョンである なので今回は v0.10.32 を入れていこう。

nvm install 0.10.32 # node.jsをインストール
nvm use 0.10.32  # 使用するバージョンの指定

これで"node.js"のインストールが完了して使用準備ができた。

node -v

でバージョンの確認ができる。

環境構築完了!!

注意点

今回やった方法だとhomebrewを利用していないのでこのままだとターミナルで新規ジョブなどを立ち上げると、nvmの起動ができないので少し面倒。 ".zshrc"などに source ~/.nvm/nvm.sh を追加するなどして新規ジョブ立ち上げる時に自動でnvmが立ち上がるようにしてやったほうが良さそう


※2014年11月9日追記

nvmにaliasを設定する

.zshrcなどシェル設定ファイルにnvmを自動起動する設定を書いたほうが良いと書いたが、これだけだと少し足りなかった。 nvmが自動で立ち上がってもnodeのデフォルトバージョンが指定されて居ないようで新規でシェルを立ち上げてもnodeコマンドが見つからなかった。 そのためnvmのコマンドでnodeのデフォルトバージョンを指定を行う。

nvm alias default [version]

とすることでデフォルトバージョンの指定ができる。 こうしておくことで新規ジョブ立ち上げ時にnvmとnode両方の利用が可能になる。

pythonで画像編集

pythonで画像合成を行う場合pillowとうモジュールが楽だった。 ※Pillowは、Pythonの画像処理ライブラリで、Python Imaging Library (PIL)のforkプロジェクトです。 まあPILからして知らないわけですが。。。。

pip install pillow

でモジュールの追加!!

画像合成

layer1 = Image.open( 'image1.png' )
layer2 = Image.open( 'image2.png' )

layer1.paste( layer2, ( 0, 0 ), layer2 )

Image.openで画像を読み込む→Image.pasteで指定した画像を上に貼り付けることができる。 第2引数は座標を指定してやる、第3引数のmaskはいまいちわからないのでひとまず無視。

これで画像の合成事態は出来るのだがアルファ情報を持っている画像をpasteで合成する場合完全に上書きされているのがアルファが変な結果になって期待通りの合算を行ってくれなかった。

アルファ付きの画像合成

layer1 = Image.open( 'image1.png' )
layer2 = Image.open( 'image2.png' )

result = Image.alpha_composite( layer1, layer2 )

とやることで期待通りの結果になってくれた。

画像の保存

上記の方法で画像を作成しても結局保存出来なければ何も意味がないわけで画像を保存する場合

layer1 = Image.open( 'image1.png' )
layer2 = Image.open( 'image2.png' )

result = Image.alpha_composite( layer1, layer2 )
result.save( 'output.png' )

Image.save( 保存ファイル名 )とすれば保存を行える。

その他

機能的には他にもピクセル操作、リサイズ、回転などいろいろなことができるので結構便利そう コレ使えば設定ファイルと連携しての画像合成ツールとして優秀なのが作れそうで少し楽しみ

関数テーブル

if文はそこまで嫌いではないのだが、switchはとても嫌いだ。 というのもswitchを使うときは大抵その関数が大きくなるからだ!!(自分の書き方的な所もあるのだろうが) だからといってswitchをif文に変えれば嫌いじゃなくなる!! というわけでもない。 結局のところ関数の大きさによってはif文だろうがなんだろうが嫌いになるわけで。。。

こういった条件分岐により関数が大きくなる場合は各条件の内容を全て関数にして関数テーブルを利用することで1関数のサイズを小さく保ってやる。

[func03.cpp]はメンバ関数ポインタを利用しての実装

[func11.cpp]はC++11で追加されたstd::function・std::bindを利用しての実装

両方とも各関数を配列の中に格納し、インデックスで各関数を呼び出すことができる。 見てわかるように[func03.cpp]は呼び出し時に特定のインスタンスに対して関数の呼び出しを行っているのがコードを見るとわかるが、[func11.cpp]のテーブル作成時にインスタンスに対して束縛しているためただ関数を呼んでいるようにみえる。(この様に見せない記述方法もあるけど) [func11.cpp]の場合特定のクラスに対して紐付いているわけではないので、戻り値と引数さえ一致していればどんな関数でも入れることができる。