kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

Unityをターミナルから起動してみたい!

かずまです。

今回はUnityをMacのターミナルから起動してみます!
一応その方法は公式には書いてありますね。

docs.unity3d.com

/Applications/Unity/Unity.app/Contents/MacOS/Unity

これで起動できるのか。なるほど。

ってかGUIでいいだろ

いやいや、GUIだと自動でgitの設定できないじゃん!
しかも毎回gitignoreを作るのだるいし!

毎回打つの面倒だし、オプションも覚えられないので、自分なりにこうだったらいいな〜
ってのを作って見ました。

目標

作る時

# unity new <project_name>
  1. プロジェクトの生成
  2. .git & .gitignoreの生成

開く時

# unity open <project_name>
  1. .gitがない場合は.gitignoreも含めて生成してくれる
  2. ディレクトリに直接コマンドで移動して作るので二度手間にならない

/usr/local/bin以下にはコマンドを作らない

このQiitaの記事のコメントに

qiita.com

おーシンボリックリンクで作ればいいんじゃんってことが書かれてました。
納得!

なので、その方向でいきますね。
なんだかんだshellScript書くのは初めて。

とりあえず起動してみる

# cd ~/.local/
# vim unity

/Applications/Unity/Unity.app/Contents/MacOS/Unity

これであとは権限を変更してシンボリックリンクを/usr/local/bin/へ張る。

# sudo chmod a+x unity
# sudo ln -si ~/.local/unity /usr/local/bin

とりあえずこれで

# unity

って打てばとりあえず起動できる!

新規プロジェクトを立ち上げたい

これできればめっちゃいいと思うんですよね。
UnityをMacでやるようになってからずっと思ってました。

ということで、以下のようなコードを書いて見る・・・。

if [ -n "$1" ]
then
  if [ "$1" = "new" -a -n "$2" ]
  then
    /Applications/Unity/Unity.app/Contents/MacOS/Unity -createProject ~/Documents/"$2"
    cd ~/Documents/"$2"
    git init
    curl https://raw.githubusercontent.com/github/gitignore/master/Unity.gitignore >> .gitignore
elif [ "$1" = "open" -a -n "$2" ]
  then
    /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath ~/Documents/"$2"
  else
    /Applications/Unity/Unity.app/Contents/MacOS/Unity
  fi
else
 /Applications/Unity/Unity.app/Contents/MacOS/Unity
fi

$1 = 第一引数 では new または open を指定

$2 = 第二引数 では プロジェクト名を指定

gitignoreはここのrowファイルをcurlでファイルを生成しています。
github.com

もちろん新規プロジェクトはクリエイトされるし、成功する。
だけどUnityも開いてgitの設定もしてくれるだろうということで書いてみたけど、Unityのプロセスが走りっぱなしでUnityを終了するまで実行されなかった。

うーん、これだとUnityを起動して、一度止めないといけないので面倒だ〜。
で、途方に暮れてさーっとブラウジングしてると。。。

stackoverflow.com

お、なんかこれで新規Windowのターミナル立ち上げてそこから起動すればいいっぽいな〜って感じでこう書いて見た。

if [ -n "$1" ]
then
  if [ "$1" = "new" -a -n "$2" ]
  then
    osascript -e 'tell application "Terminal" to do script "/Applications/Unity/Unity.app/Contents/MacOS/Unity -createProject ~/Documents/\"$2\""'
    cd ~/Documents/"$2"
    git init
    curl https://raw.githubusercontent.com/github/gitignore/master/Unity.gitignore >> .gitignore
elif [ "$1" = "open" -a -n "$2" ]
  then
    /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath ~/Documents/"$2"
  else
    /Applications/Unity/Unity.app/Contents/MacOS/Unity
  fi
else
 /Applications/Unity/Unity.app/Contents/MacOS/Unity
fi

一応これでいけたっぽい?
いや、だめ、引数2つめをto do scriptで渡してるけどうまく渡せてないらしい。
これだとプロジェクト名が$2になってしまう。なので振りだしに。。。

