経験値関連の処理【UnityでVampire survivers 風のゲームを作ろう!第11回】

Uncategorized

前回記事

今回は経験値関連の処理を行っていきます。

今回やることは
・経験値を拾ったら経験値バーの色が変わる(Scroll bar)
・レベル毎に必要な経験値を配列で決めておいて到達したらレベルアップ
・レベルアップ時の演出&ボーナス

EXPManegerを作っていきます。経験値の管理をするスクリプトです。
ヒエラルキー上で右クリック→Create Emptyを作成。
Scriptsフォルダでcreate C# Scriptを作成し、名前はEXPManegerにします。


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


public  class ExpManeger : MonoBehaviour
{
    public static ExpManeger instance;
    [SerializeField] GameObject LevelUPpanelUI;
    [SerializeField] Text LevelText;
    [SerializeField] Text ItemName;
    [SerializeField] Transform PlayerTrans;
    [SerializeField] GameObject Particle;
    [SerializeField] Text LevelUPText;
    public GamemanegerScript GMscript;
    public static int currentExp;
    public static int CurrentLv;
    int NextLevel;
    int NeedEXP;
    int CumEXP;//累計経験値
    AudioSource audioSource;
    public AudioClip getsound;
    public int[,] EXP =//レベルと必要経験値
        { { 1, 0},
        {2, 6},
        {3, 8},
        {4, 10},
        {5, 14},
        {6, 18},
        {7, 20},
        {8, 25},
        {9, 30} ,
        {10, 35},
        {11, 40},
        {12, 50},
        {13, 60},
        {14, 70},
        {14, 80},

    };
    Vector2 PlayerPos;


	public Slider EXPBar;
	public AudioClip sound;
    AudioSource audioSource;
    // Start is called before the first frame update

    void Start() {
        currentExp=0;
        CurrentLv=1;
        NextLevel = CurrentLv + 1;
	  NeedEXP =[CurrentLv,1];
        if (instance == null)
        {
            instance = this;
        }
          if (EXPBar != null)
        {
            EXPBar.maxValue= NeedEXP;
            EXPBar.value = currentExp;
        }
	audioSource = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {//今の経験値と必要経験値を比べて今の経験値が上だったらレベルをあげる
        if (currentExp >= EXP[CurrentLv, 1]) {
            Debug.Log("レベルアップ"+CurrentLv +"→"+ NextLevel);
            CurrentLv += 1;
            NextLevel += 1;
            LevelText.text = "Level:"+CurrentLv.ToString();
		StartCoroutine(LevelUP());
        }
        
    }

    private IEnumerator LevelUP()
    {
	 audioSource.PlayOneShot(sound);
        PlayerPos = Player.transform.position;
        currentExp = 0;//現在の経験値を0にする
	  EXPBar.maxValue= NeedEXP;
        EXPBar.value = currentExp;
	  var confetti = Instantiate(Particle, PlayerPos, transform.rotation);
        LevelUPText.GetComponent<Text>().enabled = true;
        yield return new WaitForSeconds(2);//コルーチンで2秒遅延
	  LevelUPText.GetComponent<Text>().enabled = false;
    }

	public void ExpBarDraw() {//経験値を拾った時にEXPorbから呼び出される
       
        CumEXP++;
        currentExp++;
        EXPBar.value = currentExp;
    }


    }

他のスクリプトから関数や変数を参照しやすくするようにinstance化しておきます。

ExpManeger instance
if (instance == null)
        {
            instance = this;
        }

Start関数でinstanceを初期化します。

続いて、経験値玉のスクリプトを書いていきます。

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

public class ExpOrbScript : MonoBehaviour
[SerializeField] Text ExpText;
public int EXP;

public AudioClip sound;
AudioSource spwnsound;
AudioSource getsound;

void Start()
    {
        audioSource = GetComponent<AudioSource>();
        audioSource.PlayOneShot(spwnsound);
    }


void Update()
    {
    }

private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.tag == "Player")
        {
            audioSource.PlayOneShot(getsound);
		Exp++;
            Exptext.text = Exp.ToString();
		ExpManeger.instance.ExpBarDraw();//経験値を拾った時に経験値バーの描画を更新する
		Destroy(this.gameObject);
        }
    }

ExpManeger.instance.ExpBarDraw();

EXPorbがPlayerに回収されたとき、EXPManegerのExpBarDrawを関数を使えるようにしました。

続いて、レベルアップした時の演出を追加していきます。効果音+光のパーティクル+文字が出るようにします。

ヒエラルキー上で右クリックCreate>Effects>Particle Systemを作成します。
名前はLevelUpParticleにします。

Transform ScaleをX1 Y0.7 Z 1にします
ParticleSyste

mのインスペクターを編集していきます。
Duration 1
Loopingの☑を外す
StartColorは53A1B4にします。
Alpha値を100にします。

EmmisionのRate over Time 30
ShapeのAngleを25
RendererのRenderModeをMeshに変えます。
MaterialをDefaulet-Lineに変えます。(パーティクルはお好みで大丈夫です。)

パーティクルを発生させた後にオブジェクトが残り続けてしまうので自動的に消滅するスクリプトを書いてアタッチしていきます。

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

public class ParticleDestroy : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine("SelfDestroy");
    }

    // Update is called once per frame
    void Update()
    {

    }

    IEnumerator SelfDestroy()
    {
        yield return new WaitForSeconds(5f);
        Destroy(this.gameObject);
    }
}

そのParticleをPrefabフォルダに入れて、Prefab化します。
PrefabフォルダからExpManegerのparticleにアサインしましょう。

次はTextを作っていきます。
ヒエラルキー上でCreate>UI>Legacy>Textで作っていきます。


名前をLEVELUPにします。

RectTransformのPosXを200 PosYを-500に設定します。Textに

L e v e l U P!

と入力してください。(ちょうどよく表示されるように文字サイズ等調整してください。)

通常時は非表示にしておきたいのでインスペクターのTextのチェックマークを外しておきましょう。
ここまで終わったらEXPManegerのインスペクターのLevelUPTextにアサインします。

あとは効果音をつけましょう。

AudioフォルダからEXPManegerのインスペクターのSoundにアサインします。
過去を思い出すの音をつかいます。

UnityでVampire survivers 風のゲームを作ろう!第1回 プロジェクトの作成 プロジェクト作成と画像の取り込み
UnityでVampire survivers 風のシステムのゲームを作成していきます。 今回は使用する画像や音声データを取り込みます。

これでレベルが上がった時の演出の実装が完了しました。

次回はレベルアップした時のボーナスと、ドロップアイテムチェストの実装をしていきます。

コメント

タイトルとURLをコピーしました