ダメージ床の作成
前回はメソッドHurt()やDie()を切って取りあえずデモモードのような感じにはならないようにしました.しかし実際にHurt()やDie()を呼び出す部分がゲーム中にまだないため,実際にダメージを受けて死ぬようにするにはどうしたらよいかが気になるところです. そこで今回はダメージ床を作って実際にそこに乗るとダメージを受けるようにしたいと思います.
ダメージ床のスプライトの選択
ダメージ床を作成するにあたり,まずその画像素材としてのスプライトを用意する必要があります.これに適していると思われる地面から突き出た木の杭が既にアセットのTooCubeForestの中にありますのでそれを使いましょう.
"TooCubeForest"の"images"フォルダの中にForest_deco_woodenThorns Import Settingsをクリックしてその右の三角のマークをクリックします. 続いてForest_deco_woodenThorns_5をドラッグしてScene上にドロップします:
続いてこのwoodenThornsにColliderをアタッチします. 今回はBox Collider 2Dをアタッチします. 今回は衝突判定だけでなく物理的挙動も考慮に入れますので, 今までと異なり,"Is Trigger"にチェックを入れないことに注意してください.
ここまでできたらHierarchyビューから"Forest_deco_woodenThorns_5"を簡単に"woodenThorns"にリネームしておきましょう.
次にこの"WoodenThorns"にアタッチするスクリプトの制作をしましょう.
woodenThornsScript.csの作成
MyScriptsフォルダ内で新規C#スクリプトを作り,名前を"woodenThornsScript"にリネームします.
ダブルクリックで開いて,visual studioで編集します. この"woodenThorns"がダメージ床になるので,プレイヤーとの衝突判定をしなければなりません. そのためまずタグ"Player"が付いているGameObjectを探し出し,Playerとの当たり判定をし,当たっていたらPlayerにアタッチされているSimplePlayerControllerを呼び出して,メソッドHurt()を実行すればよいです.
コードは以下のようになります:
using System.Collections; using System.Collections.Generic; using UnityEngine; using ClearSky; public class woodenThornsScript : MonoBehaviour { GameObject player; SimplePlayerController playerScript; // Start is called before the first frame update void Start() { player = GameObject.FindGameObjectWithTag("Player"); playerScript = player.GetComponent<SimplePlayerController>(); } // Update is called once per frame void Update() { } private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject == player) { playerScript.Hurt(); } } }
これで取りあえずダメージを受ける床のスクリプトができましたので, woodenThornsにアタッチします.
SimplePlayerContoroller.csの修正
ただし,このままではSimplePlayerControllerスクリプトのHurt()メソッドが,private設定になっているためこのスクリプトからアクセスできませんので,"SimplePlayerController.cs"を開いて,次のように先頭に"public"の文字を追加します: "SimplePlayerController.cs"の修正箇所の抜粋
public void Hurt() //この行の先頭に"public"を入れた { anim.SetTrigger("hurt"); if (direction == 1) { rb.AddForce(new Vector2(-5f, 1f), ForceMode2D.Impulse); } else { rb.AddForce(new Vector2(5f, 1f), ForceMode2D.Impulse); } }
この修正を施したのちにCtrl + Sで保存すると今度は"woodenThornsScript"からアクセスできるようになりましたので,これをwoodenThornsにアタッチします. 続いてwoodenThornsのInspectorビューのWooden Thorns Script (Script)の中のPlayerの右にWizard Variantをドロップしてアタッチします.
ここまで出来たらPlayボタンを押して動作を試してみます:
ダメージを受けていることが分かります.
ダメージを受けるとHPが減って死ぬ設定
ただし,このままだとダメージアクションだけでいつまでたっても死にません. それでは困るので"SimplePlayerController"スクリプトでHPを導入し,Hurt()メソッドを実行するたびにHPが減るようにし,Hpが0以下になったら死ぬ,つまりDie()を実行するようにしましょう.スクリプトはこのようにします.
まず,フィールドでpublic int HP;とします. これはpublic設定のためInspectorから初期値を与えることができます:
using UnityEngine; namespace ClearSky { public class SimplePlayerController : MonoBehaviour { public int HP;// InspectorでHPの初期値を代入できるようにする public float movePower = 10f; public float jumpPower = 15f; //Set Gravity Scale in Rigidbody2D Component to 5 private Rigidbody2D rb; private Animator anim; Vector3 movement; private int direction = 1; bool isJumping = false; private bool alive = true;
続いてメソッドHurt()を次のように修正します:
public void Hurt() //この行の先頭に"public"を入れた { anim.SetTrigger("hurt"); if (direction == 1) { rb.AddForce(new Vector2(-5f, 1f), ForceMode2D.Impulse); } else { rb.AddForce(new Vector2(5f, 1f), ForceMode2D.Impulse); } HP -= 1; if (HP <= 0) { Die(); } }
以上の修正を施してCtrl + Sで保存します. 次にHierarchyビューでWizard Variantをクリックし,InspectorビューのSimple Player Controller (Script)の中のHPを例えば10にします. その状態で`Playボタンを押すとちゃんと一定以上ダメージを受けると死ぬようになります:
後はこれをPrefab化するだけでいつでも呼び出せるようになります. MyTilesPrefabsに保存しておきましょう.
今回は以上になります. 次回はこのダメージ床が動いてよりゲームらしくなるようにしましょう.