アマゾンバナーリンク

Unityで作る弾幕シューティングゲームその2 スコアボードの表示と敵を動かす

2020年7月18日

こんにちは!ジェイです。前回に引き続きスコアボートの表示と敵の表示させて動かすまでやります。

スコアボードの表示

まずは、Assets>Scenes>Resources>img>boradから10,11,12,20を写真のように配置します。赤線で囲んだツールを使うと拡大、縮小、移動がやりやすいです。

描画順の変更

このままではプレイヤーがスコアボードの上に表示されてしまうので、描画順を変えます。

SpirteRender→SortingLayerのAddSortingLayerでレイヤーを追加します。

上の様な順番でSortingLayerを設定してください。この設定は、上に行くほど奥に、下に行くほど手前に描画されるようになります。

敵の設定

次に敵を出現させるために設定をします。

Aseets>Secene>Resources>img>enemyの0をクリックすると以下のようになります。

最初に赤で囲んだ敵のアイドルアニメーション3つをシフトを押しながら選び、Hierarchyにドラッグ&ドロップ。次にそのHierarchyの敵のアニメーションを選択したまま、Animationウインドウを開きます。

上の赤い部分を選び、LeftEnemyAnimationと名付け、黄緑色の敵を3つドラッグ&ドロップして右の時間をうまく設定して、アニメーション速度を調整します。同じ様にRightEnemyAnimationを作ります。

次にAnimatorを開き、前回Playerに設定したのと同じ様にします。

更にRigidbody2dとCircleCollider2Dのコンポーネントを追加して、以下のスクリプトを追加します。

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

public class CEnemy : MonoBehaviour
{
    int Cnt = 0;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Cnt < 80)
        {
            transform.position += new Vector3(0.0f, -3.0f, 0.0f) * Time.deltaTime;
        }
        if (Cnt > 80 + 240)
        {
            transform.position += new Vector3(0.0f, 3.0f, 0.0f) * Time.deltaTime;
        }
        Cnt++;
        if(CUtility.IsOut(transform.position))
        {
            Destroy(gameObject);
        }
    }
}

移動を制限するために以下のスクリプトも作成しておきましょう。

using UnityEngine;

// 便利な関数を管理する静的クラス
public static class CUtility
{
    // 移動可能な範囲
    static Vector2 MoveLimitTopLeft = new Vector2(-5.7f, 4.2f);
    static Vector2 MoveLimitButtomRight = new Vector2(1.7f, -4.2f);

    static Vector2 EnemyLimitTopLeft = new Vector2(-7.0f, 6.2f);
    static Vector2 EnemyLimitButtomRight = new Vector2(3.0f, -5.2f);
    // 指定された位置を移動可能な範囲に収めた値を返す
    public static Vector3 ClampPosition(Vector3 position)
    {
        return new Vector3
        (
            Mathf.Clamp(position.x, MoveLimitTopLeft.x, MoveLimitButtomRight.x),
            Mathf.Clamp(position.y, MoveLimitButtomRight.y, MoveLimitTopLeft.y),
            0
        );
    }
    public static bool IsOut(Vector3 position)
    {
        return (position.x < EnemyLimitTopLeft.x ||
               EnemyLimitTopLeft.y  < position.y||
                EnemyLimitButtomRight.x < position.x ||
                position.y < EnemyLimitButtomRight.y);
    }
}


そしたら敵を以下のように配置しましょう。これで完了です。