C++11/14のalgorithmとfunctionalで、階乗やフィボナッチ数列を作る

C++11/14では、algorithmヘッダーで関数型APIが用意され、functionalヘッダーでラムダ記法も可能です。今日は他の言語ではmap関数として用意されているtransform関数を使ったり、階乗やフィボナッチ数列を作ってみました。

ラムダ式内で再帰的に関数を使う場合は、型推論のautoで作るとうまくいかないようです。function<int(int)> fのように明示すれば問題なく実行できます。またキャプチャーも参照[&]にする必要があります。

 

VisualStudio2017でBoost1.64.0を使う方法

Boost1.64.0は、シグナルというイベント通知やObserverパターンと同様な機能があるので、VisualStudio2017で使ってみました。

Boostの基本的な機能はヘッダーに実装が書かれているため、ヘッダーを読み込むだけで使えますが、シグナルは、Boostをビルドする必要がありました。ですがVisualStudio2017の開発者プロンプトで問題なくビルドできました。

Boostのビルド

bootstrap.batの実行

「Developer Command Prompt for VS 2017」を検索し、コンソール版のコンパイル環境を起動します。BoostをZIP展開したディレクトリーに移動して、bootstrap.batを実行します。これでビルドするためのb2.exeが作成されます。

b2.exeを実行してビルドする

ビルドが成功すると、stage\lib配下に、libファイルが作成されます。また、以下のようにインクルードバスとライブラリーパスの設定方法が表示されるので、VisualStudio2017で設定します。

 

サンプルソースコード

boostjp.github.ioを例にシグナルを使うサンプルを実行してみました。

 

これで自分でObserverパターンを書かずに、実績のある通知機能を使えるようになりました。

 

 

Unity5で魔法陣を作ろう 基礎編 チュートリアル

お手軽魔法陣!
お手軽魔法陣!

Unityのパーティクルシステムは、設定項目が多いので項目を覚えるよりも、よくある仕組みを実際に作ってみながら覚えたほうが効率が良いです。今回は、パーティクルが螺旋で動く魔法陣を作成します。

仕組みは簡単

  • この魔法陣の仕組みは実は簡単です。
  • Worldの影響を受ける柱パーティクルを2つ用意する。
  • 魔法陣テクスチャをドロップして、魔法陣オブジェクトを作る。
  • 魔法陣オブジェクトの子要素として、柱パーティクルを配置する。
  • 魔法陣オブジェクトをアニメーションで回転させる。

作成チュートリアル

作成方法が分かったので実際に実装してみましょう。

magiccircle
Inkscapeで512×512で背景透過で作成したpng画像

 

プロジェクトの作成

まずは、ParticleSpiral02など適当な名前3D用プロジェクトを新規に作成します。そして、フォルダーをいくつか作成して、上記の画像などをTexturesフォルダーに配置します。上記魔法陣の画像は、背景透過のpng画像です。(このブログでは、透明の画像で魔法陣の線が白のため何も見えなくなるので、CSSを黒くしています。)

001

画像は、Texture TypeがTextureになっているので、[Sprite (2D and UI)]にして[Apply]で適用します。

002

Cubeを作成し、先ほどのMagicCircle画像をシーンにドロップします。

003

MagicCircleのRotationをx:90にして、Cubeの子要素にします。

004

色は、Sprite RendererコンポーネントのColorで変更できます。そもそも魔法陣の画像をライトグリーンにしてしまう方法などもあります。画像を白にしておくと、Unity側でいろんな色のパーティクルと組み合わせやすいです。

005

 

ぽわぽあしているパーティクルの作成

まずは魔法陣の近くのホタルのようなぽわぽあしたパーティクルを作成します。新たにParticle Systemを作成し、Particle Systemモジュールの各種値を変更します。

006

また、最後にフェードアウトするように小さく消えてほしいので、[Size over Lifetime](=生存期間中のサイズ)モジュールにチェックして、曲線を編集します。

007

