レベルデザインの学習

Unity5を使ってガン・シューティングゲームを作っています。とりあえずある程度実装できましたが、少し単調すぎてどうしたものか悩んでしまいました。そこで一度手を止めて、レベルデザインについて調べてみました。2016年のUniteのワークショップで、大野 功二さんが初心者向けにレベルデザインについて講義してくれていて非常に参考になります。

 

001
制作中のガンシューティングゲーム
002
単調なのを何とかしたいが…

レベルデザイン

日本でレベルという言葉を使う場合は、RPGゲームのレベル上げのように使いますが、英語の場合は、レベルはfloorと同じ意味もあるそうです。先ほどのYoutube動画で、いくつか注意点が描かれていたので整理してみます。

  1. 変化、コントラストを作る
  2. 遊びの「幅」と「深さ」を理解する。
  3. 起承転結、序破急を作る。
  4. フック(予兆、前兆)を作る。
  5. 失敗した理由を分かりやすくする。

1.変化、コントラストを作る

以下画像のように、なだらかに上昇していく場合は、人はあまり変化や驚きを感じません。プレイヤーに手応えを感じさせるには、ある程度の高低差のあるものなどを用意するべきです。

003
継続的な変化
004
大きな高低差

敵を出現させるときも同様で、継続して少しづつ出すよりかは、ウェーブのような仕組みを用意したり、一匹出たと思ったら、次は大量に出てくるなど変化を付けると良いです。

005
敵の増え方が緩やか
006
一匹の後は、大量に出てくる例

ある程度ゲーム経験のあるユーザー向けだからと言って、いきなり大量の敵で、継続的に増加していくなどは避けたほうがよく、うまく量や緩急などを調整していく必要があります。

私の作っているゲームでこの事を応用する場合は、敵のゾンビを秒単位に順々に増加していくのではなく、ウェーブ形式にして、ゾンビの数の調整、ウェーブ毎に出現するゾンビの種類、ウェーブのタイミングなどを細かく調整していける状態にしたほうが良いようです。

 

2.遊びの「幅」と「深さ」を理解する。

001
敵の色や大きさで種類を増やす例

ここでいうは、単純にバリエーションです。以下のような項目を修正すればよいのでこれは実装も簡単です。

  • 体力の増減
  • スプライトの大きさ
  • 速度
  • 移動経路の種類
  • 移動速度

「深さ(Depth)」ですが、これは組み合わせの事です。

  • 敵の組み合わせ
  • 敵と地形の組み合わせ

以下の画像は、敵はそれぞれ別の角度でジャンプしているだけです。しかし地形が階段になり、複数の敵が配置されると、プレイヤーは複雑に感じます。この組み合わせが発生した場合、プレイヤーは戦略を考える必要が出てきます。これによりゲームの深み、つまり面白さが生まれてきます。

a05

実際、ゲームをしている時、あまりにも難しい仕組みの場合はストレスでしかありませんが、ちょっとした部分を攻略できたりすると「よし!」と手ごたえを感じることがあります。シューティングゲームやアクションゲームは特にこの傾向が強いです。

 

3.起承転結、序破急を作る。

シンデレラ曲線や感情曲線でGoogle検索すると、この手の資料はたくさん見つかります。一番はじめに説明した「コントラストを作る」をふまえて、2D Platformerの場合は、はじめは簡単にしつつもコントラストを意識し、最後にボスを用意すればよさそうです。アクションゲームやシューティングゲームの場合は、中ボス、ボスで緩急を付けやすいので、経験が少ない場合は積極的に中ボスなどを用意するのもよさそうです。

007
引用:https://youtu.be/Dgcdo_VPHh8?t=1h2m19s

ボス素材は用意する必要ない?

ボスのキャラクターを用意しなくても極端に大きくしたりするとボスっぽくなるので、あとは攻撃方法や移動方法を調整するという手もあります。

008
キャラクター素材は同じでも、極端におおきくするとボスっぽい

 

4.フック(予兆、前兆)を作る。

a06
予兆がない死

基本的に、突然死になることはやってはいけません。プレイヤーのストレスになるだけです。ゲーム実況などで盛り上がる部分ではありますが例外のようです。

上記の画像の場合、トゲが見えていてグラグラしていたら、それは予兆になるので、プレイヤーは推測や試行錯誤で楽しむことができます。

 

5.失敗した理由を分かりやすくする。

a07
トゲに刺さってプレイヤーは死ぬ。

