2020年4月「BuSy...!」

皆さん 
お元気ですか。
4月は色々新しい体験と新しい忙しさがあって少し大変でした...。

いつも月末に投稿する予定ですが、まさか4月末に作業というブラックホールに呑み込まれてしまいました。笑
でも何とか頑張って投稿するとこができました(汗)

明日からはGWの襲来ですが、家族にとって大事な予定があって、
うまくいけると心から祈っています。

さて、今回はUnityを使って、猫のアクションを作ってみました。

画像4

使ってた機能は、UnityのAnimation/Animatorです。

Animation

Animationは一枚一枚の画像を、キャラクターの動きに作成する機能です。

画像1

☆マークは一枚の画像キー、秒数の表示する時間によってPlay速度が変わります。左側にあるPotationとSpriteは画像に対する属性。
座標の移動や、方向性、大きさを自由にキーとして指定することができます。
今回の猫のStay状態は一枚の画像を使って大きさの調整で呼吸をつけました。

Animator

Animatorは作成したAnimationとAnimationの間に条件をつけて切り替えらせる機能です。

画像2

Entryからオレンジ色のAnimationまでは実際PLAYしたら一番最初に通るルートです。特に条件とかつけなくても、初期は必ずオレンジのAnimationからスタート。
そこからAnimationを追加し、矢印を作ってどのAnimationからどのAnimationに切り替えるルートを指定する。
左にあるパラメータは条件の要素で、Float、Int、Bool、Triggerの四つの要素で切り替える条件を付け加えます。
今回はBool要素をつけました。

画像3


Bool要素はTrueとFalseの切り替えでルートを決めます。
例えば、catch(Bool)の状態がTrueになったら、neko(Stay状態)からneko_catch(遊ぶアニメーション)に切り替えます。
状態がFalseになったら、Stay状態に戻ります。

そのTrueとFalseの切り替えはScriptで指定します。

    public Animator anime;


   private void OnTriggerEnter2D(Collider2D other)
   {
       if (other.CompareTag("fly"))
       {
           anime.SetBool("catch", true);
       }
   }


   private void OnTriggerExit2D(Collider2D other)
   {
       if (other.CompareTag("fly"))
       {
           anime.SetBool("catch", false);
       }
   }

まず猫のAnimatorをanimeという変数に代入して、
OnTriggrEnter2Dメソッドを利用し、Box Collider2Dを持っているオブジェクト同士が被った瞬間に実行させるように、
「もし”fly”というタグのオブジェクトと被ったら、animeのcatch要素の状態をTrueに変更する」という条件をつけます。
そしてOnTriggrExit2Dメソッドを利用し、被ったオブジェクトが完全に離れた瞬間に実行させるように、
さっきと逆のパターンで「もし”fly”というタグのオブジェクトが完全に離れたら、animeの状態をfalseに変更する」という条件をつけたら、蝶々が完全に離れた瞬間に猫の状態がStayに戻ります。

わりと簡単でした。笑

そしたら、蝶々が猫のある範囲に入ったら、猫が遊ぶ状態になり、範囲から離れたら、Stay状態に戻ります。

次は蝶々の動きを見てみましょう。

理想としては、蝶々に一定の範囲内で往復して飛んでもらいたいです。

    private Transform trans;
   float numY ;
   float numX ;
   // Start is called before the first frame update
   void Start()
   {
       trans = this.gameObject.transform;

   }

   // Update is called once per frame
   void Update()
   {
       Vector2 position = trans.position;

       if (position.y >= 4.7f)
       {
           numY = -0.5f;
       }
       if (position.y <= 2f)
       {
           numY = 0.5f;
       }
       if (position.x <= -11.61f)
       {
           numX = 0.3f;
       }

       if (position.x >= 12.6f)
       {
           numX = -0.3f;
       }

       position.y = position.y + numY;
       position.x = position.x + numX;


       trans.position = new Vector2(position.x, position.y);
   }

概念としてはPositionという座標の要素を使います。
直接にオブジェクトの下で書くときに、this.GameObjectを使っていまついているオブジェクトの情報を呼び出すことができます。
そしてオブジェクトの座標はthis.GameObject.transform.positionで取得や変更することができます。
Updateメソッドは毎フレームごとに実行されるメソッドですので、始めは現時点の蝶々の座標をpositionという変数に格納し、そこから分けていくと、position.xは座標Xになり、position.yは座標Yになります。
上下で移動させるため、座標Yの範囲を上4.7fから下2fまでに設定します。
左右の距離を制限するため、座標Xの範囲を左-11.6fから右12.6fまでに設定します。
感覚としては、その時点で格納した座標が(0f.0f)としたら、
position.x=0f;
position.y=0f;
position.xを - 1f したら、座標Xが-1fになり、
position.yを - 1f したら、座標Yが-1fになり、
いまの座標(0f,0f)= 新しい座標(-1f,-1f)にしたら、
次の瞬間、蝶々が座標(-1f,-1f)に移動することになります。
連続していくと、蝶々は一定の範囲内で飛び続けます。


以上はアニメーションと動き作成の簡単な説明でした(茶)


実際の作成を見たい方は、下記の動画をどうぞ。
速度は倍速していますが、動きをチェックしているところは通常速度に戻しています。

また、こういうのも作ってみてほしいというリクエストが御座いましたら、
是非、コメントやDMで教えていただければ、頑張って作ってみます。笑

それでは、今回はここまで

また。

この記事が気に入ったらサポートをしてみませんか?