実際に使ってみてもらえば分かりますが、ダブルクリックで点を新規に作成してそれを動かすことで曲線を動かせます。また右クリックから点の削除も可能です。

a07

この図の見方は、横軸が時間で、0.0から1.0で表現しています。つまり一番左がParticleSystem開始時で、一番右が終了時になります。縦軸はSizeを0.0から1.0で表しています。よって、上記曲線の場合は、開始時に1=100%の大きさで、終了時に、0=0%の大きさになるが、大きさは曲線の変化によって徐々に小さくなるようになります。

008

例えば、一番右の点を、縦軸の1.0に持ってくると、上記画像のように直線になります。この場合は、開始から終了まで、Sizeが1.0なので小さくなっていきません。実際に何回も試してみましょう。

a08
ぽわぽわパーティクルができた!

柱パーティクルの作成

010

Duration 放射する時間 1秒

Start Lifetime 生存期間 1秒

Start Speed 放射する速度 4

Simulation Spaceは、Worldに変更すると、移動したときにパーティクルが揺らぐようになります。魔法陣を回転させると、パーティクルも螺旋を描くようになります。

Emissonモジュールで、一度に放射する量を調整できます。Rate 100の場合は、一回に100個のパーティクルを放射します。

 

009

Shapeモジュールで、放射する形を変更します。初期設定では、コーン型(メガホンのような形や、傘のついた街灯)なので、Angle角度と、Radius半径を小さくして、棒状に放射するようにします。

最後に、[Size over lifetime]で、開始時のサイズを小さくし、途中大きくし、終了時に小さくするようにします。もう少し綺麗に変形すればろうそくの火のような感じにもできます。

これで柱パーティクルが1つ出来たので、コピーして位置を変更してもう1つ作ります。

011
テスト用にParticleSystemモジュールのLoopingをチェックして柱2つを表示

魔法陣を回転させる。

これはParticleSystemの仕組みではなく、単純なUnityのアニメーションです。

012

Animationビューを表示して、HierarchyからMagicCircleを選択すると、[Create]ボタンが表示されるので、これでアニメーションを作成します。

013

[Add Property]ボタンでRotationを選択して、1:00(終了時)を360の倍数にします。今回は360*2 = 720にしました。

014

これで、螺旋を描くパーティクルが作成できました。この時点でゲームをプレイしてみると、起動と同時にアニメーションが実行されるのが確認できます。最後にボタンをクリックしたときに発動するようにしてみましょう。

ボタンをクリックしたときに魔法を発動させる。

ボタンを押したときに、魔法陣を回転させて、パーティクルを一斉に起動したいのでC#スクリプトで制御します。これはMagicCircleオブジェクトの親のCubeに割り当てます。

016

ボタン作成

Hierarchyビューで右クリックして、[UI]->[Button]でボタンを作成します。

015

ボタンのクリック時にMagicCircleスクリプトのDoMagicが実行されるようにします。

017

アニメーション遷移の修正

018
状態遷移の完成図

まだ、Waitアニメーションがないため新規に作成します。これは何もしないアニメーションで、”DoMagic”トリガーが実行されるまでここで待機するために用意します。作り方は簡単で、MagicCircleオブジェクトをHierarchyビューで選択して、[Create New Clip…]で作成します。以下のGifは既にWaitアニメーションを作成した後に、キャプチャーしたので、リストにRotate,Wait,Create New Clip…と並んでいますが、まだ作っていない場合は、リストにはRotate, Create New Clip…となっています。

a09

[Add Property]でPositionなどなんでもよいので選択して追加します。ただ待機用に用意したので値は変更しません。

019

トリガー作成

a10

トリガーは銃の引き金と同じで、これを実行するとアニメーションを実行するようにするフラグにします。C#スクリプトでは、GetComponent<Animator>().SetTrigger(“トリガー名”);のようにすれば、スクリプトから操作できます。そのためボタンを押したタイミングでこのスクリプトを実行すればアニメーションを動かせます。

上記のGifでは、新規にHelloTriggerトリガーを作成しましたが、DoMagicトリガーを新規作成すればよいです。

