ぐーるらいふ

底辺。

【Unity】3Dモデルのアニメーションを別の3Dモデルで使い回したい

3Dキャラ同士同じアニメ使えるやろ

  • Unity chanは3Dキャラやん
  • Unity chanにアニメーションあるやん
  • 他の3Dキャラにも同じアニメーションいけるやろ
  • ペタッと
  • ちーん

これとか
f:id:ghoul_life:20170711171210p:plain

こうとか
f:id:ghoul_life:20170711171217g:plain

見たことありませんかね?
「合っとるやろ!?なんでお前は言うことを聞かないんや!?もうええ!」
とsteamを起動していたんですが、いい加減に向き合おうと思いました。

格闘ゲーム作りたくなったんです

パンチとかキックとか良いですよね。カッコイイですよね。
でも自分はバーチャファイターや鉄拳は凄いヘタでして…。
2D格闘世代なので、SFやKOFやGGとかの方が馴染みがあります。
闘神伝トバルNo.1はそっと胸の奥に閉まっておきました。

使用したAsset

ファイティングユニティちゃん 無料体験アセット
f:id:ghoul_life:20170711171702p:plain
https://www.assetstore.unity3d.com/jp/#!/content/33478


Jeremyくん 無料
f:id:ghoul_life:20170711171719p:plain
https://www.assetstore.unity3d.com/jp/#!/content/33083


この二方を利用して、アニメーションの使い回しをしてみます。

Avator RigのAnimation Typeをおさらい

Avator RigのAnimation Typeは以下の3つがある

  • Humanoid
  • Generic
  • Legacy
Humanoid

ボーン構造などの基本的な構造の統一化を図り、リターゲッティングと呼ばれる
さまざまなモデルに同じアニメーションが共有できる仕組みが扱える。
docs.unity3d.com
docs.unity3d.com


Generic

ヒューマノイドアニメーションと言われ、動物などで主に利用される事を想定している。
Mechanimで扱うことは出来るが、共有して扱うことは出来ない。
docs.unity3d.com

Legacy

これはそのまま旧アニメーションでそのオブジェクトに紐づくアニメーション。
Mechanim非対応のアニメーションの場合はコレになるのかな。
docs.unity3d.com

結論

つまり、HumanoidのTypeにしてあげれば共通して使うことが出来るはずだ。

設定を見直そう

Unity chanのmodelのRigを見る

Animation Type = Generic -> Humanoid に変更して Apply

JeremyくんのmodelのRigを見る

Animation Type = Generic -> Humanoid に変更して Apply


f:id:ghoul_life:20170711165803p:plain

あれ、まだ駄目?モデルだけではなく、Animation Clipも編集しよう。
ポチポチとAnimation ClipのRigを見て

Animation Type = Generic -> Humanoid に変更して Apply

f:id:ghoul_life:20170711165812p:plain

Unity chan , Jeremy共に同じAnimator Controllerでいいはずだ。
FightingUnityChan_freeをセット。

f:id:ghoul_life:20170711165918p:plain

実装

こんなスクリプトをButtonで呼び出すようにして

  public Animator player;
  public Animator enemy;

  public void Punch()
  {
      player.SetBool("Jab", true);
      enemy.SetBool("Jab", true);
  }

  public void Kick()
  {
      player.SetBool("SAMK", true);
      enemy.SetBool("SAMK", true);
  }

  // Fighting Unitychan側には無い、Jeremy側のアニメーション。
  // 逆も出来るはずだ、というテスト。
  public void Victory()
  {
      player.SetBool("Victory", true);
      enemy.SetBool("Victory", true);
  }

実行すると

f:id:ghoul_life:20170711165449g:plain

OK!!
(後で気づいたんですが、Jeremyくんパンツ履いてなかった。)

さぁ、steamを起動しよう!

書く(読む)と長いんだけど、やると本当にすぐです。五分ぐらいで終わっちゃう。
ちょっとググったら答えはすぐに出るんだけど、自分なりに調査した結果をメモっておく、って事で。

steamを起動する時は、熱々のピザとキンキンに冷えたコーラを忘れずにね!