【Unity8】無敵状態を実現!Layer Collision Matrix, StartCoroutine【横スクロールユニティちゃん9】
Unity5.1.0f3 Personal(2015年6月)
このコンテンツは、『ユニティちゃんライセンス』で提供されています
前回ダメージを食らいライフを減らすことができましたが、だいたいこういう時ってプレイヤーが点滅して一定時間無敵状態になるかと思います〜ので、それを実装していきます〜
【目標】ダメージを食らった時、一定時間無敵状態にする
①レイヤーの作成
今回はレイヤーをいじっていきます〜
レイヤーを設定するとオブジェクトとオブジェクトの衝突を有効にしたり無効にしたりできるので、今回の無敵状態を実装するのには最適です〜
まずは新規にレイヤーを作成しましょう〜Edit > Project Settings > Tags and Layersを選択し、
Edit > Project Settings > Tags and Layers
Player、PlayerDamage、Enemy、EnemyDamageの4つのレイヤーを新規に作成しましょう!
レイヤーの作成
②Layer Collision Matrixの設定
PlayerDamageレイヤーとEnemyレイヤーの衝突判定を無効にするために、Layer Collision Matrixの設定をしましょう〜
Edit > Project Settings > Physics 2Dを選択し、Inspectorビュー一番下にあるLayer Collision Matrixの、PlayerDamageとEnemyがぶつかっている部分のチェックを外します〜
今回は2Dなので、PhysicsではなくPhysics 2Dを選択
PlayerDamageとEnemyがぶつかる点のチェックを外す
③無敵状態を実装する
まずは作成したレイヤーを、ユニティちゃんとEnemy1に設定していきましょう〜
UnityChanのInspectorビューにてレイヤー設定
Enemy1のInspectorビューにてレイヤー設定
それでは続いて、無敵状態を実装するため、PlayerScriptに加筆していきます〜
using UnityEngine; using System.Collections; public class PlayerScript : MonoBehaviour { public float speed = 4f; public float jumpPower = 700; public LayerMask groundLayer; public GameObject mainCamera; public GameObject bullet; private Rigidbody2D rigidbody2D; private Animator anim; private bool isGrounded; //********** 開始 **********// private Renderer renderer; //********** 終了 **********// void Start () { anim = GetComponent<Animator>(); rigidbody2D = GetComponent<Rigidbody2D>(); //********** 開始 **********// renderer = GetComponent<Renderer>(); //********** 終了 **********// } void Update () { isGrounded = Physics2D.Linecast ( transform.position + transform.up * 1, transform.position - transform.up * 0.05f, groundLayer); if (Input.GetKeyDown ("space")) { if (isGrounded) { anim.SetTrigger ("Jump"); isGrounded = false; rigidbody2D.AddForce (Vector2.up * jumpPower); } } float velY = rigidbody2D.velocity.y; bool isJumping = velY > 0.1f ? true : false; bool isFalling = velY < -0.1f ? true : false; anim.SetBool ("isJumping", isJumping); anim.SetBool ("isFalling", isFalling); if (Input.GetKeyDown ("left ctrl")) { anim.SetTrigger ("Shot"); Instantiate (bullet, transform.position + new Vector3 (0f, 1.2f, 0f), Quaternion.identity); } } void FixedUpdate () { float x = Input.GetAxisRaw ("Horizontal"); if (x != 0) { rigidbody2D.velocity = new Vector2 (x * speed, rigidbody2D.velocity.y); Vector2 temp = transform.localScale; temp.x = x; transform.localScale = temp; anim.SetBool ("Dash", true); if (transform.position.x > mainCamera.transform.position.x - 4) { Vector3 cameraPos = mainCamera.transform.position; cameraPos.x = transform.position.x + 4; mainCamera.transform.position = cameraPos; } Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0)); Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1)); Vector2 pos = transform.position; pos.x = Mathf.Clamp(pos.x, min.x + 0.5f, max.x); transform.position = pos; } else { rigidbody2D.velocity = new Vector2 (0, rigidbody2D.velocity.y); anim.SetBool ("Dash", false); } } //********** 開始 **********// void OnCollisionEnter2D (Collision2D col) { //Enemyとぶつかった時にコルーチンを実行 if (col.gameObject.tag == "Enemy") { StartCoroutine ("Damage"); } } IEnumerator Damage () { //レイヤーをPlayerDamageに変更 gameObject.layer = LayerMask.NameToLayer("PlayerDamage"); //while文を10回ループ int count = 10; while (count > 0){ //透明にする renderer.material.color = new Color (1,1,1,0); //0.05秒待つ yield return new WaitForSeconds(0.05f); //元に戻す renderer.material.color = new Color (1,1,1,1); //0.05秒待つ yield return new WaitForSeconds(0.05f); count--; } //レイヤーをPlayerに戻す gameObject.layer = LayerMask.NameToLayer("Player"); } //********** 終了 **********// }
PlayerScript.cs
Enemyタグとぶつかった時にDamageコルーチンを呼び出しています〜コルーチンについては以下エッセンスをご参照下さい〜
コルーチンの中では、まずレイヤーをPlayerDamageに変更し、点滅処理を10回繰り返し、レイヤーをPlayerに戻しています〜
【結果】
敵キャラに向かって走り・・・
すり抜ける!
もちろんダメージは受けています〜
無敵状態で敵キャラをすり抜けたあとは、点滅している一定時間はダメージを受けません〜
それでは、今回はここまでです〜
ありがとうございました〜
【Unity開発8】ユニティちゃんを表示させる【横スクロールユニティちゃん1】
【Unity開発8】ユニティちゃんを歩かせる【横スクロールユニティちゃん2】
【Unity開発8】カメラにユニティちゃんを追いかけさせる【横スクロールユニティちゃん3】
【Unity開発8】ユニティちゃんをジャンプさせる【横スクロールユニティちゃん4】
【Unity開発8】ユニティちゃんバスターで攻撃する【ユニティちゃん横スクロール5】
【Unity開発8】走っている時やジャンプ中にも弾を撃つ【横スクロールユニティちゃん6】
【Unity開発8】弾を当てて敵を倒す【横スクロールユニティちゃん7】
【Unity開発8】uGUIでライフを作り、ダメージを実装する【横スクロールユニティちゃん8】
【Unity開発8】ダメージを食らった時、一定時間無敵状態にする【横スクロールユニティちゃん9】
【Unity開発8】アイテムを取得して体力回復する【横スクロールユニティちゃん10】
【Unity開発8】敵キャラを倒した時にアイテムを落とさせる【横スクロールユニティちゃん11】
【Unity開発8】Main Cameraに映るまで敵キャラを待機させておく【横スクロールユニティちゃん12】