公開日:2023/07/08  更新日:2023/07/08

Unityの燃える剣の作り方

 前回までの記事で以下のように剣を振った際に軌跡が出るようにした。


 前回までの記事↓
TPSのキャラ移動
ジャンプ
ダッシュ実装
自作キャラを動き回らせる
剣を振る方法
剣コンボ
足が浮く対策
剣の軌跡の作り方

 これまでの使用フリー素材(2023年3月現在はフリー)↓

・剣素材


・剣を振るアニメーション


 通常攻撃4連コンボだけでは地味と言わざるを得ない。
 そこで今回はエフェクト機能の一つであるパーティクルを使って、燃える剣で斬りつける必殺技を作っていく。

パーティクルで燃える剣の必殺技を作る目次

パーティクルの基本
燃える剣の作成
必殺技作成
目次にもどる

パーティクルの基本

 パーティクルの基本について紹介していく(必要ないなら次の項目へ)。作り方手順は以下の通り。

 ①GameObject→Effects→Particle Systemのように選択する(ヒエラルキー欄からEffects→Particle Systemのように選択してもOK)


 ②ヒエラルキー欄にParticle Systemというゲームオブジェクトが追加される。デフォルトでは光の玉が沸き上がり拡散していくパーティクルとなっている。


 以上でParticle Systemの作成は完了。選択してインスペクター欄を見るとParticle Systemというコンポーネントがある。そこの三角ボタンを押すと以下のように大量の項目が現れる


 簡潔にではあるが、Particle Systemの中でも重要となる項目をまとめてみた。
Durationパーティクルが動く長さ
LoopingチェックがついているとDurationで指定した時間終了後に再度動く
PrewarmチェックがついているとLoopingにもチェックがついている場合にサイクルを1回完了したかのように初期化
Start Delay有効になってからパーティクルが出るまでにかかる遅延時間
Start Lifetimeパーティクルの初期の出ている長さ
Start Speed各パーティクルの初速
Start Size各パーティクルの初期の大きさ
Start Rotation各パーティクルの初期の角度
Start Color各パーティクルの初期の色
Gravity Modifier重力の大きさ。値が0の場合は重力なし。
Simulation Spaceパーティクルを親ゲームオブジェクトのローカル座標とワールド座標のどちらで動かすか
Simulation Speedパーティクルの再生速度
Delta TimeScaledを選択した場合、TimeウィンドウのTime Scaleの値を使用。Unscaledを選択した場合はTime Scaleの値を無視。
Scaling ModeTransformのScale使用方法を3種から選択。LocalはTransformのScaleのみを適用(親はすべて無視)。HierarchyはTransformのScaleを影響させるが親を無視しない(親オブジェクトのスケールを変更すると子の大きさも変わる)。ShapeはScaleをパーティクル開始位置に適用しサイズには影響させない。
Play on Awakeチェックが入っているとオブジェクトが作られた際にシステムを自動で動かす
Max Particleシステムで一度に存在できるパーティクルの最大値。最大値に達すると削除される

 量が多いが少しずつ覚えていこう。
目次にもどる

燃える剣の作成

 パーティクルを使って燃える剣を作成していく。最初からパーティクルを作成するのではなくフリー素材を使っていく(先ほど作ったParticle Systemは削除でOK)。以下の素材をダウンロードしてインポートしてほしい。

 炎のフリー素材(2023年3月現在はフリー)

 インポートまで完了したら、プロジェクトビューのFX_Kandol_Pack/FX Fire Ⅱ/PrefabsのFX_Fire_ParticleSystem01.prefabをドラッグ&ドロップしてヒエラルキー欄に持っていく。名前が長すぎるのでFireAttackに変更しよう。
 FireAttackを剣のゲームオブジェクトの子要素にして、剣にあわせて追従するようにしよう。剣の位置までFire1を移動させよう。

 さて、最初の問題はFireAttackの炎がデカすぎることだ。

 剣を覆う程度までに小さくする必要がある。

 これが意外と厄介であり、インスペクター欄でStart Sizeを小さくするのではダメだ。以下のようにパーティクル1つ1つの大きさは小さくなるが飛ぶ距離は変わらない。見た目的にも大量の火の玉を飛ばしている感じになってしまう。

 また、デフォルトではTransformコンポーネントでScaleを小さくしても変化がない。

 解決策としてはScaling ModeがデフォルトではShapeになっていると思うので、LocalかHierarchyに変更すればいい。これでScaleでの大きさ変更が可能となる。

 TransformのScaleのX、Y、Z全てを0.01に変更すると以下のようにパーティクルの全てが縮小し剣の刀身を覆う程度の大きさとなる。後は位置あわせを行えば、燃える剣自体は完成だ。


目次にもどる