よく分からないまま失敗すると、プレイヤーは「もう一回やってみよう」ではなく、「よくわからなくて、つまらない」となってしまいます。エフェクト、効果音などを駆使して、失敗した理由を分かるようにして、「これをやればいけそうだ!」と挑戦させるようにしなければなりません。

 

ここまでを踏まえてチュートリアル・ステージを作成。

 

弾丸を撃つのとジャンプをするだけのプレイヤーと、ジャンプするだけの敵を作成して、シンプルな2Dプラットフォーマーを作成しました。

009 010 011 012 013

チュートリアル・ステージは全然面白くありません。しかし、レベルデザインを学習したことにより、言葉でレベル(=場)の流れやそこにオブジェクトを配置した動機や理由を説明できるようになりました!

このサンプル・プロジェクトには、コインなどの報酬やスコア、ハイスコアなどがないため、リスクとリターンなどのゲーム性をまだ追加する必要があります。

 

このプロジェクトの配布

Unity5.4

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

まとめ

レベルデザインを学習して、実際にチュートリアルステージを作ってみました。漠然とオブジェクトを配置するだけではなく、意図を持ってオブジェクトを配置できるようになったのは自分の中でとても大きいです。あとは、ステージをもう少し継続して作っていきながら、3Dゲームにつなげていきたいです。

物質自体に色はない?

Unityのマテリアルチャートをみると、プラスチックなどの非金属の場合は、sRGBは、50-243の範囲で使うとあります。今まで0-255でやってきた値と異なります。そこで、色とは何かを調べてみたのですが、ccs-inc.co.jpの記事がとても分かりやすく、光源と物体と目の関係を説明してくれていました。イチゴを青色LEDで見ると、かなり黒くなっているのはとても新鮮な感覚で見ることができました。

また、UnityのマテリアルのAlbdoも、その色を反射する値と考えれば納得できそうです。

https://docs.unity3d.com/jp/current/Manual/StandardShaderMaterialCharts.html

http://www.ccs-inc.co.jp/s2_ps/s1/s_04/column/light_color/vol11.html

http://www.ccs-inc.co.jp/s2_ps/s1/s_04/column/light_color/vol12.html

http://illustrator-ok.com/illustrator_koza/color/contents/color1.html

 

Unity5のライティング学習資料

Unity5では、PBS(Physical Based Shading,物理ベースシェーディング)や光を焼く(Bake)という仕組みがあり、単純に色はRGBで0-255で指定すればよいというものではありません。またマニュアルを読んで設定項目を読んでもいまいち知識がないため消化不良になってしまいます。

Unityのライティングの学習 Part1 を作成して、自分用の実験用プロジェクトが作成できたので、設定項目の意味が分からないながらもスライダーを調節して、[Build]を行って、影響をシーンビューで判断できるところまで来ました。またいろいろ試すことで、Unityエディター上でどこに項目があるかも分かってきました。

此処までで様々なライティングのキーワードが分かったので、Google検索でさらに情報を入手できるようになりました。公式でグラフィックスについていくつかセッションがあるので、確認してさらに知識を深めようと思います。

Unityとアセットツールで学ぶ「絵づくり」の基礎(ライト、シェーダー、イメージエフェクト)

http://japan.unity3d.com/unite/unite2016/schedule

上記URLに、PDF資料もあり、駆け足ですが多くの事が説明されています。私のような初心者ははっきり言ってわからないことだらけですが、コーネルボックスを作って実験していけば、また知識が付くと思うのでやってみます。

 

[Unite 2015 TOKYO]Unity 5グラフィックスガイド 実践編

110分という長い動画ですが、これを見ることで全体像が掴めそうです。私のようにUnityの入門書を買わずに行き当たりばったりで学習している人は一度見たほうが良いかもしれません。

その他、グラフィック関係の動画。

 

http://tongullman.blogspot.jp/2015/05/unity5.html

Unity 5 Lighting Cookbook

 

Unityのライティングの学習 Part3

Unityのライティングの学習 (Part1, Part2)で、GIを設定するための基礎知識を学び、また自分で試行錯誤するためのサンプルプロジェクトを作成しました。今回は、このサンプルプロジェクトに実際に各種設定を行い、GIを体験しましょう。

まずは、Part1で学んだ以下を再確認しましょう。

  • GIは、反射光を考慮します。
  • GIは、初期設定で有効です。
  • GIは、静的オブジェクトが対象なので、チェックが必須。
  • GIは、焼き作業が重いので、Resolutionパラメータを要調整。
  • Lithtオブジェクトは、とりあえずmixedに

