あまがみ's diary

ゲーム & Webプログラミングな日常

【Unity】guidでアセットの参照を調べる

不要になったファイルを削除する時など、
どこかで使われていないか不安になったりしますよね。

プレハブやテクスチャの参照を調べる時はref検索が便利です。

tsubakit1.hateblo.jp

しかし、規模の大きいプロジェクトだと検索に時間がかかる上に、Unityが強制終了することもあります。
そういった場合にオススメしたいのがguidを使った検索です。

guidはアセットの.metaファイルに書かれている固有のIDで、
アセットの参照はこのguidで設定されています。

検索を行うには、プレハブやシーンをバイナリではなくテキストで保存するように設定する必要があります。

メニューから、Edit -> Project Settings -> Editor -> Asset SerializationのModeを「Force Text」に変更

試しに「SEButton」プレハブの参照を調べてみます。
.metaファイルを適当なテキストエディタで開きます。

f:id:ina-amagami:20161124001716p:plain:w400

guidをコピーして、OSのファイル検索機能などで調べます。
今回はFinderでAssetsフォルダの中から検索してみます。

f:id:ina-amagami:20161124003011p:plain:w500

「ToolMain」シーンで参照されているということが分かったので、
こちらも中身をテキストエディタで開いて、guidで検索してみます。

f:id:ina-amagami:20161124004341p:plain:w500

1箇所で参照されているということが分かりました。
実際にシーンを開いてみると、

f:id:ina-amagami:20161124004503j:plain

「ResourceLoader」スクリプトに設定されていることが確認できました!

更にスクリプトからResources.Load等で直接ロードされていないか調べておくと良いでしょう。

 

floatの値が0〜1の範囲内に収まっているかif文を使わずに判断する

どんなシェーダというのは書きませんが...

フラグメントシェーダ(ピクセルシェーダ)内で、
floatの値(例としてx)が0〜1ならA、それ以外ならBを返す処理が欲しかった。

通常なら、

if(x >= 0.0f && x <= 1.0f) {
     return A;
} else {
     return B;
}

これで終了なのですが、ピクセルの分だけループするので条件分岐を使うのは避ける必要があり...
小難しいことを考えるのが苦手な僕は、

迷った。

まず辿り着いたのがxを-0.5した絶対値を四捨五入する方法

int isInRange = 1 - (int)(abs(x - 0.5f) + 0.5f);

abs(x - 0.5f) のところで絶対値が0.5に満たない場合は、+0.5しても1にならないので、
int型にキャストすることで0か1に分けることができます

でもこれ、

abs関数の中でif文使ってるんじゃね?

という問題があることに気がついてしまった
組み込み関数なので中で何やってるか分かりませんが、

if(x < 0) {
     return x * -1;
} else {
     return x;
}

もし内部がこんな感じだったら意味ないじゃん。
ということで最終的に辿り着いたのがこれ。

int isInRange =
     (1 + (int)(x - 1.0f)) *
     (1 - (int)x);

というようにマイナス方向とプラス方向に分けてチェックして、
掛け合わせればなんとかなった

ちなみに以下のパターンは今回必要なかったので考慮していません
・x <= -1
・x >= 2
必要な場合はmodとか使うかabs使う方法で妥協する必要がありそうですね

あとは線形補間(lerp)で目的の値を取得するだけ!

return lerp(B, A, isInRange);

もっといい方法あったらぜひ教えて欲しいです...

(2016-10-07 追記)

x <= -1とx >= 2のケースまで対応できて分かりやすい方法教えて頂いたので紹介します!

int v = (int)((x - 0.5f) * 2);
float isInRange = (float)v / (v - ε);

εはイプシロン定数(CのFLT_MIN、Unityのfloat.Epsilonなど)限りなく小さい値
シェーダ言語にはなかったりするので、自前で用意する必要はあるかも(0.00....001fとか適当に定義するだけでOK)

上に書いたlerpで使うような値なら、厳密に0 or 1じゃなくていいのでこれで十分対応できそうです

 