必殺技の作成

 今回は通常攻撃を1回以上行っている時に右クリックすると燃える剣で斬りつける必殺技が出せるようにしていく。

 まずは燃える剣を振った際の軌跡を作成する。
 前回の記事でやったようにTrailを作成して剣の子ゲームオブジェクトにする。

 今回は名前をFireAttack2とした。Trailの位置は剣の先のほうに設定。

 FireAttack2のインスペクター欄を選択して、Materialsを変更する。
 今回はFX_Kandol_Pack/FX Fire Ⅱ/Materialsのfx_fire_p01を選択する。

 幅やtimeはお好みで設定しよう。今回は以下のように設定してみた。


 続いて、前回までの記事で作成しているPlayerController(AnimationController)にFireAttackのステートを作成しよう。
 再生するAnimationClipは2 Hand-Sword-Attack 2を今回は指定した。前回までの記事で作成している攻撃1回目と同じAnimationClipだが、Speedは0.8と遅めに設定しよう。
 まずはAnimationClipへのイベント追加を行う。前回のコンボ攻撃作成記事で以下のようなAnimationClipを使用している。

 攻撃1回目…2 Hand-Sword-Attack 2

 攻撃2回目…2 Hand-Sword-Attack 8

 今回の遷移は以下のように作成。
 Attack1~4からFireAttackへの遷移はAttackのパラメータが9.9より大きい時とする。

 FireAttackからIdleへの遷移はAttackのパラメータが0.9より小さい時とする。

 例えばAttack2→Attack3への遷移はAttackのパラメータが2.9より大きい時となっている。Attack2→FireAttackの遷移はAttackのパラメータが9.9より大きい時だ。Attackのパラメータが10だと、どちらの遷移にも当てはまってしまう。
 この場合、遷移の優先度を決めておく必要がある。
 遷移の優先度を決める方法の一つが、Ordered Interruptionだ。デフォルトでは遷移を選択してインスペクター欄を見るとOrdered Interruptionの項目にチェックが入っている。

 この状態なら、ステートのインスペクター欄のTrantionsの項目で遷移の優先度を変えられる。

 各遷移の内容が表示されておりドラッグ&ドロップで順番を変えられる。上の行ほど優先度が高くなる。
 今回の場合は、FireAttackステートへの遷移の優先度をAttackステートへの遷移より高くする。全てのAttackのステートで優先度変更を行おう。
 スクリプトの記述は以下の通り。

 以下のようにシリアル化を行っている。FireAttack1ObjectにはFireAttack1(ParticleSystemのゲームオブジェクト)、FireAttack2ObjectにはFireAttack2(Trailのゲームオブジェクト)を指定。


 続いて攻撃ボタンを押した時の処理から見ていこう
 主に追加したのは最初のファイアアタック処理。
 2回目の条件分岐でif (Combo == true)としているので1回以上攻撃していてコンボ可能状態の時に、if (Input.GetMouseButtonDown(1))の条件分岐が行われ、右クリックされた場合に中身の処理が行われる。
 続いてanim.SetFloat("Attack", 10f);と記述している。これでAttackパラメータに10が代入され、FireAttackへの遷移が行われる。
 FireAttackの終了まで他の攻撃操作を受け付けないようにするため、Attackdekiru = false;。一番最初にif (Attackdekiru == true)があるので次の処理からはtrueに戻るまで攻撃は行われない。
 コンボもこの攻撃で終了なのでCombo = false;としている。
 必殺技が発動した時点で剣に炎をまとわせたいので、Fire1.Play();で再生を開始(軌跡はまだ)。
 他の攻撃操作を行わないため、return;でこのメソッドの処理を中断する。

 前回までの記事で各AnimationClipは剣の振り始めでAttackStart、剣の振り終わりでHit、AnimationClipの終わりでAttackEndのメソッドを呼び出すように設定している。
 記述は以下の通り。
 各メソッドでは必殺技のファイアアタックか通常攻撃かで条件分岐を行っている。
 AttackStartメソッドではif (Attack == 10f)の条件分岐に当てはまった場合、Kiseki.emitting = true;とすることで炎の軌跡を出す。
 Hitメソッドではif (Attack == 10f)の条件分岐に当てはまった場合、炎の軌跡を消す処理を行っている。
 AttackEndメソッドではif (Attack == 10f)の条件分岐に当てはまった場合、パーティクルの炎を消す処理を行っている。最後にStartCoroutine(ComboEnd());としており、通常攻撃4連コンボと同様にコルーチンで待機状態にしている(コルーチン処理の最後でAttackdekiruがtrueとなり再度攻撃が可能となる)。

 今回のスクリプト記述を行いPlayerにアタッチして再生すれば、以下のように通常攻撃1回以上後に右クリックで燃える剣での必殺技が出せる。


 続きの記事は以下。
ステータス管理
Unityのゲーム制作まとめへ戻る

page top