今回は攻撃用ドローンを作っていきます。
一定時間ごとに一番距離が近い敵に向けてビームを出すようにします。
攻撃用ドローンの追加
・ドローン本体
・ビーム
・ドローン本体に付けるスクリプト(DroneScript)
・ビームを制御するスクリプト(RayScript)
・RayStatus(ScriptableObject)
というように分けて実装していきます。
ステータスを決める
ScriptableObjectsフォルダの中にStatusDataを作成し、名前を”RayStatus”にします。
ATKを1
SPEEDを2
NockBackを0
SPANを5に設定してください。
ビームを作る
ヒエラルキー上で右クリック Create→2D Object Squareを作成して、名前をRayにします。
色は黄色にします。
ScaleのYを0.1にします。
AddComoponentからBoxCollider2Dを追加して、IsTrrigerに☑をつけます。

RayScipt
続いてRaySciptを作っていきます。
・索敵を行い一番距離の近い敵に向かって飛んでいく
・敵に当たった時に相手のダメージ関数を起動する
・敵が周囲にいないときは消滅する
という機能を持たせます。
<code>using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayScript : MonoBehaviour
{
private GameObject[] targets;
private GameObject closeEnemy;
[SerializeField] StatusData statusdata;
Vector3 diff;
void Start()
{
Search();//どの敵が一番近いかを比べる
}
void Update() {
if (closeEnemy != null) {//敵が見つかった時
transform.position = Vector2.MoveTowards(transform.position, closeEnemy.transform.position, statusdata.SPEED * Time.deltaTime);
diff = (closeEnemy.transform.position - this.transform.position).normalized;
this.transform.rotation = Quaternion.FromToRotation(Vector3.right, diff);
}
else{//敵がいない場合
Destroy(gameObject);
}
}
void Search() {
float closeDist = 100;//仮に初期値を100にする
targets = GameObject.FindGameObjectsWithTag("Enemy");//EnemyというTagを検索する
foreach (GameObject t in targets)//見つかった数だけループする
{
float tDist = Vector2.Distance(transform.position, t.transform.position);//ビームとその敵の距離を測る
if (closeDist > tDist)//現在の最短距離よりも近い場合に実行される
{
closeDist = tDist;//最短距離を更新する
closeEnemy = t;//ゲームオブジェクトにも代入する
}
}
void OnTriggerEnter2D(Collider2D other)//敵とぶつかったらダメージ関数を発動
{
if (other.gameObject.tag == "Enemy")
{
other.gameObject.GetComponent<EnemyScript>().Damage(statusdata.ATK);
other.gameObject.GetComponent<EnemyScript>().NockBack(statusdata.NockBack);
Destroy(gameObject);//自分自身を消す
}
}
}</code>
RayにRayScriptを読み込ませます。
StatusDataにはRayStatusを読み込ませてください。
AddComponentからBoxCollider2Dを追加してください。
ヒエラルキー上からPrefabフォルダにドラッグ&ドロップをしてPrefab化します。
ヒエラルキー上にあるRayは削除します。
ドローンを作る
ヒエラルキー上で右クリックし、Create 2DObject Circleを選択します。
色は黒にします。
Scaleは0.7 0.7 0.7にします。
名前をDroneに変更しましょう。
Tagをクリックし、Add TagからDroneを追加して、TagをDroneに変更します。
AddComoponentからAudio Sourceを追加してください。
名前をDroneにします。
TagのプルダウンをクリックしてAdd TagでDroneを追加します。
TagをDroneにします。
DroneScipt
最後にDroneSciptを書いてきます。
持たせる機能は
・ドローンが生成された時のポジションを決める
・プレイヤーの子要素になる
・定期的にビームを生成する
この3つです。
<code>using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DroneScript : MonoBehaviour
{
[SerializeField]
private GameObject RayPrefab;
[SerializeField]
StatusData RayStatus;
GameObject Player;
Vector2 PlayerPos;
Vector2 myPos;
GameObject[] targets;
int DroneQuantity;
float localdistance;
public AudioClip sound;
AudioSource audioSource;
void Start()
{
Player =GameObject.FindGameObjectWithTag("Player");//PlayerというTagを持つオブジェクト検索する。
PlayerPos=Player.transform.position;
this.transform.parent = Player.transform;//生成された時自分自身をプレイヤーの子要素にする
Search();
PositionSet();
audioSource = GetComponent<AudioSource>();
}
void Update()
{
currentTime += Time.deltaTime;
if (currentTime > RayStatus.SPAN)
{
Debug.Log("RayStatus.SPAN:"+RayStatus.SPAN);
RayGenerate();
currentTime = 0f;
}
}
public void RayGenerate()
{
audioSource.PlayOneShot(sound);
var ray = Instantiate(RayPrefab, transform.position, transform.rotation);
}
void Search()
{
targets = GameObject.FindGameObjectsWithTag("Drone");//Droneタグを持つオブジェクトを検索する
foreach (var t in targets)
{
DroneQuantity = targets.Length;//Droneタグのオブジェクトの数を保存する
}
}
void PositionSet() {//自分が何個目なのかによってポジションを決める
localdistance = 0.8f;//主人公との距離
myPos = Player.transform.position;
switch (DroneQuantity){
case 1://1個目の場合
myPos.x = localdistance;
myPos.y = localdistance;
transform.localPosition = myPos;
break;
case 2://2個目の場合
myPos.x = -1*localdistance;
myPos.y = -1*localdistance;
transform.localPosition = myPos;
break;
case 3://3一個目の場合
myPos.x = -1*localdistance;
myPos.y = localdistance;
transform.localPosition = myPos;
break;
case 4://4個目の場合
myPos.x = localdistance;
myPos.y = -1*localdistance;
transform.localPosition = myPos;
break;
case 5://5個目の場合
myPos.x = 0;
myPos.y =5f;
transform.localPosition = myPos;
break;
}
}
}
</code>
以上のスクリプトを保存し、Droneに読み込ませてください。
Droneのインスペクターを開いて、
RayPrefabにはPrefabフォルダからドラッグ&ドロップをしてアサインします。
ヒエラルキー上のRayをアサインしてしまうとRayが自壊した後に生成する時にエラーが起きてしまうので、必ずPrefabフォルダのオブジェクトをアサインするようにしてください。
RayStatusにはRayStatusをアサインします。何秒に一回生成するかを決めるSPANの数値を利用します。
終わったらPrefabフォルダにドラッグ&ドロップしてPrefabにします。
プレイヤーの子要素になることでプレイヤーの動きと連動するようになります。
ヒエラルキー上に一つだけDroneがある状態でテストプレイしてみましょう
敵に向けてビームを発射してれば成功です。
続いてPredfabからヒエラルキー上にもう一つドラッグ&ドロップしてみましょう。
二個目のドローンが追加されて自動的にポジションが決まったと思います。
そこまでできていればOKです。
次回は倒した敵がアイテムを落とす処理を実装していきます。



コメント