ボーナスアイテムの追加【UnityでVampire survivers 風のゲームを作ろう!第13回】

Uncategorized

UnityでVampire survivers 風のゲームを作ろう!#0【連載目次】

聖水の実装

今回は敵にダメージを与えるエリアを発生させる聖水を実装していきます。

・ampouleGenerator(聖水を生成させるオブジェクト)
・ampoule(聖水の瓶)
・DamageZone(ダメージエリア)

DamageZone→ampoule→ampouleGeneratorの順で作成していきます。

DamageZoneを実装していきます。まずはヒエラルキー上で右クリック、Create>2DObject>sprites>Circleを選択します。

名前をDamageZoneにします。

ScaleはX1.6 Y1.6にします。当たり判定として利用するのでAddComponentからCircleCollider2Dを追加します。

ダメージエリアのエフェクトとして、ヒエラルキー上で右クリックCreate>Effects>Particle Systemを作成します。

Duration 10

Loop ☑

Start Speed 0

Color #9CE2FF

ShapeからShape をSphereにします。

Start Speedを0にすることで、パーティクルがその場にとどまるので、あたり判定が視覚的に分かりやすくなります。

Particle SystemをDamageZoneの子要素にしてください。

DamageZoneに読み込ませるスクリプトを書いていきます。
持たせる機能としては
・ダメージエリアに重なっている敵にダメージを与える
・一定時間後に自壊する

の二つです。


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

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

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

    void OnTriggerStay2D(Collider2D other)//敵と重なっている時ダメージ関数を発動
    {
        if (other.gameObject.tag == "Enemy")
        {
            other.gameObject.GetComponent<EnemyScript>().Damage(0.1f);
            Debug.Log("ダメージエリアに入っています");
            other.gameObject.GetComponent<EnemyScript>().NockBack(1f);
        }
    }

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

OnTriggerStay2Dはオブジェクト同士が触れている間ずっと処理が行われます。
持続ダメージを与えるので、一回あたりのダメージは少なくしておきましょう。
スタート関数にコルーチンを使い、5秒で自壊するようにしてあります。

続いてはampouleのオブジェクトを作っていきます。
Imagesフォルダから、ampouleをヒエラルキー上にドラッグ&ドロップします。
続いて、Scriptsフォルダの中にampouleScriptというSctiptを作成します。

このスクリプトに持たせる機能は
・画面の中のランダムな地点に向かって聖水入りの瓶を落とす
・その地点に到達した時、DamageZoneを生成して自壊する

の二つです。

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

public class AnpouleScript : MonoBehaviour
{
    Vector2 DestinationPos;
    Vector2 currentPos;
    [SerializeField] GameObject DamageZonePrefab;
    Vector3 localAngle;
    Transform myTransform;
    // Start is called before the first frame update
    void Start()
    {
        float rndPosX = Random.Range(-2.6f, 2.61f);//画面の横の長さ
        float rndPosY = Random.Range(-4.5f, 4.51f);//画面の縦の長さ
        currentPos.x = rndPosX;//ランダム値を代入する
        currentPos.y = 6f;//Y軸を表示範囲よりも上に設定しておく
        transform.position = currentPos;//現在位置を変える
        DestinationPos = transform.position;//目的値のX軸を代入
        DestinationPos.y = rndPosY;//目的値のY軸を代入
         

 	myTransform = this.transform;
        localAngle = myTransform.localEulerAngles;
    }

    // Update is called once per frame
    void Update()
    {   
        localAngle.z += Time.deltaTime*80;//Z軸に回転をさせる
        myTransform.localEulerAngles = localAngle;//角度を代入

        transform.position = Vector2.MoveTowards(transform.position, DestinationPos, 4*Time.deltaTime);
        currentPos = transform.position;
        if (currentPos.y== DestinationPos.y) {//目的地に到達したらDamageZoneを生成する
            var DamageZone = Instantiate(DamageZonePrefab, transform.position, transform.rotation);
            Destroy(this.gameObject);
        }

    }
}

今まで実装してきた処理と似たようなものなので、結構簡単だったかもしれません。
ランダムで場所を決めるのはEnemyGeneratorで、ある地点に向かわせるのはEnemyScriptと同じですよね。

AnpouleにAnpouleScriptを読み込ませます、
InspectorにPrefabフォルダからDamegeZone PrefabにDamegeZoneをアタッチします。
AnpouleをPrefabフォルダにドラッグ&ドロップします。

最後にampouleGeneratorを実装していきます。
一定時間ごとにAmpouleを生成する機能を持たせたオブジェクトです。
レベルアップのボーナスでこのオブジェクトを生成し、どんどん聖水を投げていきましょう。

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

public class ampouleGenerator : MonoBehaviour
{
    [SerializeField] GameObject AmpoulePrefab;
    float currentTime = 0f;
    public float span = 4f;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        currentTime += Time.deltaTime;
        if (currentTime > span)
        {
            var anpoule = Instantiate(AmpoulePrefab, transform.position, transform.rotation);
            currentTime = 0f;
        }

        
    }

}

右クリックCreat >create Emptyを生成します。
ampouleGeneratorと名前を付けます。
このScriptをampouleGeneratorにアサインし、AnpoulePrefabにAmpouleをアサインします。
そしてPrefabフォルダに入れます。

AmpouleGeneratorもPrefab化しておきます。

実際にやってみましょう。
上からアンプルが飛んできてダメージエリアを生成しているでしょうか。

続いては先ほどのLevelupPanelのScriptに追加していきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LevelupPanel : MonoBehaviour
{
    public static LevelupPanel instance;
    Text itemText;
    string ItemName;

    [SerializeField] GameObject LevelUPUI;
    Image itemimage;

    [SerializeField] Sprite imageDrone;
    [SerializeField] Sprite imageAnpoule;
    public int argmentrnd;
    public Image Imagename;
    //public GamemanegerScript GMscript;
    [SerializeField] GameObject drone;
    [SerializeField] GameObject AmpouleGenerator;
    [SerializeField] StatusData statusdata;
    // Start is called before the first frame update
    void Start()
    {
        if (instance == null)
        {
            instance = this;
        }

    }

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

    }


    public void Onclick()
    {
        Imagename = this.gameObject.GetComponent<Image>();
        Debug.Log(Imagename.sprite.name);
        if (Imagename.sprite.name == "ItemPanel0")
        {
            var Drone = Instantiate(drone, transform.position, transform.rotation);//ドローンの生成
        }

        if (Imagename.sprite.name == "ItemPanel1")
        {
            Debug.Log("パンチを選択");
            statusdata.ATK++;
        }

        if (Imagename.sprite.name == "ItemPanel2")
        {
            Debug.Log("聖水を選択");
            var Drone = Instantiate(AmpouleGenerator, transform.position, transform.rotation);//アンプルジェネレーターの生成
        }

        Time.timeScale = 1;
        LevelUPUI.GetComponent<Canvas>().enabled = false;

    }


}

次回はチェストの実装とレベルアップボーナスの変更を行っていきます。
チェストの実装とレベルアップボーナスの追加を行っていきます。

コメント

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