Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity8】無敵状態を実現!Layer Collision Matrix, StartCoroutine【横スクロールユニティちゃん9】

Unity5.1.0f3 Personal(2015年6月)

f:id:hiyotama:20150618122504p:plain


このコンテンツは、『ユニティちゃんライセンス』で提供されています

ユニティちゃんライセンス

前回の続きです〜


前回ダメージを食らいライフを減らすことができましたが、だいたいこういう時ってプレイヤーが点滅して一定時間無敵状態になるかと思います〜ので、それを実装していきます〜

【目標】ダメージを食らった時、一定時間無敵状態にする

①レイヤーの作成
今回はレイヤーをいじっていきます〜


レイヤーを設定するとオブジェクトとオブジェクトの衝突を有効にしたり無効にしたりできるので、今回の無敵状態を実装するのには最適です〜


まずは新規にレイヤーを作成しましょう〜Edit > Project Settings > Tags and Layersを選択し、


f:id:hiyotama:20150617183153p:plain
Edit > Project Settings > Tags and Layers


Player、PlayerDamage、Enemy、EnemyDamageの4つのレイヤーを新規に作成しましょう!


f:id:hiyotama:20150617183306p:plain
レイヤーの作成


②Layer Collision Matrixの設定
PlayerDamageレイヤーとEnemyレイヤーの衝突判定を無効にするために、Layer Collision Matrixの設定をしましょう〜


Edit > Project Settings > Physics 2Dを選択し、Inspectorビュー一番下にあるLayer Collision Matrixの、PlayerDamageとEnemyがぶつかっている部分のチェックを外します〜


f:id:hiyotama:20150617184151p:plain
今回は2Dなので、PhysicsではなくPhysics 2Dを選択


f:id:hiyotama:20150617184318p:plain
PlayerDamageとEnemyがぶつかる点のチェックを外す


③無敵状態を実装する
まずは作成したレイヤーを、ユニティちゃんとEnemy1に設定していきましょう〜


f:id:hiyotama:20150617185840p:plain
UnityChanのInspectorビューにてレイヤー設定


f:id:hiyotama:20150617185942p:plain
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コルーチンを呼び出しています〜コルーチンについては以下エッセンスをご参照下さい〜

hiyotama.hatenablog.com


コルーチンの中では、まずレイヤーをPlayerDamageに変更し、点滅処理を10回繰り返し、レイヤーをPlayerに戻しています〜


【結果】


f:id:hiyotama:20150617190040p:plain
敵キャラに向かって走り・・・


f:id:hiyotama:20150617190107p:plain
すり抜ける!


もちろんダメージは受けています〜

無敵状態で敵キャラをすり抜けたあとは、点滅している一定時間はダメージを受けません〜


それでは、今回はここまでです〜

ありがとうございました〜


【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】

【Unity開発8】タイトル・ステージ紹介・ゲームオーバー・ゲームクリアー画面を作る【横スクロールユニティちゃん13】

【Unity開発8】バーチャルパッドを付けてモバイル対応する【横スクロールユニティちゃん14】