まだまだ久しくても成仏もしてないソニスっす★
またしても少しの間オトナシクナッチャッタ!だがみな見んなは元気だっただろうねぇ?★
…御本御本、
いや~=前回からイロンイロンマスクあってね、
グルングルッンとこのゲームの航路(ゲームデズァイン)を変えちゃったんだ★
んでんで、最早どれが新規でどれが当時からあるもんかわからんが、
一応紹介するね★
スプライト
敵用のヘリだ★
んでんで、エフェエフェ
スクリプト
長文になるから嫌ッホウ!なら「ここまで★」って言うから検索タブから飛んでね★
[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);//削除
}
}
}
はぁ…はぁ…なんとか…ここまで★
で、このスパゲッティパスタが何をするかってーと…
ここまで出来るんだ★
一応まだ未完成で公表してない部分もあるけどさ、
いつかは完成させて見せてやるから待っててくれよな★
ゆくゆくは敵艦とか、タイトルとか実装してどこかで遊べる形にするね★
ご視聴ありがとうございましたーンジャメナフロッグ★