もし、to do scriptでvalueを渡す方法があればどうか、教えてください。(切実)

さらにこれだとDocuments直下にしか作れないのでそれは便利とは言えないので、移動した直下にプロジェクトをつくる仕様に変更します。

移動した先でプロジェクトを作成する

if [ -n "$1" ]
then
  if [ "$1" = "new" -a -n "$2" -a ! -e ./"$2" ] 
  then
    mkdir $2
    cd $2
    git init
    curl https://raw.githubusercontent.com/github/gitignore/master/Unity.gitignore >> .gitignore
    cd ..
    /Applications/Unity/Unity.app/Contents/MacOS/Unity -createProject ./$2
  elif [ "$1" = "new" -a -n "$2" -a -e ./"$2" ]
  then
    echo "$2" project exist, so use option "\"open <project name>\"" 
  elif [ "$1" = "open" -a -n "$2" ]
  then
    if [ ! -e ./"$2"/.git ]
    then
     cd ./"$2"
     git init
    curl https://raw.githubusercontent.com/github/gitignore/master/Unity.gitignore >> .gitignore
    fi
    /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath ./"$2"
  else
    /Applications/Unity/Unity.app/Contents/MacOS/Unity
  fi
else
 /Applications/Unity/Unity.app/Contents/MacOS/Unity
fi

一度ディレクトリを作って、gitの設定を先にしておいてその中にプロジェクトを作るという形。
すっごく頭悪そう。笑

でも今の所動いているのでこれで一旦終了ですね。
毎回gitignoreを書くの面倒だし、ここまでプロジェクト作ってやってくれるのは結構楽でした。

一応、既存のプロジェクトがある場合はError Logを出したりしてるので実用的に使えるはずです。

将来的なところとまとめ

qiita.com

ここのgitignoreはできてるので、それ以外のUnity上で設定しなければいけない部分を自動でできるとめっちゃいいのだが。。。

まぁ今回は自分がとりあえずやりたい!ってのをやったのでコードは汚いのでお許しください。

新型Mac book proを購入した件

かずまです。

昨日、Mac book pro (Touch barあり)を受け取りにわざわざ大阪まで行ってきました!
相変わらず心斎橋店のApple Storeは人気なようで、人が大量、買うのも大変な感じでした。

外観

f:id:kazumalab:20161212140031j:plain

いい感じの箱。
これが人生初購入Mac book pro。

f:id:kazumalab:20161212140121j:plain

噂のTouch Bar。
あんまりいい感じに言われてなかったけどめっちゃ革新的!

使ってみて

今回購入したのはMac book pro 13inch SSD 256GB メモリ 8GB
まぁまぁのスペックです。

このPCではUnityは基本的にやらないし、別にいいかなって感じです。
キーボードはJIS、とりあえず早く手に入れたかった!!笑

Mac book proの一つ前の世代は触っていましたが、それよりも半分ぐらい軽いですね。
キーボードも出っ張りがなくなってフラットな感じ。
打つのも軽いです。ほんとずっと打っていたいですね。

Touch bar

これも便利だし、楽。
アプリをインストールするときにパスワードが必要なくてTouch barに指紋認証が付いているのでそれで早くなりました。

もちろんTerminalのSudo時にはつかえません。

ざっとこんな感じです。
買ったまとめとして、買ってよかった。めっちゃ捗りそう。っていう感じですね。

おまけ

大阪の御堂筋線のイルミネーション綺麗でした。

f:id:kazumalab:20161212140857j:plain

Theta Sで撮ってみた!暗いところだからちょっとダメっぽい。。。
サイトの影響?

sinariovr.com

HTC Vive の開発まとめ Pert 2.

かずまです。

HTC Viveでの開発方法がめっちゃ簡単になっているので最低限メモっておきます。

ちなみに作ったものはTwitterに乗ってます。

これとかサクッとできちゃいます。
あとはお絵かきとかもろもろ。


前回はものをつかむコードだけをのっけたのですが使い方がいまいち載ってなくて、自分でも見返したときに死んだのでもう一度書き直そうかと思います。

