前回記事

今回は倒した敵がアイテムを落とすという処理を実装していきます。経験値を落とし、そのドロップアイテムに触れると回収できるという風にしていきます。
・HPが0になった時に経験値オーブを生成する(EnemyScript)
・経験値オーブに触れたとき、回収されてポイントに追加される(EXPorbScript)
という感じにしていきます。
EXPorbの画像のインスペクターを開き、Pixels Per Unitを350にします。
経験値オーブの生成
<code>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyScript : MonoBehaviour
{
GameObject Player;
Vector3 PlayerPos;
[SerializeField] StatusData statusdata;
public bool once = true;
[SerializeField] GameObject punchefect;
Vector3 punchpos;
int HP;
bool MUTEKI;//攻撃を受けるかどうかの切り替えを行う
private float currentTime = 0f;
float LifetimeCount = 0f;
[SerializeField] GameObject EXP_prefab;//☑
Vector3 diff;//プレイヤーとの距離を測るための
Vector3 vector;
private Rigidbody2D rb;
void Update(){
~省略~
if (MUTEKI)//攻撃を受けてから0.2秒後にする処理
{
currentTime += Time.deltaTime;
if (currentTime > statusdata.SPAN )
{
currentTime = 0f;
MUTEKI = false;//無敵状態終わらせる
rb.velocity = new Vector2(0, 0);//ノックバックをとめる
punchefect.GetComponent<SpriteRenderer>().enabled = false; //ヒットマーク画像を非表示に戻す
}
}
if (HP <= 0)//HPが0以下になったら消える
{
punchpos = this.transform.position;
punchpos.z = -2f;
punchefect.transform.position = punchpos;
punchefect.GetComponent<SpriteRenderer>().enabled = true;
//追加部分↓
LifetimeCount += Time.deltaTime;
if (LifetimeCount > Lifetime)
{
for (int i=0; statusdata.EXP > i; i++) {
var exp= Instantiate(EXP_prefab, transform.position, transform.rotation);
}
Destroy(this.gameObject);
}
}
~省略~</code>
続いては現在取得している経験値の数を表示するためのUIを作っていきます。
ヒエラルキー上でCreate>UI>Canvasを作ります。
Create>UI>Imageで作成し、名前をExpIconにします。
現在の経験値のアイコンとして使用します。
RectTransform(360,790,0)
Width70 Height70にしてください。

そしてCreate>UI>Legacy>Textで現在の経験値の数値を表すためのテキストを作っておきます。
名前はEXPText
RectTransform(360,800,0)
Width200 Height 200
TextSize 80にしましょう

フォントのインストール
Asssetsフォルダの下にFontsフォルダを作成します。
https://fontmeme.com/jfont/bangers-font/
Bangersというフォントをダウンロードし、インストールします。
そのファイルをFontsフォルダにドラッグ&ドロップをして、インポートします。
ExpTextのTextのFontにBangersをアサインします。

経験値の管理スクリプト
続いてExpManegerを作っていきます。現在の経験値をTextに反映させるためのスクリプトを作ります。
ExpManegerという名前のスクリプトを作成してください。
<code>public class ExpManeger : MonoBehaviour
{
[SerializeField] Text ExpText;
int Exp;
public static ExpManeger instance;
AudioSource audioSource;
public AudioClip getsound;
// Start is called before the first frame update
void Start()
{
if (instance == null)
{
instance = this;
}
}
public void ExpBarDraw()
{//経験値を拾った時に呼び出される
Exp++;
ExpText.text = Exp.ToString();
}
}
</code>
続いてExpManegerというEmptyObjectを作成して、ExpManegerを読み込ませます。
InspectorからExpTextにExpTextをアサインします。
Getsoundにcoin03を追加します。
AddComoponentでAudio Sourceを追加します。
int変数をToString();でString変数に書き換えて、Exptextに代入することで現在の数値が反映されます。
最後にEnemyPrefabにEXPprefabをアサインします。

EXPorbprefab
EXPorbのprefabを作っていきます
imagesフォルダからヒエラルキーにドラッグ&ドロップします。
AddComoponentからCircle Collider2dを追加します。
Rigidbody2Dを追加しGravity Scaleを0にします。
Sciptを作成し、名前をExpOrbScriptにします。
<code>using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ExpOrbScript : MonoBehaviour
[SerializeField] Text ExpText;
public int EXP;
public AudioClip sound;
AudioClip getsound;
AudioSource audioSource;
int Exp;
void Start()
{
audioSource = GetComponent<AudioSource>();
}
void Update()
{
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Player")
{
ExpManeger.instance.ExpBarDraw();
Destroy(this.gameObject);
}
}
}</code>
Playerとぶつかった時にExpManegerのExpBarDrawという関数を起動するようにしています。
これで敵を倒した時にアイテムが落ちる処理を実装することができました。
次回は時間経過によって生成されるモブの強さが変わっていく仕様を実装していきたいと思います。



コメント