[Mission Aegis]船ゲーすんどー 2

まだまだ久しくても成仏もしてないソニスっす★

またしても少しの間オトナシクナッチャッタ!だがみな見んなは元気だっただろうねぇ?★

…御本御本、

いや~=前回からイロンイロンマスクあってね、

グルングルッンとこのゲームの航路(ゲームデズァイン)を変えちゃったんだ★

んでんで、最早どれが新規でどれが当時からあるもんかわからんが、

一応紹介するね★

スプライト

敵用のヘリだ★

んでんで、エフェエフェ

スクリプト

長文になるから嫌ッホウ!なら「ここまで★」って言うから検索タブから飛んでね★

[Player.cs]

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

public class Player : MonoBehaviour
{
    Rigidbody2D RB;//RigidBodyの格納用
    void Start()
    {
        RB = GetComponent<Rigidbody2D>();//RBに自身のRigidBodyを格納しておくね
    }
    void Update()
    {
        if(Input.GetAxis("Vertical") != 0)//縦軸に何か入力があれば
        {
            RB.AddForce(transform.up* Input.GetAxis("Vertical"));//入力の方向へ
        }
        if(Input.GetAxis("Horizontal") != 0)//横軸に何か入力があれば
        {
            transform.Rotate(0, 0, Input.GetAxis("Horizontal")*-0.75f);//入力方向へ旋回させるよ
        }
    }
}

[Status.cs]

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

public class Status : MonoBehaviour
{
    //今回初作成

    public int HP;//ヒットポイント
    public int Damage;//ダメージ格納用
    public float Speed = 1;//速度

    public GameObject DestroyOB;//撃破後に残る演出用Body//
    public GameObject Target;//ターゲット

    public int MaxHP;//最大HP
    void Start()
    {
        MaxHP = HP;//MaxHPに現在のHPを入れておくよ
    }
    void FixedUpdate()
    {
        if(Damage > 0)//ダメージが0より大きければ…
        {
            HP -= Damage;//HPからダメージ分引く
            Damage = 0;//Damageを0にするよ
        }
        if(HP <= 0)//HPが0以下になったら…
        {
            GameObject DO = Instantiate(DestroyOB, transform.position, transform.rotation);//撃破用体を簡易的にDOに代入
            DO.GetComponent<DestroyEff>().KnockBackPower = new Vector4(-1, 0, 0, 10);//↑にノックバックさせる
            Destroy(gameObject);//ゲームオブジェクトを削除しておしまい!
        }
    }
}

[Helicopter.cs]

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

public class Helicopter : MonoBehaviour
{
    Status state;//state格納用
    public float shootingRange;//ここで指定した距離以下だと発砲
    public float OnFireTimer;//射撃開始までのラグ

    public float FireRate;//連射力

    //以下NPC用
    float SetMoveStopTimer;//移動
    float SetOnFireTimer;//発砲までの猶予
    //float SetFireRate;
    public Weapon weapon;//武器システム格納用
    void Start()
    {
        state = GetComponent<Status>();//自身のstateを取得しておく
    }

    void Update()
    {
        if (state.Target)//ターゲットが確認できていたら
        {
            //ここから
            Vector2 direction = state.Target.gameObject.transform.position - transform.position;
            float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg + -90;
            transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
            //ここまでおまじない
            //GPTに教えてもらったからわからないんだー…ってね

            if (Vector2.Distance(transform.position, state.Target.transform.position) > shootingRange)
                //ターゲットとの距離がshootingRange以外なら
            {
                //
                float step = (state.Speed * 0.3f) * Time.deltaTime;
                transform.position = Vector3.Lerp(transform.position, state.Target.transform.position, step);
                //このあたりもマジカル。そもそもLerp?とか知らん!
                weapon.OnFire = false;//一応撃てないようにしておく
                SetOnFireTimer = OnFireTimer;//一応発砲までの猶予をリセットしておく
            }
            else//ターゲットとの距離がshootingRange以内なら
            {
                if (SetOnFireTimer > 0)//発射までの時間があれば
                {
                    SetOnFireTimer -= Time.deltaTime;//残り時間を減らす処理
                }
                else//なければ
                {
                    weapon.OnFire = true;//発射!
                }
            }
        }
    }
}

