tag:crieit.net,2005:https://crieit.net/tags/Unity2D/feed 「Unity2D」の記事 - Crieit Crieitでタグ「Unity2D」に投稿された最近の記事 2019-05-12T18:44:46+09:00 https://crieit.net/tags/Unity2D/feed tag:crieit.net,2005:PublicArticle/14981 2019-05-12T18:44:46+09:00 2019-05-12T18:44:46+09:00 https://crieit.net/posts/Unity-Sprite UnityでSpriteアニメーションを画像差し替え可能な実装をする <p>2019/3/8</p> <p>そろそろアニメーションをつけてかっこよくしたいという事で、その辺の機能を作った。</p> <p>でもUnityで<strong>Spriteアニメーション</strong>を行う機能が充実していなかった。</p> <p>色んな記事を見ても<strong>汎用性が低そう</strong>な実装が多い。</p> <p> </p> <p>そこで今回は<strong>Animationからスクリプトの関数を呼び出し、Animatorで管理</strong>する方法で実装してみた。</p> <p> </p> <p>利点は2つ。</p> <ul> <li><p>通常通り<strong>アニメーターが利用できる</strong>のでGUIでステート管理が可能。</p></li> <li><p>似たアニメーションを違うキャラクター用に<strong>スプライトの差し替え</strong>が可能。<br />  </p></li> </ul> <p>本当に簡単で申し訳ないが、作成方法を書いておこう。</p> <p> </p> <h1 id="スプライトの切り替えをするスクリプトを作成する"><a href="#%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%88%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%92%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">スプライトの切り替えをするスクリプトを作成する</a></h1> <p><strong>スプライトの切り替え</strong>を行うスクリプトを用意する。</p> <p>今後UnityのAnimationからAnimationSpriteNextの関数を呼ぶことになる。</p> <pre><code class="cs"><br />public Sprite[] animationSprites; private int animation_index; void AnimationSpriteNext(){ GetComponent<SpriteRenderer>().sprite = animationSprites[animation_index]; animation_index = (animation_index + 1) % (animationSprites.Length); } </code></pre> <p>こんな感じの内容が書かれたスクリプトを書く。</p> <p>スクリプトを作成したら、<strong>アニメーションさせたいオブジェクトにアタッチ</strong>してスクリプトは終わり。</p> <h1 id="Animationを作る"><a href="#Animation%E3%82%92%E4%BD%9C%E3%82%8B">Animationを作る</a></h1> <p>アニメーションさせたいオブジェクトに<strong>新規AnimatorとAniamationを作成</strong>してコンポーネントに。</p> <p><strong>Animationウィンドウ</strong>で、右クリック → <strong>Add Animation Event</strong></p> <p>追加したAnimation Eventをクリックして、Inspectorで先ほど作成した<strong>AnimationSpriteNext関数を選択</strong>。</p> <p>必要なコマ数イベントを作成して、AnimationSpriteNextを呼ぶ事でアニメーションになる。</p> <h1 id="インスペクターでアニメーションさせるスプライトを設定"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9A%E3%82%AF%E3%82%BF%E3%83%BC%E3%81%A7%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%95%E3%81%9B%E3%82%8B%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A">インスペクターでアニメーションさせるスプライトを設定</a></h1> <p>上記のスクリプトを付けたオブジェクトのInspectorを見る。</p> <p>Inspectorでこのスクリプトの<strong>animationSpritesにアニメーションに必要なスプライトを設定</strong>する。</p> <p>以上で設定は終わり。</p> <p>これで再生して無事動けば完成だ。</p> <p>僕が実際に利用する際は、<strong>animationSpritesはデータベースから参照</strong>している。</p> <p>ちなみに、データベースにはScriptableObjectを使用した。</p> <h1 id="応用"><a href="#%E5%BF%9C%E7%94%A8">応用</a></h1> <p>UnityのAnimationを使うので、<strong>追加でα値を変えるアニメーションが簡単</strong>に追加出来る。</p> <p>また、通常のアニメーションとして<strong>アニメーターで管理</strong>出来る。</p> <p>その為移動ステート、スキルステート、待機ステートなどを作って遷移規則を作ってしまえばいい感じに動く。</p> <p>Animation Eventは<strong>何も関数を呼ばないとエラー</strong>になるので、僕はEndAnimation()という<strong>空の関数</strong>を作って最後に呼ぶことにしている。</p> <h1 id="コメント"><a href="#%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88">コメント</a></h1> <p>正直悪くはないが、<strong>これじゃない感</strong>もある。</p> <p>特に、後から見直した時にどうなってんのか分からなくなりそうなのが怖い。</p> <p>一度アニメーション全部を管理するスクリプトを書こうと思ったけど、<br /> 結局アニメーターみたいな<strong>GUIが欲しい!ってなって詰んだ</strong>。orz</p> QuestGames