⑥アイテム獲得で数秒間「無敵状態」になる方法

数秒間、敵の攻撃を無効化する方法。

(考え方)

敵の攻撃が当たっても、HPが減少しないようにする。そのためのロジックを考える。

1)無敵アイテムを作成する

・色、形、大きさは自由です。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-12-14-17-07

・「Muteki 」スクリプトを1つ作成。下記のコードを記載しましょう。

・コードのチェックが完了したら「Muteki 」オブジェクトにドラッグします。

*「音」と「エフェクト」は自由です。

using UnityEngine;
using System.Collections;

public class Muteki : MonoBehaviour {

	// エフェクトのデータを入れる箱
	public GameObject effectPrefab;

	// 音のデータを入れる箱
	public AudioClip mutekisound;

	void OnCollisionEnter(Collision other){
		if(other.gameObject.CompareTag("Player")){
			AudioSource.PlayClipAtPoint(mutekisound, transform.position);
			Destroy(gameObject);
			GameObject effect = Instantiate(effectPrefab, transform.position, Quaternion.identity)as GameObject;
			Destroy(effect, 0.5f);
		}
	}
}

2)無敵状態を作る

次は無敵状態を作ります。

「TankHealth」スクリプトをダブルクリックして開きましょう。この中に、★無敵(追加)の部分のコードを追加しましょう。

*今回のロジックの肝は「isMuteki = false」「&& isMuteki == false」「isMuteki = true」にあります。このロジックの意味を考えてみましょう。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class TankHealth : MonoBehaviour {
	public GameObject effectPrefab1;
	public GameObject effectPrefab2;
	public int tankHP;
	public Text tankHPLabel;
	private Slider slider;

	// ★無敵(追加)
	private bool isMuteki = false;
	public GameObject barrier;


	void Start(){
		tankHPLabel.text = "" + tankHP;

		slider = GameObject.Find("TankHPSlider").GetComponent<Slider>();
	}
		
	void OnCollisionEnter(Collision other){

		// ★無敵(追加)
		if(other.gameObject.CompareTag("Muteki")){
			isMuteki = true;
			barrier.SetActive(true);

			// ここがポイント(意味を考えよう)
			Invoke("TankStatus", 10);
		}


		// ★無敵(elseと&& isMuteki == falseを追加)
		else if(other.gameObject.CompareTag("EnemyShell") && isMuteki == false){

			tankHP -= 1;
			tankHPLabel.text = "" + tankHP;

			slider.value = tankHP;

			if(tankHP > 0){
				GameObject effect1 = Instantiate(effectPrefab1, transform.position, Quaternion.identity) as GameObject;
				Destroy(effect1, 1.0f);
				Destroy(other.gameObject);
			} else {
				GameObject effect2 = Instantiate(effectPrefab2, transform.position, Quaternion.identity) as GameObject;
				Destroy(effect2, 1.0f);
				Destroy(other.gameObject);
				gameObject.SetActive(false);
				Invoke("SceneChange", 3.0f);
			}
		}
	}
		
	void SceneChange(){
		SceneManager.LoadScene("GameOver");
	}

	// ★無敵(追加)
	void TankStatus(){
		isMuteki = false;
		barrier.SetActive(false);
	}


	public void AddHP(int amount){
		tankHP += amount;
		tankHPLabel.text = "" + tankHP;

		slider.value = tankHP;
	}
}

3)半透明バリアの作り方

・Tankの子供として「Cube」を作成。名前を「Barrier」に変更

*「Box Collider」のチェックは外す。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-12-14-39-45

・AssetsでMaterialを1つ作成。名前を「Barrier」に変更。

・「Rendering Mode」を「Fade」に変更(ここがポイント)

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-12-14-42-56

・Colorパレッドの「A」の部分を左にスライドさせると、半透明になります。

*A=alphaの頭文字(色の透過度を表す)

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-12-14-46-20

・最後に半透明になった「Barrier」オブジェクトをドラッグ&ドロップすると完成です。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-12-14-49-59