さくらレンタルにgitリポジトリを作成してsshアクセス

さくらレンタルサーバのスタンダードプランの容量は100GB。
git管理するには十分だろうということで、gitのリポジトリを作ったので手順をメモしておきます。
環境はMacです。

いちいちパスワードを聞かれたら面倒なのでsshの公開鍵認証も同時に設定していきます。

1. 公開鍵を作成する

秘密鍵と公開鍵のペア(id_rsaとid_rsa.pub)を作成していない場合は作成しておきましょう。
Git - SSH 公開鍵の作成

 

2. 公開鍵をサーバに登録する

/home/[ホスト名]/.ssh/authorized_keys

というファイルにid_rsa.pubの内容をコピーすることで公開鍵認証が可能になります。

最初は無いはずなので、id_rsa.pubをauthorized_keysにリネームして配置でOKです。
お使いのFTPソフト等で転送しましょう。

複数人登録する場合は、このauthorized_keysに追記していきます。

ssh-rsa AAAA〜
ssh-rsa BBBB〜
ssh-rsa CCCC〜

 

3. sshアクセスでサーバにログインする

正しく公開鍵が登録できると、sshアクセスが可能になります。
@より前にユーザ名を指定する必要がある点に注意です。ホスト名と同じのはず。

ssh [ユーザ名]@[ホスト名].sakura.ne.jp  
Welcome to FreeBSD!

%

こんな感じの表示が出ればログイン成功です。
 

(2016-09-29追記) authorized_keysのパーミッションを設定する

設定していないとログインの際にパスワードを聞かれます。
聞かれたら、サーバのパスワードを入力すればログイン出来ます。

パーミッションは読み書き可の600を設定します。

chmod 600 /home/[ホスト名]/.ssh/authorized_keys

 

省略形でsshアクセス

長いドメインを入力するのが面倒という場合は省略形を設定することも出来ます。
ローカルの ~/.ssh/config というファイルを編集します。無い場合は作成しましょう。

Host [省略形]
  HostName [ホスト名].sakura.ne.jp
  User [ユーザ名]
ssh [省略形]

 

4. gitのリモートリポジトリを作成する

/home/[ホスト名]/git/

例としてmyappというアプリのリポジトリを上記のディレクトリに作成します。

cd /home/[ホスト名]/git
mkdir myapp.git
cd myapp.git
git init —bare

リモートリポジトリを初期化する際は--bareを付ける点に注意しましょう。
ディレクトリ名の最後に.gitを付けているのは慣例なので、こちらは任意です。

 

5. リポジトリのpushを行う

ローカルリポジトリのmasterブランチをpushする例です。
既に作成してあるものでも構いませんし、なければ新しく作成しましょう。
pushする際にはcommitが必要です。

ターミナルコマンドの場合とSourceTreeを使用する場合を解説します。

[ユーザ名]@[ホスト名].sakura.ne.jp のところは、手順3で解説した省略形が使えます。

ターミナルの場合
cd [リポジトリのあるディレクトリ]
git remote add origin ssh://[ユーザ名]@[ホスト名].sakura.ne.jp/home/[ホスト名]/git/myapp.git
git push origin master:master
SourceTreeの場合

リポジトリを開き、バージョンにより異なると思いますが
メニューからリポジトリ設定(Repository) > リモート(Remotes)に以下のように設定します。

f:id:ina-amagami:20160928233851p:plain

設定が終わったらOKを押してウィンドウを閉じ、
Pushを押してmasterブランチにチェックを入れてOKを押すとリモートへpushされます。

 

Ex. リポジトリのcloneをする

他のPCで作業する場合や複数人で開発する場合はcloneが必要になると思います。
手順2で解説したように、正しく公開鍵が登録できていればターミナルから以下のようにcloneできます。

git clone ssh://[ユーザ名]@[ホスト名].sakura.ne.jp/home/[ホスト名]/git/myapp.git

cloneしてきた場合はリモートは登録済みなので特に設定は不要です。 以上!