2019年8月29日木曜日

[Unity] アニメーションキャラを吹っ飛ばす(ラグドール)

UnityでRagdollという機能がありますが、使ったことが無かったので使い方をメモしておきます。
Ragdollを使うと、人形のように吹っ飛ばすことができるようになります。


今回使用したUnityのバージョンは 2018.4.1f1です。

1.必要なアセットをインストール
 キャラクターの当たり判定(Collider)をメッシュやボーンに沿って自動的に設定してくれる便利なアセットです。
 ・SAColliderBuilder
 https://assetstore.unity.com/packages/tools/sacolliderbuilder-15058
  
 


2.キャラクターを画面に配置
 ボーン入りのキャラクターを画面に配置します。
 配置する際は、ルート(どのオブジェクトの子供ではない場所)に配置してください。理由としてはAnimatorの設定をスクリプトで操作する際に面倒だからです。
 ついでにアニメーションなども設定しておきます。
 
 今回は別途購入したゾンビキャラで実験です。

3.Colliderを設定
 先ほどのアセットを使って、Colliderを設定します。
 ①Animatorが設定されているキャラクターを選択し、右下の「Add Component」をクリックします。
 ②一覧から、「SA Bone Collider Builder」を選択します。
 
 ③ SA Bone Collider Builderの設定を次のようにします。
  Shape Type : Capsule
  Optimize Rotation :チェックを外す
  is Kinematic:チェックを外す
  user Gravity:チェックを付ける
  Collision Dectection Mode : Continuous Dynamic
  設定したら、「Process」をクリックします。
 


 以上で、Boneに沿ってColliderが自動生成されます。

4.Ragdollを作成
 ①Hiearchyから先ほど追加したキャラクタを選択し、Hierarchyの左下にある「Create」をクリックし、「3D Object > Ragdoll」をクリックします。

 ②Ragdollの設定画面が開くので、ボーンをひとつずつ設定してあげます。大体名前が一緒のはずですが、違う場合はめんどうですが位置を確認しながら設定していきましょう。最後に「create」をクリックします。
 
 そうすると、設定したボーンのところに「Character Joint」が追加されているのがわかります。これがRagdollの正体です。


5.実験
 とりあえず、適当な球を当てたときに動作するか実験してみます。
 ①ルートに空のゲームオブジェクトを作成します。今回は「tama」にしてみました。


 ②次に球体を作成します。「tama」を右クリックして、「3D Object > Sphere」を選択します。
 
「tama」の方向や大きさなどは適宜修正します。
 
 ③ つぎに球を発射するスクリプトを作成します。
 Hierarchyから「tama」をクリックし、「Add Component」で「GenerateTama」と入力して「New script」をクリックします。

 ④以下のスクリプトを貼り付けます。
GenerateTama.cs

    
void Update()
{
    if (Input.GetMouseButtonDown(0)) {
        GameObject tama = Instantiate(transform.Find("Sphere").gameObject , transform.position, Quaternion.identity);
        tama.SetActive(true);
        Rigidbody rigid = tama.GetComponent<rigidbody>(); 
        rigid.AddForce(transform.forward * 10, ForceMode.Impulse);
        Destroy(tama, 3.0f);
    }
}

⑤SphereにRigidbodyを追加します。
 HierarchyからSphereをクリックして、「Add Component」から「Rigidbody」を選択します。
 

⑥Sphereにもスクリプトを追加します。
  HierarchyからSphereをクリックして、先ほどと同様にスクリプトを追加します。
  名前は「HitTama」にします。
 

⑦以下のスクリプトを貼り付けます。
HitTama.cs
void OnCollisionEnter (Collision col)
{
    if (col.rigidbody!=null)
    {
        GameObject target = col.transform.gameObject;
        GameObject root = col.transform.root.gameObject;
        Animator anim = root.GetComponent<Animator>();
        anim.enabled = false;

        Rigidbody rigid = col.rigidbody;
        rigid.isKinematic = false;

        rigid.AddForce(transform.forward * power,ForceMode.VelocityChange);
    }
}

⑧ Sphereは無効にしておきます。
 

⑨ 最後に実行してみます。マウスを右クリックして球を発射して、キャラクタが倒れたら完成です。















ちなみに、RagdollとColliderの作る順番を間違えるとおかしくなるのでご注意を!



0 件のコメント:

コメントを投稿