太郎Work

Unityとかで困ったこと等を残しておきます

UnityEditorのObjectFieldでフォルダのみ入れる

もっと簡単な方法あれば教えて下さい><

Object folder;
var newFolder = EditorGUILayout.ObjectField (folder, typeof(Object), false);
var path = AssetDatabase.GetAssetPath (newFolder);
if (AssetDatabase.IsValidFolder (path)) {
	folder = newFolder;
} else {
	folder = null;
}

どこかにありそうですが、パッと見つからず、試しにそれっぽく使ってみたら上手く行ったのでメモとして残しました。

AssetBundleメモ

Unity5.1.0での話

  • AssetBundle.CreateFromFileはエラーになって動かない
  • ビルド時は出力フォルダの.manifestファイルを参照しているためファイルをリネームすると再ビルドが走る
  • AssetBundle本体のファイルが存在しているかどうかのチェックはされていないのでリネームしても可
  • AppendHashフラグを持たせるとファイル名の後にハッシュ値が付与されたファイル名になる。

MementoBeta使ってみた

Mementoというサービスを使用して適当なフィギュアから簡易的に3Dモデル化してみました。
f:id:tarowork:20150326012101p:plain

WebPlayer版
Unity Web Player | Figure

Memento

少し前ですがMementoというサービスがベータ版で公開されたので少し試してみました。
Autodesk Memento


簡単に言うと複数の角度から写真を撮影し、アップロードするといい感じに3D化してくれるサービスです。www.youtube.com
(PVかっこいい)


と、いってもいい被写体がなかったので近くにあったフィギュアで試してみました。

続きを読む

Vector3.magnitudeの負荷について

きっかけ

とある実装でC#処理負荷が非常に高く困っていたのですが、C#の実行速度が遅いからと考えていました。

ふと、magnitudeの平方根計算が非常に高負荷になっているのではないかと思い、検証してみました。

A,B2点間の距離を出す式は以下のようになり、公式リファレンスにも負荷があるよと記述があります

{ \displaystyle
V = V_A - V_B\\
length = \sqrt{Dot(V,V)}
}
HatenaってTex記述もできるんだねすごぃ
Unity - Scripting API: Vector3.sqrMagnitude

続きを読む

SetReplacementShaderの使い方

公式の説明が全く意味不明だったのでメモ

Unity - Manual: Rendering with Replaced Shaders


カメラに映る全体を単一シェーダで描画したい場合は呼び出すだけ。

camera.SetReplacementShader (shader, null);


問題は特定のシェーダの場合のみ描画したい場合。

第2引数にカスタムタグの「キー」を指定すると、差し替えるシェーダに指定されているタグと対象にセットされているシェーダに指定されているカスタムタグの「」が一致していた場合描画される。
ここを理解するのに時間がかかりました…

shadowcamera.cs

camera.SetReplacementShader (shadow, "Shadow");


shadow.shader

Tags {
    "RenderType"="Opaque"
    "Queue"="Geometry"
    "Shadow"="Character"
}


character.shader

Tags {
    "RenderType"="Opaque"
    "Queue"="Geometry"
    "Shadow"="Character"
}

このようにするとUnity側がShadowタグを確認しここではCharacterが共通なため描画される仕組み。
他のシェーダにはそもそもShadowタグが存在しないので無視されます。

これでキャラクターのみの自前シャドウマップが作成出来ました。
めでたしめでたし

UnityのArialフォントがAndroid実機上で表示されない場合がある

問題

Unity上のシステムフォントテキスト設定でデフォルトのArialのままAndroidビルドを行った場合、
確認できただけですが、LG-02E, GalaxyS5で日本語フォントが表示されない問題があります。

理由

どうやら挙動的にはDroid Sansというフォントがロードされているようで上記の端末には英語と韓国語しか入っていませんでした。
そのため日本語が表示されないという問題です。日本で発売している端末なのにひどすぎる…

解決

どちらにしろDroid Sansはフォントが汚いのでこちら側で指定しました。

Unityに適当な日本語に対応したttfをインポートし、以下のように設定すると問題なく表示されます

・Incl. FontDataをfalse
・Font NamesをMotoyaLMaru, MotoyaLCedar, RobotoSansFallback, Droid Sans Fallbackと指定
f:id:tarowork:20141121171323p:plain

これで日本語が表示されます。ここで使用したttfファイルはビルドに含まれないことも確認しました。

しかし、今度はGalaxyS5だとモトヤフォントに韓国語と中国語が入っていないという問題が発生しましたがそれに対しては対応できていません。
(L-02Eの方はちゃんと入っていました)

海外の端末ではMotoyaではなくRobotoが呼ばれ、昔の端末ではDroidSansが呼ばれるはずなのでひと通り網羅できるのではないかなと思います。

Unityの端末向き設定

随分前に調べて忘れないようメモ

UnityiOS,Androidで横向きのアプリを作成する際、PlayerSettingsから回転設定を指定しますが、
一方向固定又は自動回転しか設定ができません。

f:id:tarowork:20141001134524p:plain

Landscape Right Left
的なものが欲しいのですが複数選択できません。

その場合最初のシーンに配置されているスクリプトのStartに以下のコードを書くと実現できます。

Screen.autorotateToLandscapeLeft = true;
Screen.autorotateToLandscapeRight = true;
Screen.autorotateToPortrait = false;
Screen.autorotateToPortraitUpsideDown = false;
Screen.orientation = ScreenOrientation.AutoRotation;

これで横持ちをしても自動で回転してくれるようになります。
Unity側の設定はLandscape Right, Landscape Leftどちらでも問題ありません。起動後に自動回転します。