C3D勉強会で発表したかき氷Unityアプリ
7月31日(日)に行われたC3D勉強会に参加してきました。
事前に出されていた宿題は「夏」をテーマだったので、私は「夏」といったらやはりかき氷なので、Unityの物理演算を使ってかき氷マシーンを再現してみました。(実際には勉強会に間に合わなかったので調整してあります)
画面をクリックするとインスタンスとして生成されたCubeが器に入って・・・いかない、散らばりまくるアプリです。削られる氷の大きさや散りばり方、スクリプトはかなり力技です。ブラウザでも思ったよりはスピードが出てる印象ですが、低スペックのマシンだと厳しいと思います。
簡単なアプリですが、これが簡単にAndroidアプリに移植できるんですからスバラシー。
またUnityに関しても色々と発表させていただきました。どんなソフトか〜からunity Remote、アニメーションのやり方などなど。
今まで散々Unityいいよ〜って言いふらしてきたのに全く作品を作っていなかったので、やっとまともな発表ができて一安心です。
9月あたりにUnityの初心者向けワークショップとかやりたいな〜と思っていますが、名古屋で需要あるのかな・・・。Unityの場合3Dソフトの知識も必要なので、全てにおいて初心者の人はついていけないような・・・。
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が後ろ向いている時のドラッグの挙動がおかしかったりしますが、まぁ・・・ね。
unityでマテリアルの設定と切り替え
unityでマテリアルを扱う場合は、外部の3Dソフトでモデリングし設定されたマテリアルをunityに読込む(インポート)のが普通かと思いますが、それとは別にunity上でマテリアルを作ることができます。
新規のマテリアルを作る
「Creat」から「Material」を選び、できたマテリアルのshaderの種類を決めて、あとは色を設定します。写真の例では単純なDiffuseマテリアルです。

透明なマテリアルを作る
半透明なマテリアルを作りたい場合はshaderを「Transparent」などにして、カラーをRGBつまみの下のアルファを設定することで半透明なマテリアルができます。

他にもshaderの項目でスペキュラーやテクスチャを設定できます。最初からいろんなマテリアルが付いているので、大抵は大丈夫な感じです。それでも足りないという時にはasset storeのマテリアルを購入ですね。細部の内容は本家のリファレンスをどうぞ。
またスクリプトでマテリアルを作ることもできますが、個人的にはカラーなどはその場で見ながらの方がいいし、スクリプトを覚えなくて済むのでので使わないかなと。
マテリアルの切り替え
マテリアルの切り替えは単純にrenderer.materialに代入するだけ。
以下のスクリプトはボタンをクリックすることでマテリアルを切り替えています。「NewCube!」をクリックすることでCubeを生成できます。
(動作させるにはプリミティブのCubeと空のオブジェクトと最低2つのマテリアルがいります)
var prefabcube:GameObject;
var M_ice:Material;
var M_diff:Material;
var MS_cube:Material;
function Start () {
//Ground
var groundcube = gameObject.CreatePrimitive(PrimitiveType.Cube);
groundcube.transform.position = Vector3(0,0,0);
groundcube.transform.localScale.x = 1000;
groundcube.transform.localScale.z = 1000;
//default Material
MS_cube = M_ice;
}
function OnGUI () {
//Button
var BT_newcube = GUI.Button(Rect(10,10,120,30),"newCube!");
var BT_changeM1 = GUI.Button(Rect(140,10,120,30),"Change Material1");
var BT_changeM2 = GUI.Button(Rect(270,10,120,30),"Change Material2");
if(BT_newcube){
cuberain();
}
if(BT_changeM1){
MS_cube = M_diff;
}
if(BT_changeM2){
MS_cube = M_ice;
}
}
function cuberain() {
var incube : GameObject = Instantiate(prefabcube, transform.position, transform.rotation);
incube.AddComponent(Rigidbody);
incube.renderer.material = MS_cube;
}
unityをサイトに埋め込んだらかなり重くなってしまったので、これからは別ページに表示させることにしました。
物理演算は楽しいなぁ。