[Set as Layout Default State]により、起動時にWaitアニメーションが呼ばれて何もアニメーションしないようにします。

a11

あとは、Waitステート、Rotateステートを右クリックして[Make Transition]を選択すると、線を引けるようになるので、上記のようにRotateからWait,WaitからRotateに遷移できるようにします。

Wait->Rotate Transitions

021

[Has Exit Time]をチェックしないと、Waitアニメーションの終了を待たずにRotateへ遷移します。またConditionsにDoMagicトリガーを指定し、DoMagicトリガーが有効になったとき、Rotateアニメーションへ遷移します。

Rotate->Wait Transitions

022

こちらは特に細かい指定は合ってもなくてもよいです。

最後に、すべてのParticle SystemのParticleモジュールの[Play On Awake*]項目のチェックを外します。これは、最初に外しておくべきですが、このチュートリアルの画像では外すのを忘れてしましました。これを外しておかないと、ゲーム開始時に必ずパーティクルが実行されてしまいます。

完成

a12

このプロジェクトの配布

Unity5.4

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

エクスプローラーからMain.unityをクリックして、Unityを起動すれば、Mainシーンが表示されます。またこの記事と箱となり、プロジェクトのボタンの位置やボタン名など若干変更しています。

 

 

 

 

unity5で魔法陣を作ろう-xoctomanx編

Unity5で魔法陣を作ろう xOctoManx編

YoutubeでxOctoManxさんが、ヒーリングスペルのパーティクルの作り方を解説している動画をアップロードしています。前から気になっていたので試してみました。これを見るまで、パーティクルで螺旋を作る方法が分かりませんでしたが、アニメーションを使って、親のオブジェクトを回転させているだけでした。

パーティクルはシンプル

003

ParticleSystemコンポーネントはシンプルで、ポイントは、Simulation SpaceをWorldにしているところだけです。これをLocalからWorldにすると、このオブジェクトが移動したり、回転すると、その移動によってパーティクルが揺れることになります。

螺旋はアニメーションで行う

001

さきほどの設定で、ParticleSystemのSimulation SpaceをWorldにしました。親となる魔法陣オブジェクトのTransform.rotationを使って回転させると、パーティクルが揺れるようになります。そのためボタンクリックなど魔法発動時に魔法陣を回転させると、螺旋状態になります。

螺旋は、魔法陣が回転しているだけ!
螺旋は、魔法陣が回転しているだけ!

基本の仕組みはこれだけで、あとはアニメーションで最初は魔法陣とパーティクルが表示されていない状態にして、0.05秒後にアルファチャンネルを100%にするなどのアニメーションを調節していきます。また、今回のパーティクルは、螺旋が2本と、星のパーティクルで、合計3つのパーティクルになります。

SpriteRendererを使わないで魔法陣を表示する方法

2Dの場合などはSpriteRendererを使ってイメージを表示しますが、MaterialをParticles/Alpha Blendedなどにして、テクスチャーを指定します。この場合はMaterialをPlaneに割り当てると、透明部分はそのまま透明になり、色が付いた部分は表示されるようになります。

002

 

このプロジェクトの配布

Unity5.4

http://hajimete-program.com/games/Unity 5 Tutorial Particle Systems 02 – Healing Spell Effect (xOctoManx).zip

 

まとめ

このチュートリアルをやるまでは、パーティクルで螺旋をどうやって実現するのか不思議でしたが実際はアニメーションを使っているだけでした。また一見複雑なパーティクル表現は、複数のParticleSystemを使っていることもわかりました。

 

Unity5.4のParticleSystemのTriggerとCollisionモジュールの使い方

Unity5.4では、ParticleSystemにTriggerモジュールが用意されました。これはTriggerオブジェクトを用意して、そこにパーティクルが入る(Enter)または出る(Exit)時などに、パーティクルを破棄(Destroy)するなどに使えます。またスクリプトでは、OnParticleTriggerが用意されていてここで処理ができます。

Triggersモジュールの使い方

1.対象となるトリガーオブジェクトを作成

単純にEmpty Game ObjectにBox Colliderなどを用意して良いですし、以下のように、Cubeを作ってもよいです。トリガーにするため、Colliderの「Is Trigger」にはチェックを入れます。またプリミティブのキューブの場合などは、中が見やすいように、Materialのシェーダーの「Rendering Mode」(Albedoカラーのすぐ上の項目です。)をFadeかTransparentにして、Albedoカラーのアルファチャンネルを低くして透明にしてます。

001

Is Triggerにチェックを入れる
Is Triggerにチェックを入れる

 

2. Particleを作成

Triggersモジュールを有効にして、先ほど作成した青箱をCollidersとして設定します。パーティクルが青箱の外にいる時(Outside)、青箱の中にいる時(Inside)、青箱に入った時(Enter)、青箱から出た時(Exit)の4つの状態があります。今回は、青箱の中に入って、出ていくときにParticleをKill設定にしています。つまり破棄されます。

以下の画像のように、透過した青箱の中に、白いパーティクルが入っていきますが、出ていくタイミングで破棄されているのがわかると思います。

003

004

005

Collisionモジュールについて

パーティクルは、緑の地面に反射させるためCollisionモジュールを有効にして、Worldの設定をしています。特に難しいことはなく、これを有効にするとパーティクルが跳ね返るようになります。まずはDampen,Bounceで、跳ね返る力を調整してみるのが良いです。

 

スクリプトで操作するには

Unity5.4では、OnParticleTriggerが用意されたので、パーティクルを放出したときから補足でき、先ほどのOutside,Enter,Inside,Exitの状態を確認して、パーティクルを変化させることが可能です。以下の公式では、Triggerオブジェクトに入ったタイミングで、色を変化させています。

https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnParticleTrigger.html

また、スクリプトを追加するオブジェクトはParticleSystemコンポーネントがあるオブジェクトになります。私の例の場合は、青箱ではなく、Particle System自身ですので注意しましょう。最初、青箱側にスクリプトを配置して動作せず戸惑いました。

今回配布するこのプロジェクトでは、OnParticleTriggerでDebug.Logのみを出力しています。

このプロジェクトの配布

Unity5.4

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

Unity5のColor構造体は、0から1の範囲で、Color32構造体が0から255の範囲を取ります。

Unity5では、UnityEngine.Color構造体とUnityEngine.Color32構造体があります。(公式) Color構造体は、floatを引数に取ります。Color32構造体はbyteで、0-255を引数に取ります。Color構造体は、0f~1.0fの値をれるもので、0f-255.0fの値を入れないように注意しましょう。

public Color (float r, float g, float b, float a);

public Color32 (byte r, byte g, byte b, byte a);

スクリプトで使う場合は、ColorかColor32か意識しましょう。

上記は、GUIのTextの色を変更するC#スクリプトです。またOutlineコンポーネント、Shadowコンポーネントの記述もあり、Outlineもランダムで変更するようにしています。

ここで、注意ですが、UnityのColor構造体は、0f~1fの値の範囲チェックしないので、new Color(255f, 255f, 0f, 0f)などのようにも記述できてしまいます。他のプログラミング言語で似たようなColorクラスなどがあって、安易に0から255の値を入れてしまうと、コンパイルエラーは出ませんがColor構造体は、1以上を1とみなすだけなので、プログラマーの意図とは異なる挙動になってしまいます。

私は、ちゃんと確認せず、Colorは0から255を取ると思っていたので、この問題解決に結構苦労しました。

OutlineとShadowの関係

001

Outlineで、テキストに枠を付けることができます。またShadowで文字の影を作れます。OutlineはShadowを継承しています。そのため以下の画像のように、TextにOutlineコンポーネントとShadowコンポーネントを用意した場合は、GetComponent<Shadow>()で、取得しようとしたときに、Outlineコンポーネントが所得されるようです。

002

回避方法としては、GetComponents<Shadow>()で、Shadow[]を取得するか、Unityエディターで順番を入れ替えることです。(順番の入れ替えについては私は検証していませんが、おそらくできるでしょう。)

 

このプロジェクトの配布

Unity5.4で作成

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

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

 

Unity5でImageEffectsをいろいろ使ってみます。

A03

Unity 5.3では、Standard AssetsにImage Effectsがあります。(公式マニュアル)イメージエフェクトで分かりやすいのは、アンチエイリアスやカメラーのブラー効果や被写界深度(Depth Of Field デプス・オブ・フィールド)などです。これをカメラに追加することで劇的な変化をもたらすことができます。このイメージエフェクトは基本的にプログラミングは必要ありません。単純にコンポーネントを追加してスライダーでみながら調整するだけでとっても簡単です。是非アプリをリリースする前にイメージエフェクトを身につけましょう。

最初の画像

以下はイメージエフェクトを設定していない場像です。

001.1
Image Effectなし

エフェクトを追加

エフェクトを順々に加えていきます。

002_bloom
Bloomで発光し、街灯の光が強くなっている。
003_b_dof
Depth Of Fieldで遠くをぼやけさせる。遠くのビルがぼやけている
004_b_dof_vaca
Vignette And Chromatic Aberration

Vignette And Chromatic Aberrationで、角が暗くなり、外側ほどブラーがかかるようになります。

005_b_dof_vaca_ccc
Color Correction Curves で色調整
006_b_dof_vaca_ccc_fog
Global Fog で霧を用意。遠くがうすい灰色で見やすくなっている。

公式マニュアルの画像を見ると、Global Fogは晴天で逆光をあてるなどでも効果がありそうです。

 

007_b_dof_vaca_ccc_fog_ssao
SSAOで、ビルと地面の影が濃くなっている。
008_b_dof_vaca_ccc_fog_ssao_edge
Edge Detectionでビルの輪郭を表示。

設定一覧

009

010

 

各種モデルについて

実際にプロジェクト内を見てもらえば分かりますが、ビルは単純にCubeを大きくしただけです。また窓や街灯はポイントライトを光を弱くして配置しただけです。街灯もCubeを細長い棒状にして、ポイントライトを地面に向けただけの単純なモデルです。

スクリプトについて

スクリプトは、Directional Lightを回転させるスクリプトと、プレイヤーにカメラを追随させるスクリプトだけです。プレイヤーの移動やプレイヤーキャラクターはStandard Assetをそのまま使っています。

このプロジェクトの配布

Unity5.4用

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

Assets/Scenes/Main.unityをUnityで開いてください。二次配布になるため音声ファイルは削除しています。(音声なくても動作するようにはしています。)

ドラッグアンドドロップのチュートリアル動画をやってみました。

マインクラフトやディアブロのインベントリーはアイテムをドラッグアンドドロップすることが可能です。将来インベントリー管理を作るときに役立ちそうなので以下のチュートリアルに挑戦してみました。このチュートリアルは30分の動画が3本で、多くの事を学べました。

この動画シリーズは90分ぐらいでUnityのGUIの基礎が分かるためお勧めです。このカードゲームで基礎を学べばインベントリー作れそうです。この動画をやると、UnityのGUIのイベントシステムとEvent Triggerを使わずC#スクリプトのみで実装する方法の基礎がわかります。学習できるキーワードとしては以下になります。

  • Graphics Raycaster
  • Canvas Group – blockRaycasts
  • Layout Element
  • Layout Group
  • Event System
  • IBeginDragHandler, IDragHandler, IEndDragHandler
  • IPointerEnterHandler, IPointerExitHandler
  • IDropHandler
  • SiblingIndex

第2回までは、基本的に言われたとおりにソースコードを打ち込んでいくだけで理解できるので問題ありませんが、第3回はカードをドラッグしたときに、その元の位置を保持する仕組みを作るため、かなり難しいです。とはいえ動くソースコードが手に入ってGUIのキーワードがたくさん分かったので、ソースコードの解析は今後の課題として、この知識をインベントリー管理に役立てたいです。

また、今回Horizontal Layout Groupを使いましたが、インベントリー管理の場合はGrid Layout Groupをうまく使う必要がありそうです。

プロジェクトの配布

http://hajimete-program.com/games/Unity Tutorial – Drag & Drop Tutorial (quill18creates) – 02.zip

 

 

 

Unity5のインベントリー作成チュートリアルの比較とやってはいけない動画

Youtubeで「unity inventory tutorial」と検索するとUnity5でインベントリー作成のチュートリアルが見つかります。ですが出版業界の人に編集してもらった動画ではないため、無駄に時間が長かったり、やってみない事には自分に合った動画かわかりません。いくつか動画の長さを調べたり、やってみたので感想を書きます。

Minecraftのインベントリー
マインクラフトのインベントリー 

やってはいけない動画

この動画に挑戦しましたがPart2で中断しました。最初は、動画一覧を見た時に、合計12個の動画で、最終更新は2015年9月、1つあたりの動画の長さも15分以内のため、自分に合ってそうなので始めてみました。

Part2で問題が出てきました。Unityは4.6からGUIシステムが新たに導入されたのですが、このチュートリアルではそのイベントシステムを使わずに、CameraをCanvas内に配置して、映し方をOrthographicにして実装していました。マインクラフトや3DゲームではPerspectiveなカメラを使うため、続きの動画はやってませんがここで中断しました。

また、当然Unity5.3では環境によってはうまく動作しないため、多くのコメントで、イベントシステムを使うべき事や、動かないという指摘がありました。よって、この動画はお勧めしません。

お勧め

インベントリー管理ではないですが、この動画シリーズは90分ぐらいでUnityのGUIの基礎が分かるためお勧めです。このカードゲームで基礎を学べばインベントリー作れそうです。この動画をやると、UnityのGUIのイベントシステムとEvent Triggerを使わずC#スクリプトのみで実装する方法の基礎がわかります。学習できるキーワードとしては以下になります。

  • Graphics Raycaster
  • Canvas Group – blockRaycasts
  • Layout Element
  • Layout Group
  • Event System
  • IBeginDragHandler, IDragHandler, IEndDragHandler
  • IPointerEnterHandler, IPointerExitHandler
  • IDropHandler

90分で現実的に学習できる時間なので、これでドラッグアンドドロップやUnity GUIの基礎を体得して、そこからキーワードなどを調べていくとインベントリーに限らずいろいろな応用ができそうです。

中途半端?

スクリーンショットがよさそうですが、動画の最後が中途半端に終わっていて、アイテム削除の方法は、最後の動画のコメントを見ろとなっています。寄付があれば動画を作ってくれるようです。

Unity 5 Tutorial: Survival Game Inventory C#(xOctoManx)

自分で実装できる人で、ワールド座標からアイテムを取得したりドロップしたい場合のテクニックを知りたい人向け。

xOctoManxのチュートリアルは、80分のチュートリアルなので実際に試してみました。このチュートリアルでは、マインクラフトのように、ワールド空間でEキーで、アイテムを取得して、インベントリーからアイテムを選択して、[Drop Button]でワールド座標にドロップすることができたので、インベントリーUIとワールド空間のやり取りが学べて良かったです。ただし、インベントリーは、アイテムの木と石を若干ハードコーディングしているので実用的ではありませんでした。インベントリーのUI上でアイテムをドラッグアンドドロップしたりする方法もないため、別途学ぶ必要があります。

このチュートリアル動画は、この動画で作ったインベントリーシステムをそのまま自分のプロジェクトに使うようなものではなく、この動画で学んだことを踏まえて自分で新たに作るためのチュートリアルでした。

 

長い

高度なインベントリーシステムを作る場合は参考になりそうですが、初心者向けではなさそうです。

まとめ

インベントリーを実装するためのYoutubeチュートリアルをいくつか見てみました。ひとりの作者の動画を参考するのではなく、できる範囲の動画をいくつかピックアップして、それを踏まえて独自に実装していけばよさそうです。