Unityでアニメーションのやり方
Unityで人間とかの有機的な3Dデータのアニメーションのやり方。
3DデータはBlenderでボーンを入れてモーションをつけ、FBX形式で書き出しています。Blenderからはモデル、ポーズ、ボーン(Armature)のデータを選択してから書き出しする必要があります。
FBX形式のデータが正常に書き出せたら、FBXのビューワー等で確認してみます。
Autodeskから「FBX Converter」というソフトが出ていますので(なんとWin・OSX対応)、このソフトのモデルビューワータブからモデルを読込んで確認してみます。
このソフト、ライセンスに関してどこにも明示されていないので使ってますが、もしフリーソフトでなかったらすいません。
モデルをUnityにドラッグで読込んで、「Project」の方でモデルを選択して「FBXImporter」のアニメーションの項目を設定します。すると「Project」のモデルの階層にもアニメーションの名前が追加されます。

後はScriptを設定してやればアニメーションされます。
//モデルにscriptを追加する場合
animation.Play("アニメーションの名前");
//外部スクリプトから動かす場合
モデル.animation.Play("アニメーションの名前");
オプション的な
アニメーションのスピードをscript側から変えることができます。
animation["アニメーションの名前"].speed =2.0;
アニメーションをブレンドして、アニメーションごとのつなぎを滑らかにします。
animation.CrossFade("アニメーションの名前");
アニメーションをブレンドして、アニメーションごとのつなぎを滑らかにします。
アニメーションをループさせます。(2011.12.12修正)
animation["アニメーションの名前"]. wrapMode = WrapMode.Loop;
このサイトが非常に参考になったというか、後半はままだったりしますが。
UnityでAndroid向けにビルドしてもアプリアイコンが変わらない件
UnityでAndroid用にBuildする際に「player Setting」の項目でオリジナルアイコンを設定したのに端末にアプリを送るとデフォルトのUnityアイコンになっていてナゼに?って件についての対処方法。(そもそもアイコンが正常に設定されないのはバグ)
対処方法といってもこれがまかり通ってしまうとUnityのライセンス的にどうなのっていう部分もあります。起動時のスプラッシュスクリーンも変更できそうな感じですし。でもそもそもバグのせいでやらざるをえないワケで、まぁいいんじゃないでしょうか。
環境:osx 10.5、Unity 3.3、Android 2.2(Galaxy Tab)
対処方法その1:デフォルトの画像データを変えてしまう
理屈は簡単。Androidアプリのアイコン用にデフォルトで設定されている画像ファイルを見つけ出して上書きしてやります。ということはもちろんアプリを変えてビルドしたい場合はその都度変えるという・・・。
アプリケーションフォルダのUnity.appを右クリックで「パッケージの内容を表示」して、後は以下のフォルダに画像データがあります。
![]()
この画像を変えて、念のためUnityを再起動してビルドしてやります。もちろんデフォルトの画像のバックアップは忘れずに。
対処方法その2:apkファイルをいじる
→No Custom Launch Icon in Unity Android?
上記の内容を超翻訳してみました。
1.Buildして生成したapkファイルの拡張子を.zipにする。
2.zipファイルを解凍する。
3.解凍したフォルダ内のres/drawable/フォルダ内の「app_icon.png」を見つける。
4.格納されているpng画像の大きさは64×64ピクセルなので、それと同じ画像サイズのpng画像を作る。
5.ファイル名をapp_icon.pngにして元の場所に上書き。
6.zip圧縮して拡張子を.apkにしてAndroidにインストール。
しかしこのapkファイルをいじるやり方は残念ながら私の環境ではできませんでした・・・。Android側でapkファイルを認識してくれません。ていうか上記の英語サイトで解決した!って言ってるかどうかも超翻訳なため確かではないです。
このバグはUnity側も認識しているようで、3.4で修正するから待っててね!ってことみたいです(自分の超翻訳では)。
Unityでマウスドラッグしてオブジェクトを回転させるの改良版
以前のエントリーで「Unityでマウスドラッグしてオブジェクトを回転させる」を公開していたんですけど、マウスをドラッグしている時に常に動いてしまっていたし動きもなんかおかしかったので改良版を作りました。
前のscriptはRotateだったのをeulerAnglesに変更して、マウスのボタンを離した時(GetMouseButtonUp)にオブジェクトのeulerAnglesを変数に代入しています。(これだけでも自分には大変)
var rotatetarget:Transform;
var xspeed:float = 1;
var yspeed:float = 1;
private var sx:float;
private var sy:float;
private var dx:float;
private var dy:float;
private var tx:float;
private var ty:float;
private var RotateVectorX:float;
private var RotateVectorY:float;
private var CashRotateVectorX:float;
private var CashRotateVectorY:float;
function Update() {
//Start
if(Input.GetMouseButtonDown(0)) {
//Input Mouse position
sx = Input.mousePosition.x;
sy = Input.mousePosition.y;
}
//Drag
if(Input.GetMouseButton(0)) {
dx = Input.mousePosition.x;
dy = Input.mousePosition.y;
tx = sx - dx;
ty = sy - dy;
//Rotate!
RotateVectorX = tx / xspeed;
RotateVectorY = ty / yspeed;
rotatetarget.eulerAngles = Vector3( CashRotateVectorY + RotateVectorY , CashRotateVectorX + RotateVectorX , 0);
}
//End
if(Input.GetMouseButtonUp(0)) {
//Input Object position
CashRotateVectorY = rotatetarget.eulerAngles.x;
CashRotateVectorX = rotatetarget.eulerAngles.y;
}
}
それでもObjectが後ろ向いている時のドラッグの挙動がおかしかったりしますが、まぁ・・・ね。