ちなみにこちらは前回。


blog.kazumalab.com

結構僕の中ではだめな記事。笑
参考になりません。

準備

Asset Store

これをまずプロジェクト内に入れます。

シーンを新しく作り、PlaneをVector3.zeroの位置で作成します。
そのあとさっき入れたPluginのPrefab内にある、

  • [CameraRig]
  • [Status]
  • [SteamVR]

をシーンに入れておきます。位置はそれぞれVector3.zeroです。

これであとはVIVEをPCにつないでおけば再生するたびにSteamVRを起動してくれて、VR空間内に入ることができます。
めっちゃ便利ですね。

ちょっとした小技

標準ではSteamControllerが表示されています。
それを変更する場合は

f:id:kazumalab:20161202021402p:plain
まず、先ほど入れたCameraRig内のControllerの子になっているModelを選択します。

f:id:kazumalab:20161202021452p:plain
その後InspectorからSteamVR_RenderModelのEnableをOffにします。
これで再生時に表示されなくなりました。

あとはModelと同じ階層に自分が手やControllerとして表示したいものを置くだけです。(positionはVector3.zero)

あとは開発!

今回はSteamVRのメニューと同じような仕様のControllerからRayCastを飛ばして当たったところに合わせて線を短くするという方法をメモっておきます。

めっちゃ簡単なのですが忘れるのも早いので。

RayCastとは

わからないものはreferenceを見る!
docs.unity3d.com

まぁいうとオブジェトから目に見えないビームを飛ばして、当たったら反応する、みたいな感じです。
目に見えないのが今回の胆!

さて見えないのをどう可視化するかというと

みなさんご存じLineRendererを使います。

Unity5.5で少し改良が入ったみたい。

blogs.unity3d.com

APIも少し変わりました。
SetVerticsCountがなくなってnumPositionsを使うようになったとか、あとは頂点数もいじれますね。

今回目指すもの

RayCastのヒットしたタグが'Point'というものであればその位置にポインターを合わせる、という方法です。

f:id:kazumalab:20161202023546g:plain

まずは先ほど作ったシーンのController、今回はRightControllerにLineRendererのコンポーネントを付けます。
f:id:kazumalab:20161202024013p:plain

設定するところはここ。

  • Material
  • Positions
  • Width

この3つです。

Material

今回はMaterialを静的につけます。
まずは
Project -> Materialで作成、その後Materialの中身をこう設定します。
f:id:kazumalab:20161202024345p:plain

このMaterialをLineRendererのMaterialにD&Dしてくっつけます。

Positions

これはデフォルトでSize2になってるとおもうので0に変更してください。

Width

デフォルト値は1ですが太すぎるので0.01ぐらい?に設定する。

ここまでできたら次はコードです。

こんな感じで書いていきます。
あとは処理させたいことを書いていくだけ!

注意

Start()二行目のnumPotisionsはいくつLineを書くためのPositionをいれるか?という設定なのでここでは始点と終点の2つなので2と設定しています。設定しないと"LineRenderer.SetPosition index out of bounds!"とエラーが出るのでご注意を。

Point

当たってないときはEnableをFalseにして消すこと。

RayCastではoutの引数を取ってその中にHitした情報が渡されるのでhit.pointと書いているのは当たったところのWorld座標を取ってこれるのでそれをLineRendererの終点にしている、というわけです。

今回は以上です。

簡単でしたが終わります。
不明点、間違いはコメントいただけると嬉しいです。

UnityでCallbackを行う Part2

かずまです。


久しぶりに更新します。
ちなみに11月ですね!

なんと11/28は僕の誕生日です!
よっ!!ぱちぱち〜。


なので、Amazonのほしいものリストを公開しました!

amzn.asia

就活も終わったり、卒業論文との格闘始まったり、するので物産を恵んでいただけるとめっちゃ嬉しいです!
本もほしい!特にEffective C#!

さてさて、本題へ。

UnityでCallback

これは前回の記事を見ていただくといいかと思います。
blog.kazumalab.com