手順としては、動かないプリミティブをすべて静的オブジェクトにします。次に、Resolutionパラメータを小さくしておきます。最後にLightをmixedにします。

1.プリミティブオブジェクトを静的オブジェクトにします。

プリミティブオブジェクトを選択して、右上の[Static]にチェックを入れるだけです。

 

001
複数選択して、Staticにチェックを入れている例

2. Resolutionパラメータを小さくします。

メニュー->Window->Lighting(下から6番目ぐらい)を選択して、Lightingタブを表示して、Precomputed Realtime GIとBaked GIのResolutionを0.5~1ぐらいにします。

002

初期設定では、[Auto]チェックボックスにチェックが入っているので、自動で焼き処理が開始されます。遅い場合は、[Auto]のチェックを外してキャンセルしてしまいましょう。そしてResolutionを調整し、[Build]するか、[Auto]のチェックを付けましょう。

003

 

3.LightのBakingをmixedにします。

2をやった時点ですでにGIはできています。そのためこのBaked GIにかかわるこの設定はどういう意味か私自身もう一度調べる必要があります。いずれにせよ、一度mixedにしてみましょう。ポイントライトとDirectional Lightの両方に以下設定をしました。

004

 

4.Lightingタブ

現在のLightingタブです。

006

結果

赤い箱に近い地面の色は赤くなって、青い箱の近くの地面の色は青くなっています。

005
GIができた!
007
立方体が微妙な色になっている。

ただ、解像度が低い設定影響か分かりませんが、立方体の黒い影が微妙な色合いでした。とはいえ、今後設定項目を調べていけばよい話なので今回はこれで良しとしましょう。

このプロジェクトの配布

Unity5.4

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

まとめ

3回にわたりGI(Global Illumination、グローバル・イルミネーション)の基礎から実際に試行錯誤できるプロジェクトを作成しました。今後は、公式マニュアルとGoogle検索を活用して、設定項目の意味を調べていきましょう。

Unityのライティングの学習 Part2

今回は、GIを適用する前のポイントライトを1つ、キューブをいくつか並べた単純なプロジェクトを作成します。

401

FPSコントローラーでFPS視点で動かせるようにします。

プロジェクトの新規作成

001

スタンダード・アセットのCharactersをインポート

002

003

PlaneをScale(100,1,100)で作成。

004

FPSControllerがカメラを持つので、Main Cameraを無効化

005

Standard Assets/Characters/FirstPersonCharacter/Prefabs/FpsControllerをシーンにドロップ。適当に初期Y座標を設定。

_001

壁の作成

Create Emptyで、’Walls’を作って、その中に6面をCubeで作成します。隙間が空いていなければよいので大きさ、位置は適当でよいです。

007_top007_forward007_back  007_left 007_right007_bottom

プリミティブの作成

特に細かいルールはありません。

101 102 103 104 105 106 107

Materialを作成して割り当て

https://docs.unity3d.com/jp/current/Manual/StandardShaderMaterialCharts.html

Unityは、物理ベースシェーディング(Physical Based Shading,PBS)です。物理ベースレンダリングと呼ぶ場合が多いようです。これは色を付けるときに、金属か非金属(布、プラスチックなど)を考慮します。

そのため、Materialは非金属の場合、sRGBの範囲は50-243です。0-255ではありません。金属の場合は、186-255になります。上記チャートのsRGB RANGEという部分に記述されています。

201

スフィアにSilverを割り当て、キューブにRed,Blue,Greenを割り当て、他はWhiteマテリアルを割り当てました。

Silverの作成方法

公式マニュアルのチャートにSILVERが用意されているので、Albedoスポイトでシルバーを指定しましょう。

203

202

Red,Green,Blue,Whiteは、Materialは非金属で、sRGBの範囲は50-243で作成します。Redの場合、RGBAは(243,50,50,255)になります。

204
非金属のsRGBの範囲は50-243

ポイントライトの作成と調整

301

またDirectional Lightの位置は以下にしました。この値に特に理由はありません。

302

最後にグループ化したWallsをY,Z軸を5にしました。これも特に理由はありません。

304

最終的にできたもの

401

 

このプロジェクトの配布

Unity5.4

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

 

Unityのライティングの学習 Part1

