Unity5で剣の攻撃とエフェクトを作ってみる

Unity5で見下ろし型のガン・シューティングを作っていますが、近接攻撃も作ってみたいので、実験用プロジェクトを作成しました。

剣を振る動作をどうやって実現するか

Unityでは、剣の攻撃のアニメーションを作る方法として大きく3つ考えられます。

  1. Blenderなどモデリングソフトでアニメーションを用意する。
  2. Mecanimで、Transformを修正してアニメーションを作成する。
  3. C#スクリプトで、Transformを全部操作する。

1つのアニメーションを作成する場合は、3の方法で問題ありませんが、アニメーションの数が多くなるとそれをすべてコードで書くのはかなり面倒なので、近接攻撃のアニメーションのようにいろいろ増えそうな場合は2の方法が簡単です。デザイナー・モデラーがいるプロジェクトの場合は、1の方法が最適です。

今回は頭から胴に斬るアニメーションと、胴を横に斬るアニメーションを2つ用意し、将来的にはもっと増やしたいので、2の方法を選択しました。以下は縦に剣を振るアニメーションです。

A02

剣にアニメーションを付けたら、それはPrafabにして、PlayerにEmpty Object(この場合EquipPointという名前)を用意してそこに持たせるようにします。

Empty Objectを用意して、そこに剣を装備させる
Empty Objectを用意して、そこに剣を装備させる

ゲームが開始したときに、PlayerBehaviour C#スクリプトのStartメソッドで、Sword Prefabをインスタンス化して、sword.transform.setParent(親オブジェクト, false);で、先ほどのEquipPointに装備させます。

あとは、マウスの左クリックで、縦のスイング、右クリックで、横のスイングのアニメーションを呼び出すようにしました。このStartメソッドのインスタンス化する方法とアニメーションを呼び出す方法は、よく使われるコードなので、お約束として覚えてしまえばいいです。

 

 

マウスカーソルの方向にプレイヤーを向ける

Playerオブジェクトの向きを変更するのは、transform.LookAt(向きベクトル);です。これはメソッド名からすぐにイメージできると思います。難しいのは向きベクトルを求めるところです。

  1. 仮の地面(tmpPlane)を用意する
  2. カメラからマウスカーソルへの光線(Ray)を用意する。
  3. 光線を仮の地面(tmpPlane)へ照射(Raycast)して、カメラからその地面までの光線の長さを求める。
  4. 光線の長さがわかったので、その点(point)を求める。
  5. Playerの高さを考慮して、LookAtで向きを変更する。

上記のように、レイキャストで求める必要があります。一度この仕組みをしっかり学べば理解しやすいです。しかし私も、昔ながらの物理エンジンがないゲームライブラリなどでは、光線の概念がないため、はじめて学習したときは結構理解するのが大変でした。

パーティクルの作成

パーティクルは、項目数が多いため、誰かが作ったものを参考にして、自分でいろいろパラメータを修正しながら作って慣れていくしかありません。

小さな四角形が落ちるエフェクト
小さな四角形が落ちるエフェクト
003
パーティクルは

パーティクルの基本は、Duration, Start Lifetime, Start Speedです。Durationは、この秒数、パーティクルを放射します。この例の場合は、0.15秒つまりかなり身近時間の放射です。Start Lifetimeは、生存期間で、放射したものが2秒生き続けます。2秒すぎると消えます。Start Speedは、そのまま速度で、これを速くすれば、遠くまで飛ばせます。

EmissionのRateは、量です。この場合1秒に100個ぐらいパーティクルを放射します。エフェクトを選択すると、Sceneビューに以下のGUIが表示されて、この部分でパーティクルの起動、ポーズ、停止ができます。また一番下に現在生成されているパーティクル数も表示されるのでいろいろデバッグに役立ちます。

006

Gravity Modifier: 2.5と指定しているので、重力の影響を受けて地面に落ちるようになります。これが0だと、横に飛び続けます。

004

上記では、Collisionを有効にして、[World]をターゲットにしているので、地面に当たった場合に貫通しないようになります。このパーティクルでは、Voxelモデルを倒したときのパーティクルにしたいため、Render Modeをメッシュにして、Materialを新規に作成(Shader: Sprites/Default)して割り当てています。通常のパーティクルの場合は、これをする必要ありません。

005

作成したパーティクルはPrefab化しておきます。

剣で斬られたら、パーティクルを生成する

敵オブジェクト(Enemy)に、Enemyスクリプトを割り当てて、Swordが衝突したら、InstantiateでParticleSystemを生成します。あとは、ParticleSystem.startLifeTimeで、開始からの生存秒数が取得できるので、この秒数後にDestroyメソッドを呼び出して、Particleを破棄しています。

 

剣の軌跡

Trail Rendererを使えば簡単に剣の軌跡を作れます。Swordプレハブに、Empty GameObjectを子要素として追加して、名前をTrailにしています。これにTrail Rendererコンポーネントを追加し、各種設定を行います。

007

このプロジェクトの配布

Unity5.4で作成しました。

http://hajimete-program.com/games/SwordAttack_and_DeathEffect.zip

まとめ

プレイヤーをマウスカーソルに向けて、近接武器である剣を振るようにして、ダメージの視覚化としてパーティクルを生成するようにしました。また斧やハンマーにしたときに簡単にモーションを追加できるようにMecanimでアニメーションを作成しました。