Unity全方位2Dシューティングチュートリアル9回目。宝石アイテムをつくる

「【Unity 入門】全方位シューティングを作る」というサイトのチュートリアルをやってみるシリーズの9回目です。前回は敵の種類と行動パターンを追加しました。
Unity全方位2Dシューティングチュートリアル8回目。敵の種類を追加

今回作るのはひろうと経験値が得られる宝石アイテムです。シューティングで経験値っているのかな?と思ってしまいましたが、アイテムを作る作業をUnityでどのように行うかがわかるかと思うのでやっていきます。

13.宝石アイテムを作成する

ここでやること

本家サイトでは特定のマテリアルを作ってコピーして作っているのですが、このシリーズで爆発エフェクトの作成をはしょったのでまだマテリアルを作成してません。ですのでそこからやります。

  • 宝石アイテム用のマテリアルの作成
  • 宝石アイテムのエフェクトの作成
  • 宝石エフェクトのパラメーター調整
  • 作った宝石エフェクトをPrefab化

宝石アイテムは4種類作ります。

宝石アイテム用のマテリアル作成

まだフォルダを作ってないのでProjectで「Materialsフォルダ」を作成後、Materialを作成していきます。宝石なので名前はGemにします。これを4個つくるのでGem1~Gem4という名前のマテリアルを作ります。マテリアルのinspectorで「Shader」の項目を「Unit→Transparent」にしておきます。これをしておかないとテクスチャがアタッチできません。複製はCtrl-dでできるので一個だけ作ってそれを複製するのがよいでしょう。

あとは指定の画像をアタッチするだけのちまちまとした作業なのでどんどんやっていきましょう。ここまでの作業が終わった状態が以下です。
screenshot 20181211 0233

宝石アイテムのエフェクト作成

本家ブログのとおりやっていれば爆発エフェクトを複製してつくれますが、その作業をはしょってしまったのここでつけがまわってきました。なのでいちからエフェクトを作成します。エフェクトの作成はUnityのhierarkhyからcreateをクリックして「Effects→ParticleSystem」を選択します。

ParticleSystemのパラメーターは調整する項目がやたら多く、ちまちまとした作業になるのでどんどんやっていきます。

ParticleSystem全般のパラメーター
Duration0.6パーティクルの表示時間(秒)
Loopingオンループ再生するかどうか
Strat Delay0パーティクルを再生するまでの遅延(秒)
Start Lifetime0.6パーティクルの生存時間(秒)
Strat Speed0パーティクルの移動速度
Emissionの設定項目
Rate over Time0
Bursts→Count1

Shapeのチェックをはずす
Texture Sheet AnimationにチェックをいれTiles Xに4

Renderの設定項目
Material特定のMaterialをアタッチ
Max Particle Size1
Order in Layer10

Materialに関しては4種類つくるので、それぞれのつくったマテリアルをアタッチしていきます。1個PerticleSystemをつくったらCtrl-dで複製しましょう。複製したら名前をGem1~Gem4に変えておきましょう

ここまでの状態

ParticleSystem、つまりは4種類の宝石のエフェクトがhierarkhyに作成された状態です。
screenshot 20181211 0249
これらのオブジェクトの表示位置を調整してやり再生してみるとこんな感じになります。宝石がでかいですがscaleで調整できます。
screenshot-20181211-0252

今後たくさん使うようになるのでhierarkhyにつくったGemをPrefab化します。といっても「Prefabsフォルダ」に移動するだけです。忘れずにやっておくようにします。

14.敵を倒したら宝石をおとすようにする

ここでやること

  • 宝石アイテム用スクリプトの作成
  • 宝石Prefabにスクリプトをアタッチ
  • 敵スクリプトに宝石をおとすコードを追加
  • 敵Prefabに宝石Prefabをアタッチ

宝石アイテムのスクリプトを作成する

宝石アイテムのスクリプトを作成します。名前はGemScriptにしました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GemScript : MonoBehaviour {
	public int m_exp;//取得できる経験値
	public float m_brake = 0.9f;//散らばる減速量

	private Vector3 m_direction;//散らばる方向
	private float m_speed;//散らばる速さ

	void Update () {
		//散らばる速度を計算する
		var velocity = m_direction * m_speed;

		//散らばる
		transform.localPosition += velocity;

		//だんだん減速るう
		m_speed *= m_brake;

		//宝石が画面外に出ないように制限
		transform.localPosition = UtilsScript.ClampPosition(transform.localPosition);
	}

	//宝石が出現するときに初期化する関数
	public void Init(int score, float speedMin, float speedMax){
		//宝石がどの方向に散らばるかランダムに決定する
		var angle = Random.Range(0, 360);

		//進行方向をラジアンに変換する
		var f = angle * Mathf.Deg2Rad;

		//進行方向のベクトルを作成する
		m_direction = new Vector3(Mathf.Cos(f), Mathf.Sin(f), 0);

		//宝石の散らばる速さをランダムに決定する
		m_speed = Mathf.Lerp(speedMin, speedMax, Random.value);

		//8秒後に宝石を削除する
		Destroy(gameObject, 8);
	}
}

解説したいのですが知識がないため本家コガネブログさんより詳細な解説はできません。ご了承ください

宝石Prefabに作ったスクリプトをアタッチする

宝石スクリプトを作ったら宝石Prefabすべてにスクリプトをアタッチします。するとExp(経験値)パラメーターが調整できるようになるので、適当な値に調整します。

宝石パラメーターの調整

Gem1Gem2Gem3Gem4
Exp1234

宝石をおとすよう敵スクリプトを調整

EnemyScriptに下記を追加します。

using System.Linq;
/
*
略
*
/
public GemScript[] m_gemPrefabs; //宝石のPrefabを管理する配列
public float m_gemSpeedMin; //宝石の速さ(最小値)
public float m_gemSpeedMax; //宝石の速さ(最大値)
/
*
略
*
/
private void OnTriggerEnter2D(Collider2D collision){
/
*
略
*
/
var exp = m_exp;
while(0 < exp){
  //生成可能な宝石を配列で取得する
	var gemPrefabs = m_gemPrefabs.Where(c => c.m_exp <= exp).ToArray();
	//生成可能な宝石の配列から、生成する宝石をランダムに決定する
	var gemPrefab = gemPrefabs[ Random.Range(0, gemPrefabs.Length)];
	//敵の位置に宝石を生成する
	var gem = Instantiate(gemPrefab, transform.localPosition, Quaternion.identity);
	//宝石を初期化する
	gem.Init(m_exp, m_gemSpeedMin, m_gemSpeedMax);
	//まだ宝石を生成できるかどうか計算する
	exp -= gem.m_exp;
	}		
}

いろいろ難しいですがとりあえずコピペコピペで・・・。解説できずすいません。

敵Prefabに宝石Prefabをアタッチする

この作業は畜生にだるいので、手を動かすことだけにフォーカスしましょう。敵Prefabひとつひとつに、宝石Prefabをすべてアタッチしていきます。パラメーターも調整します。(ピンクでぬりつぶしたとこ)

以下画像です
screenshot 20181211 1348

ここまでの状態

敵たおしたら宝石がでます。宝石がでかすぎですが、めんどうなのでこのままです。
screenshot 20181211 1358