2013年8月3日土曜日

UnityでFBXファイルを読み込む際にハマったこと

興味本位でちょっと Unity でもいじってみるか、とか思って
とりあえずいわゆる「黄本」の写経をちょこちょこやってるわけですが、
Unity のバージョンの差なのか、ときどきインターフェースとかが
本と違ってるなんていうトラップが仕込まれてたりします。

今回ハマったのは FBX(3Dモデル)ファイルの読み込み部分なんですが

アニメーションが正常に読み込まれてない…??


てか何が困るって Unity はまだまだ情報が少ないもんで、ちょっと
つまづいただけでもネットで情報調べながら解決しようとすると
丸1日作業になったりするという…




んで本題。

黄本に書いてある手順だと、大まかには

1.fbx(3Dモデル情報) と png(テクスチャ) をインポート
 →prefab として登録される
2.prefab をインスタンス化(Hierarchy ビューにドラッグ&ドロップ)
3.アニメーションスクリプト作成
4.スクリプトを2で作ったオブジェクトにドラッグ&ドロップ

てな感じですが、自分の環境でこの通りにやると以下のようなエラーが
出やがりました。

「Animation なんかそのオブジェクトにはないよ」みたいな。


てかその前段階のアニメーション動作確認とかの時点でもう
インターフェースがだいぶ違っちゃってて、↑の画像見ての通り
そもそもオブジェクトに「Animation コンポーネント」とかないワケですよ。



で、ネットを漁りまくってようやく見つけた解決方法。



FBX インポートインスペクタの Rig パネルの Animation Type を
Generic → Legacy に変更して Apply。

すると



無事オブジェクトのとこに Animation コンポーネントが出てきました。
あとは黄本のとおりでOK、と。やれやれ。



まあもっと別の解決法もあるんだろうなーとは思いますが、とりあえず
写経の段階だし動けば万事OKってことで。

Javaでのクラス継承時のコンストラクタ

仕事で Android アプリの開発をすることになったものの、
java とかほとんど触ったこともないワケで。

ちょっくら java のコンストラクタの呼ばれ方が気になったので
実験してみた。

  • SuperClass.java
public class SuperClass {

 protected String status = "status :";

 //1.引数なしスーパークラスコンストラクタ
 public SuperClass()
 {
  status += " Super 1 Called";
 }

 //2.引数ありスーパークラスコンストラクタ
 public SuperClass(Context context)
 {
  status += " Super 2 Called";
 }

 @Override
 public String toString()
 {
  return status;
 }
}

  • SubClass.java
public class SubClass extends SuperClass{

 private Context context;

 //3.引数なしサブクラスコンストラクタ
 public SubClass()
 {
  status += " Sub 1 Called";
 }

 //4.引数ありサブクラスコンストラクタ
 public SubClass(Context _context)
 {
  status += " Sub 2 Called";
  context = _context;
 }

 //結果表示
 public void checkValue()
 {
  Toast.makeText(context, toString(), Toast.LENGTH_SHORT).show();
 }
}

  • MainActivity.java
public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  final SubClass subClass = new SubClass(this);

  Button button = (Button)findViewById(R.id.button1);
  button.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View arg0) {
    subClass.checkValue();
   }
  });
 } 
  • activity_main.xml
(ボタン1コ置いてあるだけなんで省略。。。)


んで実行結果が

status : Super 1 Called Sub 2 Called

なので、呼び出し順としては

 1.スーパークラス引数なしコンストラクタ
 4.サブクラス引数ありコンストラクタ

ってことか。

どのコンストラクタがどの順番で呼ばれるか、てのは実際やってみると
なるほどって感じですな。