[Sensor,cs]

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

public class Sensor : MonoBehaviour
{
    public GameObject Target;//ターゲット格納用
    private void OnTriggerStay2D(Collider2D collision)//何かに当たったら
    {
        if (transform.root.gameObject.layer == 8 | transform.root.gameObject.layer == 11)//自機のセンサーである場合は
        {
            if (collision.gameObject.layer == 9 | collision.gameObject.layer == 12)//接触物は敵なら
            {
                Target = collision.gameObject;//Targetに接触物を格納しよう!
            }
        }
        if (transform.root.gameObject.layer == 9 | transform.root.gameObject.layer == 12)//敵のセンサーである場合
        {
            if (collision.gameObject.layer == 8 | collision.gameObject.layer == 11)//接触物は自機なら
            {
                Target = collision.gameObject;//Targetに接触物を格納しよう!
            }
        }
    }
    private void OnTriggerExit2D(Collider2D collision)//何かとの接触が途絶えたら
    {
        if (Target)//Targetに何かあれば
        {
            if (transform.root.gameObject.layer == 8 | transform.root.gameObject.layer == 11)//自機のセンサーである場合
            {
                if (collision.gameObject.layer == 9 | collision.gameObject.layer == 12)//接触物が自機だったのなら
                {
                    Target = null;//Targetを空にしておく
                }
            }
            if (transform.root.gameObject.layer == 9 | transform.root.gameObject.layer == 12)//敵のセンサーである場合
            {
                if (collision.gameObject.layer == 8 | collision.gameObject.layer == 11)//接触物が敵だったなら
                {
                    Target = null;//Targetを空にしておく
                }
            }
        }
    }
}

[Spawner.cs]

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

public class Spawner : MonoBehaviour
{
    public GameObject SpawnEnemy;//召喚する敵だよ。
    public float SpawnRate = 3f;//どのぐらいの頻度が決めるよ、値が小さい程高頻度になるんだ。

    float DSpawnRate;//元のSpawnRateだね。

    public GameObject Player;//プレイヤーを格納する為の変数だよ、召喚した敵にどいつがプレイヤーか教える為には必要なんだ。
    void Start()
    {
        DSpawnRate = SpawnRate;//元々の召喚頻度を記憶しておくよ
    }
    void Update()
    {
        if (SpawnEnemy&&Player)//ちゃんとプレイヤーも召喚する敵も指定されていたら
        {
            if (SpawnRate > 0)//まずはSpawnRate分待機するよ
            {
                SpawnRate -= Time.deltaTime;//その為にSpawunRateから時間分引くよ
            }
            else//タイマーが0になったら
            {
                SpawnRate = DSpawnRate;//まずはタイマーをリセットしよう
                int RLRand = Random.Range(0, 2);
                int UDRand = Random.Range(0, 2);
                //んでんで、縦横どの位置に出すのかランダムに決めるよ
                if (RLRand == 0)//0はまずいので-1にするよ
                {
                    RLRand = -1;
                }
                if (UDRand == 0)//こっちもね
                {
                    UDRand = -1;
                }
                GameObject O = Instantiate(SpawnEnemy, new Vector3
                    (
                    (Player.transform.position.x + 20+Random.Range(-10,10)) * RLRand,
                    (Player.transform.position.y + 20 + Random.Range(-10, 10)) * UDRand,
                    0)
                    ,Quaternion.identity);
                //んでんで、生成開始!
                //要約するとプレイヤーから上下左右30ぐらい離れた所にスポーンするよ
                if (O.GetComponent<Status>())//召喚した敵にStatusがアタッチされていたら
                {
                    O.GetComponent<Status>().Target = Player;//その子のターゲットはプレイヤーに決定だ!
                }
                //ここから
                if (O.GetComponent<Fighter>())
                {
                    O.GetComponent<Fighter>().spawner = this;
                }
                //ここまでは
                //いつの日か戦闘機を実装したら多分使うよ、だから今は割愛するね。
            }
        }
    }
}

