画像にDynamicBoneを適用して動かす


画像にDynamicBoneを適用し滑らかに動かす方法

2Dゲームを作る時、sprite画像をDynamicBoneで動かす方法について書いていきます。

2Dで龍がうねうね動くゲームを作った際、
DynamicBoneを2D画像につけて動かしている記事がなかった!!

なので、もし2D画像をDynamicBoneで動かそうとしている人がいたら参考にしてください!
具体的には龍とか蛇のような動きを再現するのに使えると思います。

完成イメージはこちら!

使ったものは
・Unity2018.4
・visual studio code
です。
あとはUnityのアセットストアからImportしたものを使っていきます。

なかなか綺麗にクネクネしていますね!
では実装していきましょう!!

手順

0.準備
1.画像をImport
2.anima2Dを適用
3.DynamicBoneを適用
4.スクリプトで動かす

0.準備

アセットストアで

Anima2D
DynamicBone

をDLしておきましょう!
DynamicBoneは有料ですが
Anima2Dは無料です!

1.画像のImport

準備ができたら早速うねうねさせていきましょう!
まずは画像をUnity上にImportします
うねうねさせる任意の画像をImportしてください。(龍でも蛇でも!!)

・Inspectorを開く

Inspectorでこのように
Texture TypeをSprite
SpriteModeをSingle
に設定します。

2.anima2Dを適用

anima2Dを使うと、簡単に2Dのアニメーションができます!
画像の中に骨(Bone)を入れて動かします。

・SpriteMeshの作成


ImportしたSpriteを右クリック>Create>Anima2D>SpriteMesh
をクリックします。


こんな感じでProjectViewのSpriteMesh(水色の四角いマーク)が増えます。

・Boneを入れる

空のGameObjectを用意!
そこに先ほど作ったSpriteMeshをドラックアンドドロップで入れます!
そうするとSpriteがGameViewに表示されます。
・Boneを作る

Create>2DObject>Bone
でBoneを作ります。揺らしたいSpriteの先端(頭)に配置します。

ここからBoneを複製して増やします。ここではとりあえず5個くらいにしておきます。

・Boneの子オブジェクト化

このようにBoneは複製した順に親子関係を作っておきます。

各BoneのInspectorを見るとBone2Dが入っています。

Childに、Boneの一つ下側のBoneを入れていきます
(newBoneのchildにはnewBone(1)を、newBone(1)のchildにはnewBone(2)を、、、といった具合に一番最後までやります。尻尾のBoneのchildは空で構いません。)

こうしておくとBone同士がくっついて綺麗に配置することが出来ます。

Boneを配置

ここまでできたらBoneをいい感じに配置してください

メッシュの分割、ウェイトの設定

Spriteを選択しながら
Window>Anima2D>SpriteMesh Editorを開きます。

Sliceボタンを押して、Tessellationを上げ、Applyを押します
すると、細かく分割されました!!

SpriteのInspectorを開く
SpriteMeshInstance(Script)のSetBonesに
一番上(頭)のBoneをドラックアンドドロップで入れます。

Boneがこのようにセットされます。

もう一度SpriteMesh Editorを開くと、Boneが現れています。
左上のメニューでBindだけが押されている状態にし、
各々のBoneの影響力を決めます。
右下のweight toolでAutoを押すといい感じにしてくれます

出来ました!

おそろしくエラーが出るのでここの


Center
-Infinity
の値を全て0にしました。

1.2についてはこちら
の記事を参考にさせていただきました。

3.DynamicBoneを適用

dynamicBoneを適用することによって、頭の動きに反応して尻尾が自然になびくようになります。
・GameObjectにdynamicBoneを入れる
SpriteやBoneが入っているGameObjectにDynamicBoneを入れます。
Project>DynamicBone>Script>DynamicBone
このスクリプトをGameObjectにドラックアンドドロップします

GameObjectのInspectorViewでDynamicBoneの欄を見ます

RootにBone(1)をドラックアンドドロップで入れます

DynamicBoneの適用は以上です。
Inspectorの
Damping
Elasticity (弾性)
Stiffness(剛性)
Insert
を色々いじって理想のぐねぐねを実装します。

3についてはこちらの記事を参考にさせていただきました。

4.スクリプトで動かす

ここまで出来たら、あとはボタン等でGameObjectを動かしてあげるだけです。
画面の右側クリックで右周りに回転、左側をクリックで左回りに回転するScriptです。
他にも直進する、角度を変えるなど動けばなんでもいいですね。

新しいScriptを作成します。

PlayerScript
void Update () {
            if(Input.GetMouseButton(0)){
                if(Input.mousePosition.x <= Screen.width / 2){
//画面の左側をクリックしたら
                transform.Rotate(new Vector3(0,0,300 * Time.deltaTime));
//クリックしている間左回りに回転する
                }
            }
            if(Input.GetMouseButton(0)){
                if(Input.mousePosition.x >= Screen.width / 2){
//画面の右側をクリックしたら
                transform.Rotate(new Vector3(0,0,-300 * Time.deltaTime));
//クリックしている間右回りに回転する
            }
        }
    }

Updateにこのように書き込み、GameObjectに関連付けしましょう!

動かしてみましょう!

完成

動かしてみましょう!