初心者向けのUnity5のGI(Global Illumination,グローバル・イルミネーション)のチュートリアルです。GIは仕組みや用語が複雑なため、はじめて使ってみる場合には取っ掛かりが必要になります。そこでこのチュートリアルでは、細かい設定は後回しにして、まずはGIのサンプルプロジェクトを作るところからはじめます。

私は、UnityのGI(=Global Illumination、グローバル・イルミネーション)を調べ始めましたが、公式マニュアルだけを読んでいると、いろいろな知識が必要になり初心者には使えないと感じました。しかし、用語をメモ帳で整理しながら調べていくと、まずは動かせるプロジェクトを用意して、そこでパラメータを試行錯誤しながら、公式マニュアルで、パラメータの意味を調べていけば、学習できそうなことが分かってきました。

このチュートリアル(Part1)では、GIを動作させるための最低限の基礎知識を学んだ後に、実際に簡素なプロジェクトを作ります(Part2)。細かいパラメータはひとまず後回しにしています。

Part2で、実際に動かせるプロジェクトを用意します。サンプルプロジェクトを完成させることで、ただ公式マニュアルで設定項目の説明を読むだけから、設定項目を自分で試行錯誤できるようになります。こうなれば、実際のプロジェクトの動作から、視覚的に各種設定項目を理解しやすくなります。

このように、学習のきっかけさえ掴めば、初心者でもGIを学んでいけます。それではやっていきましょう。

GI(Global Illumination,グローバル・イルミネーション)とは

Unity5にはGI(Global Illumination,グローバル・イルミネーション)が使えます。GIは反射光の計算をします。以下、画像を見てください。1枚目がGIが動いていない画像で、2枚目がGIが有効になっている画像です。

001
Unity初期設定で、GIは動いていない
002
GIが有効

2つの画像は、中央の円柱の下にポイントライトが配置されています。上の画像の場合、赤い箱に当たり反射して地面に写った光は、赤い箱の影響を受けていないため、白い光のままです。下の画像の場合は、赤い箱に当たり反射して地面に写った光は、赤い箱の影響を受けて、ほのかに赤くなっています。

003
GIを有効にして、青箱の上でジャンプ

上記画像は、GIを有効にして、青箱の上でジャンプした時にキャプチャーした画像です。赤、青、緑の各箱に光が当たり、それが反射して地面に写った場合は、箱の影響を受けて、色が変化しています。GI(=Global Illumination、グローバル・イルミネーション)とは、この光が反射したときの色を考慮する仕組みです。

Part2で実際にこのプロジェクトを作成します。つまりPart2で、どのようにすればよいかという知識を学びます。ただ、GIはとても複雑なので、このPart1で「何が」に当たる知識を学びます。

初期設定でGIは有効化されています。

以下の画像を見てもらえばわかるように、Lightingタブ(メニュー->Window->Lighting)を開くと、いろいろなGIの項目があります。公式マニュアルに各項目の説明がありますが、初心者がこれを読みこなすのは困難なため、まずはとっかかりが必要と思われます。

005

Unityの初期状態では、上記のLightingタブのように、「Precomputed Realtime GI」「Baked GI」「General GI」のすべての項目にチェックが入っています。そして、「Auto」チェックボックスにチェックが入っているので、初期設定でGIは有効化されています。

TODO: Precomputed Realtime GI, Baked GIの違いを説明.

GIを使うには静的オブジェクトにする必要があります。

ただし、GIを使うには対象を静的オブジェクトにする必要がありますが、立方体などのプリミティブを配置しただけでは静的オブジェクトのマークがされません静的(=Static)にするのは簡単で、以下の画像のようにInspectorタブで、Staticにチェックを入れる必要があります。

006

 

GIは光を焼く(Bake)作業が必要

GIは、反射光を計算しなければなりません。これには膨大な計算が必要なためリアルタイムで計算するのではなく、あらかじめ計算しておいてその情報を実行中に参照することになります。

光を焼く(Bake)作業が必要ですが、Lightingタブで「Auto」チェックボックスにチェックが入っている場合は、オブジェクトを動かした後に自動で焼く作業が開始されます。チェックが入っていない場合は、自分で「Build」ボタンを押して光を焼く必要があります。

Bakeはとてつもなく重い!

007

Bake作業はとても重い作業です。初期設定だと30分で終わらないかもしれません。[Auto]にチェックが入っていると、オブジェクトをちょっと動かすごとにBakeが開始されて、計算が終わらないため、ライティングが変な状態のままになってしまう場合があり、開発中はとてもストレスがたまるようになります。

