Unityをターミナルから起動してみたい!
かずまです。
今回はUnityをMacのターミナルから起動してみます!
一応その方法は公式には書いてありますね。
/Applications/Unity/Unity.app/Contents/MacOS/Unity
これで起動できるのか。なるほど。
ってかGUIでいいだろ
いやいや、GUIだと自動でgitの設定できないじゃん!
しかも毎回gitignoreを作るのだるいし!
毎回打つの面倒だし、オプションも覚えられないので、自分なりにこうだったらいいな〜
ってのを作って見ました。
目標
作る時
# unity new <project_name>
- プロジェクトの生成
- .git & .gitignoreの生成
/usr/local/bin以下にはコマンドを作らない
このQiitaの記事のコメントに
おーシンボリックリンクで作ればいいんじゃんってことが書かれてました。
納得!
なので、その方向でいきますね。
なんだかんだ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を起動して、一度止めないといけないので面倒だ〜。
で、途方に暮れてさーっとブラウジングしてると。。。
お、なんかこれで新規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を出したりしてるので実用的に使えるはずです。
将来的なところとまとめ
ここのgitignoreはできてるので、それ以外のUnity上で設定しなければいけない部分を自動でできるとめっちゃいいのだが。。。
まぁ今回は自分がとりあえずやりたい!ってのをやったのでコードは汚いのでお許しください。
新型Mac book proを購入した件
かずまです。
昨日、Mac book pro (Touch barあり)を受け取りにわざわざ大阪まで行ってきました!
相変わらず心斎橋店のApple Storeは人気なようで、人が大量、買うのも大変な感じでした。
使ってみて
今回購入したのはMac book pro 13inch SSD 256GB メモリ 8GB
まぁまぁのスペックです。
このPCではUnityは基本的にやらないし、別にいいかなって感じです。
キーボードはJIS、とりあえず早く手に入れたかった!!笑
Mac book proの一つ前の世代は触っていましたが、それよりも半分ぐらい軽いですね。
キーボードも出っ張りがなくなってフラットな感じ。
打つのも軽いです。ほんとずっと打っていたいですね。
Touch bar
これも便利だし、楽。
アプリをインストールするときにパスワードが必要なくてTouch barに指紋認証が付いているのでそれで早くなりました。
もちろんTerminalのSudo時にはつかえません。
ざっとこんな感じです。
買ったまとめとして、買ってよかった。めっちゃ捗りそう。っていう感じですね。
HTC Vive の開発まとめ Pert 2.
かずまです。
HTC Viveでの開発方法がめっちゃ簡単になっているので最低限メモっておきます。
ちなみに作ったものはTwitterに乗ってます。
ようやくキャッチボール実現。#Unity pic.twitter.com/YpYd546aEZ
— かずま (@kazumalab) 2016年11月13日
これとかサクッとできちゃいます。
あとはお絵かきとかもろもろ。
前回はものをつかむコードだけをのっけたのですが使い方がいまいち載ってなくて、自分でも見返したときに死んだのでもう一度書き直そうかと思います。
ちなみにこちらは前回。
結構僕の中ではだめな記事。笑
参考になりません。
準備
これをまずプロジェクト内に入れます。
シーンを新しく作り、PlaneをVector3.zeroの位置で作成します。
そのあとさっき入れたPluginのPrefab内にある、
- [CameraRig]
- [Status]
- [SteamVR]
をシーンに入れておきます。位置はそれぞれVector3.zeroです。
これであとはVIVEをPCにつないでおけば再生するたびにSteamVRを起動してくれて、VR空間内に入ることができます。
めっちゃ便利ですね。
ちょっとした小技
標準ではSteamControllerが表示されています。
それを変更する場合は
まず、先ほど入れたCameraRig内のControllerの子になっているModelを選択します。
その後InspectorからSteamVR_RenderModelのEnableをOffにします。
これで再生時に表示されなくなりました。
あとはModelと同じ階層に自分が手やControllerとして表示したいものを置くだけです。(positionはVector3.zero)
あとは開発!
今回はSteamVRのメニューと同じような仕様のControllerからRayCastを飛ばして当たったところに合わせて線を短くするという方法をメモっておきます。
めっちゃ簡単なのですが忘れるのも早いので。
RayCastとは
わからないものはreferenceを見る!
docs.unity3d.com
まぁいうとオブジェトから目に見えないビームを飛ばして、当たったら反応する、みたいな感じです。
目に見えないのが今回の胆!
さて見えないのをどう可視化するかというと
みなさんご存じLineRendererを使います。
Unity5.5で少し改良が入ったみたい。
APIも少し変わりました。
SetVerticsCountがなくなってnumPositionsを使うようになったとか、あとは頂点数もいじれますね。
今回目指すもの
RayCastのヒットしたタグが'Point'というものであればその位置にポインターを合わせる、という方法です。
まずは先ほど作ったシーンのController、今回はRightControllerにLineRendererのコンポーネントを付けます。
設定するところはここ。
- Material
- Positions
- Width
この3つです。
Material
今回はMaterialを静的につけます。
まずは
Project -> Materialで作成、その後Materialの中身をこう設定します。
この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のほしいものリストを公開しました!
就活も終わったり、卒業論文との格闘始まったり、するので物産を恵んでいただけるとめっちゃ嬉しいです!
本もほしい!特にEffective C#!
さてさて、本題へ。
UnityでCallback
これは前回の記事を見ていただくといいかと思います。
blog.kazumalab.com
ラムダ式を使う場合などは
kan-kikuchi.hatenablog.com
こことか参考になります。
基本的に何かの処理が終わったあとに実行したいメソッドを渡しておくと実行される!みたいな便利なものです。
SendMesageよりもこっちがいいかな、って個人的には思ってます。
今回、コードを書いててふと思ったことをメモ、検証しておきます。
検証コード
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が呼ばれるか?
呼ばれてました!
どっちが呼ばれるの?
サブクラスでオーバーライドしたものが呼ばれてます。
また疑問
- スーパークラスにも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でどっちから呼ばれたかを確認します。
結果
Subクラスから呼ばれた!
ってことは間違えてスーパークラスのAwakeにセットするコード書いてて、
サブクラスでは全く違うコード書いてたらdelegateには何も登録されてないことになっちゃう?
試しにサブクラスのSetCallbackをコメントアウトしてみます。
!!!
ちゃんとNullが返ってくる!
忘れちゃってAwakeに違う処理書いちゃうのはバグの元ですね。
FirebaseforUnityが更新された件(開発詳細無しVer.)
先日5日前ぐらいにFirebaseforUnityがリリースされました。
それを今回は導入してみたいと思います。
以前の記事でFirebase DatabaseとUnityの連携を行いました。
blog.kazumalab.com
ようやくでしたね。
コレですべて使えそうです。
Importしてみる
https://firebase.google.com/docs/unity/setup
このサイトにかかれています。
SDKをダウンロードしてZipを開くと
こんなかんじ。
用途によって分けられているのでいいですね!
window -> Firebase
ここからいろいろ仕様を見れるみたいですね。