[Weapon.cs]

using UnityEngine;

public class Weapon : MonoBehaviour
{
    public Sensor sensor;//見ての通りセンサー
    public GameObject bullet; // 発射する弾丸を指定するよ
    public float FireRate = 0.2f;//連射力だね
    public int BurstCount = 1;//一回で発射する数だ
    public float CoolTime = 1;//点射後この時間分は撃てないんだ
    public float angleOffset = 0f;//角度の修正…とかだったかな

    float SetFireRate;//連射力のタイメーって言ったら分かりやすいかな
    public bool OnFire;//これが偽だとセンサーで感知しても発砲しないよ
    private void Start()
    {
        SetFireRate = FireRate;//あらかじめタイマーをセットしておくよ
    }
    private void Update()
    {
        if (sensor&&OnFire)//撃てる状態でセンサーに反応があれば
        {
            if (sensor.Target&&bullet) //且センサーがしっかりターゲットを取得していて弾もセットされていたら
            {
                if(SetFireRate > 0)//SetFireRateをタイマーに待つよ
                {
                    SetFireRate -= Time.deltaTime;//時間分SFRから引くんだ
                }
                else//タイマーが鳴ったら
                {
                    SetFireRate = FireRate;//まずはやっぱりタイマーのリセットだよね

                    Vector2 direction = sensor.Target.gameObject.transform.position - transform.position;
                    float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg + (angleOffset+Random.Range(-10,10));
                    //ここらはGPTクンにやってもらったからワタもよくわからん魔法になってる!
                    //一応、ターゲットの方を向く角度を計算する…のかな?

                    GameObject O  = Instantiate(bullet, transform.position, Quaternion.AngleAxis(angle, Vector3.forward));
                    //先の向きを向く用に弾丸を生成…発射するよー!

                    if (gameObject.layer == 8 | gameObject.layer == 11)//自機のセンサーである場合は
                    {
                        O.gameObject.layer = 14;//レイヤーを自機の弾にね
                    }
                    if (gameObject.layer == 9 | gameObject.layer == 12)//敵のセンサーである場合は
                    {
                        O.gameObject.layer = 15;//レイヤーを敵の弾にね
                    }
                }
            }
        }
    }
}

[DestroyEf.cs]f

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

public class DestroyEff : MonoBehaviour
{
    //今回初作成
    //って書いたけどさーもう随分昔の事だからわからないんだー

    SpriteRenderer Rend;//スプライト処理の格納用変数だよ
    Rigidbody2D RB;//物理演算装置の格納用だよ

    public GameObject Explosion;//爆発四散!の為の爆発エフェ格納用だよ
    public Vector4 KnockBackPower = new Vector4(0,0,0,0);//ノックバックする方向とチカラだ、最後の値が0ならなしで
    public float ClearSpeed = 0.005f;//消えるまでのラグ兼エフェクト用だ
    void Start()
    {
        Rend = GetComponent<SpriteRenderer>();
        RB = GetComponent<Rigidbody2D>();
        //RendとRB、それぞれをまずは取得しよう
    }
    private void FixedUpdate()
    {
        if(KnockBackPower.w > 0)//ノックバック有りなら
        {
            RB.AddForce(new Vector3(KnockBackPower.x, KnockBackPower.y, KnockBackPower.z) * KnockBackPower.w);
            //x,y,zの方向にノックバックさせよう
            KnockBackPower.w = 0;//ノックバック力を0にするのも忘れずにね…
        }
        if (Rend.color.b > 0)//colorが黒より明るかったら
        {
            Rend.color -= new Color(ClearSpeed,ClearSpeed,ClearSpeed, 0);
            //黒くしたまえ
        }
        else//ちゃんと黒かったら
        {
            GameObject EO = Instantiate(Explosion, transform.position,Quaternion.identity);
            //爆発エフェを生成するよ
            EO.transform.eulerAngles = new Vector3(90, 0, 0);//一応爆発の向きx軸を90にし、それ以外を0にしておこうか
            Destroy(gameObject);//これでおしまい!退場させるよ。
        }
    }
}

