今回は攻撃用ドローンを作っていきます。
一定時間ごとに一番距離が近い敵に向けてビームを出すようにします。
攻撃用ドローンの追加
・ドローン本体
・ビーム
・ドローン本体に付けるスクリプト(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です。
次回は倒した敵がアイテムを落とす処理を実装していきます。
コメント