これを回避するには、Realtime Resolutionを0.5、Baked Resolutionを0.5ぐらいにすると、ライティングの精度はあまりよくありませんが、ひとまずいままで通りに開発できます。もっと下げてみたり、Precomputed Realtime GIまたはBaked GIを無効にしてみるのもよいかもしれません。

Lightオブジェクトはひとまずmixed

公式マニュアルには、LightのBakingの説明として以下の説明があります。

Directional Lightや自分で用意したポイントライトには、以下のようにBaking項目で、Realtime, Baked,Mixedのいづれかを指定できます。Lightingタブで、Baked GIにチェックを入れている場合、このLightオブジェクトを焼き作業の対象にするかしないかの設定のようです。ひとまずMixedにしておけば大丈夫そうです。

008

 

いままで学んだことのまとめ

  • GIは、反射光を考慮します。
  • GIは、初期設定で有効です。
  • GIは、静的オブジェクトが対象なので、チェックが必須。
  • GIは、焼き作業が重いので、Resolutionパラメータを要調整。
  • Lithtオブジェクトは、とりあえずmixedに

まとめ

細かい設定項目は、今後調べて身に着けるとして、ひとまず、自分でGIを試してみて、そこから知識を広げるための最低限の知識を学習しました。次回は簡単なプロジェクトを作成します。

 

Unityで雪パーティクルエフェクトを作成しましょう。

Unityにはパーティクルシステムがあるので、Unityエディター上でパーティクルを作成できます。設定項目が多いので、項目はたくさん作って覚えていくしかありませんが、雪のパーティクルはいろんな項目を使って作れるので初心者に最適です。

まずは作ってみよう。

hierarchyビューで、右クリックして、Particle Systemでオブジェクトを作成します。パーティクルはデフォルトが横向きなので、Rotate Xを-90にしておきます。

hierarchyビューで右クリックして、ParticleSystemを選択
hierarchyビューで右クリックし、ParticleSystemを選択
Rotate Xを-90
Rotate Xを-90

Particle System

基本設定はいろいろ修正しても問題ありませんが、Gravity Modifierで、重さが決まるので、ここをいろいろ調整しましょう。ふんわりした感じがほしいのでひとまず0.13にしました。

001

Emission

Rateは一度に降る量です。

002

この項目を増やすときは、1つ注意が必要です。Sceneビューで以下のようなダイアログがあるので、Pause(一時停止)またはStop(停止)をしてから修正しましょう。例えば、30から間違えて3万にした場合、かなり強力なPCでないとUnityがフリーズ状態になり数分しないと応答が返ってこない状態になります。

012

Shape

Radiusで、この円内に雪を降らせます。

003

Velocity over Lifetime

生存時の速度。以下のように、X,Y,Zの速度調整ができます。前後左右にゆらゆらしたいので、XY座標はある一定のランダムの値を取らせたいです。そのような場合は、右の▼をクリックして、Random Between Two Curvesを選択します。

004
▼で、Random Between Two Curvesを選択

画面右下に、以下のような曲線(Curve)が表示されます。線上で、右クリックで、Add Keyを表示して追加するか、線上でダブルクリックをすると、キーが用意されます。これはキーボードのDeleteキーで削除できます。

005
右クリックして、コンテキストメニューからキーを作成できる。

このキーを上下左右に動かす事で曲線を作成します。

a03
曲線を作成している様子

X座標は、この上部、下部の2つの曲線内の値をランダムに取るため、雪が左右に揺れることになります。Y座標も同様に適当に曲線を用意します。

006

 

Color over lifetime

生存時の色。カラーバーをクリックすると、以下のGradient Editorが表示されます。画像の赤枠内はアルファチャンネルで、クリックすると矢印が追加されます。Deleteキーで削除できます。矢印を用意したら、Alphaを0-255に設定します。

今回は設定しませんでしたが、画像の緑枠内は、カラーで、ここもクリックして矢印キーを追加して、Deleteキーで削除できます。こちらの矢印を選択するとカラーが表示されるので、そこから色を変更できます。これにより、白から赤へのグラデーションなどを作成できます。

007

Size over Lifetime

生存時の大きさ。これも雪のふわふわした感じを作るために、2つの曲線で適当にキーを用意して作ります。

008

Rotation over Lifetime

