Help us understand the problem. What is going on with this article?

【Unity】剣の軌跡のつくりかた

はじめに

こんにちは、中二病のZeniZeniです。
ゲームで剣を出すなら、かっこいい軌跡を出したいですよね?
色々と調べると、剣の軌跡の作り方はいろいろな方法があり、それぞれに長所・短所があります。
この記事では、それらの剣の軌跡の作り方をまとめてみようと思います。
VRでの使用を目的に調べていたので、VRに適しているかどうかの評価が多分に含まれます。

TrailRendererを使う方法

参考資料

一番オーソドックスなのは、Trail Rendererを使う方法だと思います。(記事も多いです)
- ユニティちゃんでわかるVRchatのためのunity教室 第12回 Trail Rendererで軌跡を描こう トレイルレンダラー実装編
- ケーキのPC情報集会所 【VRChat】トレイルレンダラー(Trail Renderer)を使って軌跡を描いてみよう♪♪

AnimationEventやScript使わなくても、簡単な設定でそれっぽいのができるのは素晴らしいです。
Boothにもクオリティの高い作品が多く出展されています。
- 剣向け汎用トレイル Black.Cat's様作
- 霊刀睡蓮[屈折トレイル付き] オニガワラインダストリ様作

具体的な使用方法は上記サイト様を参考にしてください。

注意点 ねじれ問題

注意点なのですが、TrailRendererにはねじれ問題が存在します。
ねじれ問題とは、下図のように、Trailの折り返し時に、軌跡がぐちゃっとしてしまう問題です。
Trailねじれ.gif
原因は
- ノード間の感覚が狭い
- トレイルの幅が広い
ことであり、これらの調節である程度は改善できますが、完全にねじれを消すことは難しいです。
こちらの動画で詳しく紹介されています。
【Unite Tokyo 2018】誘導ミサイル完全マスター

一般的な3Dゲームで使用する剣の軌跡であるならば、アニメーションが固定なのでTrailのオンオフで割と簡単にごまかせるのですが、VRだとそうはいきません。

対処法

ねじれ問題の対処方法なのですが、二種類あると思っています。
一つは、上記動画で紹介されていますが、折り返し地点だけTrailを透明にしてごまかす方法です。
Shaderを自分で実装する必要がありますが、一つのTrailだけでできるのは楽でよいです。

もう一つが、「剣向け汎用トレイル Black.Cat's様作」の実装法で、TrailRendererを大量に使用する方法です。
ねじれ問題は、トレイルの幅が広いと顕著に表れるので、幅の狭いTrailを大量に用いればぐちゃっとした軌跡ではなくなります。

スクリプトからメッシュを生成する方法

こちらの記事で紹介されている方法です。
Unityを使った3Dゲームの作り方(かめくめ) Unityでスクリプトから剣の軌跡を作成し表示する
スクリプトでメッシュを生成しているので、剣を振るアニメーションがどんなものでも調整いらずで軌跡を表示できます。

ParticleSystemを使う方法

1番汎用性が高く、個性を出しやすいのはこの方法だと思います。
ただParticleSystemを使うといっても、方法はいろいろとあります。

剣の軌跡エフェクトを作って、アニメーションに合わせて発生させる方法

これは非VRのゲームで多く採用される方法だと思います。
下のGIFのようなエフェクトを剣を振るアニメーションに合わせて発生させます。
slacheffect.gif

このようなエフェクトは下図のような連番テクスチャを作成して、ParticleSystemのTexture Sheet Animationの設定をすることでできます。
この連番テクスチャはAdobe AfterEffectを使用して作りました。
以下の動画が参考になります(英語字幕)。
Game Effect Tutorial - Slash - Part 1/4 - DucVu FX
Slash_blend_01_sheet.png
bandicam 2019-12-11 16-43-27-974.jpg

アニメーションに合わせて発生させる方法ですが、Animation Eventを使用することでできます。
Animation Eventの詳しい方はこちらを参考にしてください。
[Unity] Animation Eventを使いこなそう!

剣から細かいパーティクルを出して、軌跡っぽく見せる方法

こちらの画像みたいなことをします。
FlameEnchantEffect_Moment.jpg
動画はこちら
https://youtu.be/mU_uUo__vkw

実装方法

剣から発生させたいParticleSystemを以下のように設定します。

bandicam 2019-12-11 17-47-00-809.jpg
グローバルモジュール内のSimulationSpaceをWorldにします。
これがLocalだと、発生したパーティクルは剣との相対距離が一定のままになるので不自然になります。

bandicam 2019-12-11 17-48-42-851.jpg
Emissionモジュールの設定ですが、剣を振った時だけ軌跡を出したいというときには、Rate over TimeではなくRate over Distanceに値を入れてください。
ShapeモジュールではShapeをMesh RendererかSkinned Mesh Rendererにすることで、エフェクトの発生位置を二つ下にあるMeshに設定したMeshから発生させることができます。
使用するモデルがMesh RendererかSkinned Mesh Rendererのどちらを使っているかに注意してください。
TypeはVertexだと発生位置が偏りやすいので、EdgeかTriangleにするとよいです。

bandicam 2019-12-11 20-28-20-170.jpg
Inherit VelocityモジュールのMultiplierの数値を0より大きくすることで、剣を振った方向にパーティクルを飛ばすことができるようになります。ModeはCurrentにすると剣の速度の影響を常に受けるようになってしまうので、Initialにするのがいいと思います。

VFX Graphでやりたい場合

VFX GraphでパーティクルをSkinned Mesh RendererなどMeshから発生させたい場合、現状(2019年12月11日現在)のVFX Graphには標準でそのような機能はついていません。
Point Cacheがあるじゃんと思うかもしれませんが、あれは特定のメッシュの頂点情報を使用しており、Scene中の実際に使用するモデルの座標は参照できません。
しかしご安心ください、keijiroさんという方が公開しているUnityプロジェクトに、VFX GraphでSkinned Mesh Rendererを使用するサンプルプロジェクトがあります。
https://github.com/keijiro/Smrvfx
こちらを参考にしてください。(先ほど紹介した炎の軌跡エフェクトもVFX Graphで作成したものです)

おわりに

他にも作る方法があるかと思いますが、とりあえず自分の知る範囲のことを紹介してみました。
他に作り方が見つかり(思いつき)次第追記していこうと思います。
個人的には「剣から細かいパーティクルを出して、軌跡っぽく見せる方法」が1番使い勝手が良くて好きですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした