ちゅーりんぐくんの備忘録

Unityで2Dゲームを作る~part1~

Unityで2D ゲームを作る~part1~

今回はレーザーで敵を倒すといったようなゲームを作っていきます。

 

 

 

まずはassetを用意する必要があります。アセットとはいわばキャラクターのデザインのようなものです。

アセットはunityのアセットストアやケニーhttps://kenney.nl/のようなサイトに無数に存在します。有料なものも存在しますが、無料のアセットも数多くあります。

 

 

MainCamera内のCameraのSizeを変更することでカメラの画角を広げたり狭めたりすることができる。初期設定は5になっている。

 

C#Scriptを用いてコードを書いていく。

 

~Playerの動き~

 

var

varを用いて 変数 newPosition を宣言する。なおvarの理解はまだである。newpositionには現在の座標とキーボードで入力した値を用いる。

 

Input.~の中身の知り方

方向キーを用いる際にはInput.GetAxis("Horizontal")を用いるのだが筆者はこれをよく理解していなかった。調べたところ、これはProject SettingのEditで確認することができる。

 

Project Settingの中にはInputやAudioTimeなどがあり、Inputを開くと Horizontalやverticalなどがある。

 

Input.GetAxis()

キーボードの入力に対して-1.0fから1.0fを返すHorizontalはキーボードの←→と対応していて、Verticalはキーボードの↓↑と対応している。

なおこれらの設定はProject SettingのInput内で確認することができる。

 

~移動範囲の設定~

Mathf.Clamp

Mathf.Clampで設定した以上の範囲を移動できなくなる。引数は3つ用いられ、第一引数は指定したい変数、第二引数は最小値、第三引数は最大値を設定する。

今回は以下のように設定した。これを見ると第一引数の意味がわかるだろう(一つ目のやつはX軸についての範囲設定をしたいので、第一引数にXPosを用いている)

var newXPos = Mathf.Clamp(XPos,xMin, xMax);

var newYPos = Mathf.Clamp(YPos, yMin, yMax);

 

 

gameCamera.ViewportToWorldPoint

 よくわからない

 

 

~レーザーの発射~

 

ボタンの設定

Project Settingのfire1やfire2などでキーボードのボタンを押したときのアクションを設定できる。

 

Input.GetButtonDown() 

()内のボタンが押されいていたらtrueを返す。つまりボタンを押したか押されていないかを検知する

 

 

Instatiate

新しいゲームオブジェクトをスポーン(生成)する

Quaternion.identity

 https://docs.unity3d.com/ja/2018.4/ScriptReference/Quaternion-identity.html

は回転をしないを表すもので、Quaternionで回転の意である。

 

GetComponent<>

 <>内にコンポーネントを入れる

 

 

 ~重力などの設定~

RigidBody2D

https://docs.unity3d.com/ja/2018.4/Manual/class-Rigidbody2D.html

先ほどレーザーを発射できるようになりましたが、このままでは発射したレーザーが重力によって下に落ちてきてしまう。

したがって、レーザーの重力を無重力にする必要がある。その時にこのRigidBody2Dを使用する。

このRigidBody2Dは物理演算そのものをつかさどるコンポーネント。詳しくは上記URLを参照。

 

今回は重力を司る、Gravity Scaleプロパティ

回転移動の減衰値を司るAngular Dragプロパティの値を0にする。

こうすることでレーザーを(y>0)に発射することができる。

 

~コルーチン~

https://qiita.com/fujimisakari/items/811e350cbaeb45b6165e

現段階ではshiftキーを押すとレーザーが一つ発射され連打することで複数のレーザーが発射される仕様になっている。これでは敵と対峙したときに一苦労なので、押している間はレーザーがずっと発射されるという仕様にしたい。そこで活躍するのがコルーチンである。

 

コルーチンとは通常の関数とは異なり処理を途中でで抜けて、任意のタイミングで中断部分から再開することができるものである。

yield return が呼び出されることでその地点で関数の処理が中断され制御が返される。

 

コルーチンの実装の仕方は以下の通りである。

StartCoroutine (XXX())

 

IEnumerator XXX(){

yield return ~~~~

}

 

 

~prefab化したレーザーの破壊~

現段階ではレーザーを発射した分だけレーザーのクローンが生成され、生成されたクローンは消えることなくそのまま残り続ける。

このようになる理由は発射されたレーザーがy→∞に飛んでいくからである。そこで、レーザーともう一つなにかに物理性を持たせる必要がある。

そこで活躍するのがboxcoliderである。

まずレーザーにboxcoliderを追加し、さらに画面外のy軸上に、もう一つboxcoliderを付随することでレーザーにあたり判定が生まれる。

よって当たり判定が出たらレーザーを破壊する(Destroy())というプログラムを組めば、クローンのレーザーは消えることになる。

なおあたり判定が出たときに用いられるのが private void OnTriggerEnter2D(Collider2D collision)である。

 

~敵を動かす~

レーザーゲームで大切になってくるのは敵の動きである。予測不可能な敵の動きはゲームをより楽しくさせるものとなるだろう。

敵を動かすうえでVector2.MoveTowardsが重要である

Vector2.MoveTowardsの詳細は

https://docs.unity3d.com/ja/2018.4/ScriptReference/Vector2.MoveTowards.html

に掲載されている

Vector2.MoveTowards(Vector2 current, Vector2 target,float maxdistanceDelta)

引数は3つ与えられ、第一引数にスタート地点、第二引数に目標地点を入れる。第三引数は最大距離である。

今回は目標地点をリストで用意した。

そして、もしスタート地点が目標地一致したら、リストの値をインクリメントする。このようにすることで、リストでポイント地点を設けることができ、それに向かって敵を動かすことができる。