ラムダ式を使う場合などは
kan-kikuchi.hatenablog.com
こことか参考になります。

基本的に何かの処理が終わったあとに実行したいメソッドを渡しておくと実行される!みたいな便利なものです。
SendMesageよりもこっちがいいかな、って個人的には思ってます。


今回、コードを書いててふと思ったことをメモ、検証しておきます。

流れ

  1. スーパークラスでメソッドFunc()をvirtualで定義
  2. サブクラスでオーバーライド
  3. スーパークラスのAwake()でCallbackにFunc()をセット

疑問

スーパークラスのAwakeはそもそも呼ばれる?

呼ばれた場合privateだからスーパークラスのFunc()が呼ばれる?

検証コード

スーパークラス

namespace CallbackTest {
	public class SuperManager : MonoBehaviour {

		public TestController TController;

		void Awake () {
			TController.SetCallback (Func);
		}

		public virtual void Func () {
			print ("From Super Class");
		}
	}
}

サブクラス

namespace CallbackTest {
	public class SubManager : SuperManager {
		public override void Func ()
		{
			print ("From Sub Class");
		}
	}
}

呼び出すコントローラー

public class TestController : MonoBehaviour {

	public delegate void Callback();
	private Callback callback;

	private void Update () {
		if (Input.GetMouseButton(0)) {
			this.callback();
		}
	}

	public void SetCallback (Callback c) {
		this.callback = c;
	}
}

気持ち

やっぱりCallbackを使うとオブジェクト同士が分離して書くことができるのでいいですね。

結果

Awakeが呼ばれるか?

呼ばれてました!

どっちが呼ばれるの?

f:id:kazumalab:20161123114008p:plain

サブクラスでオーバーライドしたものが呼ばれてます。

また疑問

  • スーパークラスにもAwake書いて、サブクラスにもAwake書いたらどっちも呼ばれる?

検証コード

// Super Class Awake Method.
void Awake () {
	print ("Awake From Super Class");
	TController.SetCallback (Func);
}
// Sub Class Awake Method.
void Awake () {
	print ("Awake From Sub Class");
	TController.SetCallback (Func);
}

中身は同じですが、printでどっちから呼ばれたかを確認します。

結果

f:id:kazumalab:20161123115029p:plain
Subクラスから呼ばれた!

ってことは間違えてスーパークラスのAwakeにセットするコード書いてて、
サブクラスでは全く違うコード書いてたらdelegateには何も登録されてないことになっちゃう?

試しにサブクラスのSetCallbackをコメントアウトしてみます。

!!!

f:id:kazumalab:20161123115427p:plain

ちゃんとNullが返ってくる!
忘れちゃってAwakeに違う処理書いちゃうのはバグの元ですね。

まとめ

どうせ、同じCallback先だし、関数もオーバーライドした側が呼ばれるならスーパークラスに書いちゃった方が手間省ける!って思って今回書いてみました。

結果はスーパークラスではAwakeは使わず、サブクラスで毎回セットする方がいい。

どっちも呼びたい!みたいなときは

answers.unity3d.com

こことかをみるといいですね!

FirebaseforUnityが更新された件(開発詳細無しVer.)

先日5日前ぐらいにFirebaseforUnityがリリースされました。
それを今回は導入してみたいと思います。

以前の記事でFirebase DatabaseとUnityの連携を行いました。
blog.kazumalab.com

ようやくでしたね。
コレですべて使えそうです。

Importしてみる

https://firebase.google.com/docs/unity/setup

このサイトにかかれています。
SDKをダウンロードしてZipを開くと

f:id:kazumalab:20161113043050p:plain

こんなかんじ。
用途によって分けられているのでいいですね!

window -> Firebase
f:id:kazumalab:20161113043408p:plain

ここからいろいろ仕様を見れるみたいですね。
f:id:kazumalab:20161113050109p:plain

用途別にSampleプロジェクトがある

github.com

これいいですね。ちゃんとSampleも用意されてる。

今回はここまでですが、
時間のある時に使って見ようと思います。