[Bullet.cs]

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

public class Bullet : MonoBehaviour
{
    Rigidbody2D RB;//Rigidbodyを格納用さ
    public float LifeTime = 10;//この秒数が過ぎたら消すよ
    public float Speed = 1;//速度だ

    float SetSpeed;//

    public GameObject HitMark;//まんま
    public GameObject Explosion;//砲弾ならここに爆発エフェを格納
    public GameObject ExpPos;//↑の生成位置だよ
    void Start()
    {
        SetSpeed = Random.Range(Speed * 0.9f, Speed * 1.1f);//速度を90~110のランダムにするよ
        RB = GetComponent<Rigidbody2D>();//RBにこのScがアタッチされてるRigidbodyを取得するよ
    }
    void Update()
    {
        //色々と面倒なのでFixedの方を使うよ
    }
    private void FixedUpdate()
    {
        RB.AddForce(transform.up*(SetSpeed*0.05f));//上方向にSpeed×⁻10のチカラを与えるよ
        if(LifeTime > 0)//LifeTimeが0より大きければ…
            //つまりタイマー
        {
            LifeTime -= Time.deltaTime;//LifeTimeから時間分引く
        }
        else//0以下であれば…
        {
            Destroy(gameObject);//削除
        }
    }
    private void OnTriggerEnter2D(Collider2D collision)//何かにぶつかったら
    {
        if (Explosion && ExpPos)//それでいてExplosionとExpPosに何か入っていたら…
        {
            GameObject E = Instantiate(Explosion, ExpPos.transform.position, Quaternion.identity);
            //ExpPosの位置にExlosionを生成し
            //GameObject型変数Eに代入しておくよ
            E.transform.eulerAngles = new Vector3(90, 0, 0);//Eの向きx軸を90にし、それ以外を0に一応しておくよ
        }
        if (collision.gameObject.GetComponent<Status>())//接触オブジェにStatusがアタッチされていたら…
        {
            if (gameObject.layer == 14&& (collision.gameObject.layer == 9 | collision.gameObject.layer == 12))
                //それでいて自機の弾で敵に当たったのなら
            {
                Instantiate(HitMark, transform.position, Quaternion.identity);//ヒットマークを生成
                collision.gameObject.GetComponent<Status>().Damage = 1;//接触オブジェに1のダメージを代入
            }
            if (gameObject.layer == 15&&(collision.gameObject.layer == 8|collision.gameObject.layer == 11))
            //あるいは敵の弾で自機に当たったのなら
            {
                GameObject HM = Instantiate(HitMark, transform.position, Quaternion.identity);//ヒットマークを生成
                HM.GetComponent<SpriteRenderer>().color = new Color(1, 0, 0, 1);
                //自機のヒットマークとの識別の為、赤色にしておくよ
                collision.gameObject.GetComponent<Status>().Damage = 1;//接触オブジェに1のダメージを代入
            }
            Destroy(gameObject);//削除
        }
    }
}

はぁ…はぁ…なんとか…ここまで★

で、このスパゲッティパスタが何をするかってーと…

ここまで出来るんだ★

一応まだ未完成で公表してない部分もあるけどさ、

いつかは完成させて見せてやるから待っててくれよな★

ゆくゆくは敵艦とか、タイトルとか実装してどこかで遊べる形にするね★

ご視聴ありがとうございましたーンジャメナフロッグ★

  • 2
  • 0
  • 0

ウオユツンエ=ソニス

作者のページを見る

寄付について

「novalue」は、‟一人ひとりが自分らしく働ける社会”の実現を目指す、
就労継続支援B型事業所manabyCREATORSが運営するWebメディアです。

当メディアの運営は、活動に賛同してくださる寄付者様の協賛によって成り立っており、
広告記事の掲載先をお探しの企業様や寄付者様を随時、募集しております。

寄付についてのご案内