画像に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でこのように
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の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を作成します。
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に関連付けしましょう!
動かしてみましょう!
###完成
動かしてみましょう!