生存中の回転。雪のテクスチャに大きな結晶画像などを使う場合は、Random Between Two Curvesで、いろんな動きにすると面白いはずです。今回はCurveで1つの曲線に適当にキーを用意しました。

009

Collision

今回はPlanesに何も指定してませんが、ここに対象を指定したりするとそこでとどまったりします。例えばGroundを用意してそのオブジェクトを指定すれば、そこに衝突します。Bounceは小さくしないと、ボールのように跳ねてしまいます。

010

Renderer

Materialで任意のマテリアルを設定できますが、今回は初期設定のままです。

011

完成

a05

 

公式ドキュメント

Unity パーティクルシステム(Shuriken)

このプロジェクトの配布

Unity5.4

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

まとめ

今回は、細かい説明をせずに、まずは作ってみました。パーティクルシステムは項目が多いため、人が作ったものを自分で同じように複製して見たり、繰り返し項目を変更していくと自然と項目がわかってきます。スタンダードアセットの爆発パーティクルなどは複数のパーティクルを組み合わせて1つの爆発にしているので非常に参考になります。

Unityで雪のパーティクルを作成する時のおすすめチュートリアル

最近Unity5のパーティクルを少しづつ勉強し始めました。手始めに雪のパーティクルを作成しましたが、以下動画が11分ぐらいで、設定項目を説明しているので大変参考になりました。近いうちに、このチュートリアルの解説と、作成した雪パーティクルのプロジェクトを配布しようとおもいます。

 

Unityのイメージエフェクトを分かりやすく視覚化したプロジェクト

イメージエフェクトは劇的な変化をもたらす

Unity5には、イメージエフェクト(Image Effects)という機能が無料で用意されています。これはカメラの被写界深度やブラー効果などです。また煙などのパーティクルもスタンダード・アセットとして公開されています。今回は、イメージエフェクトやパーティクルを画面上のチェックボックスで、有効化、無効化できるプロジェクトを作成しました。

以下の2つの画像は、上部がUnityエディターのSceneに表示されている画像で、下部の画像が、実際のゲーム画面で表示されるものです。

UnityエディターのSceneに表示されているシーン
UnityエディターのSceneに表示されているシーン
イメージエフェクトで劇的な変化をもたらすことができる!
イメージエフェクトで劇的な変化をもたらすことができる!

イメージエフェクトを適用前の画像は、地面が白いため、木や草が唐突に生えている感じがします。また、ロボットのキャラクターはアニメ風のテクスチャーなので、統一感がありません。

イメージエフェクトを適用後の画像は、夜にして各オブジェクトの違和感をなくし、色の調整や、ぼかし、画面端を暗くしたり、霧で遠くが白くするようにしたり様々な効果で、上手くごまかしています。

TODO:別途チュートリアル記事を用意して、ここにリンク張る。

イメージエフェクトは簡単!

イメージエフェクトはプログラミングではなく、カメラへの設定です。やり方を知っているか知らないかです。別記事でチュートリアルを作成しますが、実際は以下のようにカメラにコンポーネントを追加して設定します。

003
カメラにイメージエフェクトの各種コンポーネントを設定(このプロジェクトようにenabled=falseにしている)

上記のように複数のイメージエフェクトを追加したら、設定項目が多すぎて困惑するかもしれませんが、大丈夫です。私も設定方法分かりません。適当にスライダーを動かして、先ほどの暗闇の森の画像を作成しました。コンポーネントはうまくいかなければ削除すればいいだけなので、とりあえず試してみるのが良いです。

試してみてから公式マニュアルを見てみよう。

イメージエフェクト公式マニュアル を見てもらうと分かりますが、イメージエフェクトはかなりの種類があります。でもアンチエイリアスや、Blur(ブラー)や、Depth of Field(背景のぼけ)は聞いたことがある人も多いと思います。

イメージエフェクトの種類はかなりある
イメージエフェクトの種類はかなりある

とりあえず使ってみて、日本語のマニュアルがあるので、少しづつ設定項目の意味を理解していけばよいです。

このプロジェクトの配布

Unity5.4で作成。

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

※125MBあります。このプロジェクトを作るときに、木を作成するため、スタンダードアセットのEnvironmentパッケージをプロジェクトに追加しました。この時にEnvironmentパッケージを全部入れたので、Waterフォルダーも追加されました。どうやらこれは100MBぐらいあるようで、これが原因でファイルが大きくなってます。

 

 

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でアニメーションを作成しました。