複数の敵、複数の攻撃どうやって実装するのか?
すっごい便利だし、今回の内容だけで言えば簡単です
このやり方気に入ってます、ぜひ広めていきたい
100種類の攻撃 100種類の敵がいたとして、どの敵がどの攻撃を受けた、というやりとりをcollisionでやると1種類のに100種類の攻撃を記述しなくては、いけません、他に方法があるかもしれませんがそれに攻撃の種類が1つ増えたらそれをそれぞれ直さないといけなくなる。コピペでもいいけど、それよりいい方法を見つけたのです
目次 何がやりたいのか流れ 簡単な流れ説明になってます。 先に使ったスクリプトを張り付けておきます 今回は、趣向をかえて、先に成功作をおいときます。 それぞれのスクリプトを解説していきます インターフェースすごい使える!。 つまりどうなったのか、どういうことができそうか?
何がやりたいのか流れ
インターフェース(スクリプト)にダメージという変数を受け取りする機能を作ります
敵(ダメージを受ける者)にその機能を追加します(インターフェースを使う宣言?)
攻撃する物(攻撃判定を持ったオブジェクト)たとえばファイアー、ブリザード等の魔法とかそれが何かと接触した時Collisionを使ってその当たった物体(敵とか)がインターフェースの機能を実装しているならインターフェースの変数に数値を渡し敵は、その変数を使ってHPを減らす処理をします
今回は、3つスクリプト作りました
今回は、わかりやすくするため全文省略なしで貼り付けました
詳しくは、わからないのですがこのインターフェースは、何かにアタッチしなくていいらしいです
public interface hidame { void hidame_01(int damage); } //これが今回の目玉インターフェースです //ほかに何もいりませんusing System.のところもすべて消してこれだけ //ファイル名は、hidame.cs被ダメージを管理する意味で作りました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class hakoste_02 : MonoBehaviour, hidame { //MonoBehaviorのあとに「、」を付けて //hidame(自分で作ったインターフェースの名前ファイル名 //これをやるとインターフェースの中のやつが使える private int hako_hp = 100; //敵の体力 void hidame.hidame_01(int damage) //hidameというファイルの中の { //hidame_01という機能を使うぞって意味です hako_hp -= damage; } // Use this for initialization void Start() { } // Update is called once per frame void Update() { Debug.Log("のこりHPは" + hako_hp);//成功しているか調べるためにつけたよ } } //敵キャラ(はこ(cube))にアタッチします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class yodame_tama : MonoBehaviour {//ここでは、「,hidame」つけなくてOK // Use this for initialization void Start () { } // Update is called once per frame void Update () { } private void OnCollisionEnter(Collision col) { var yodame_kakunin= col.gameObject.GetComponent<hidame>(); if(yodame_kakunin != null) { yodame_kakunin.hidame_01(10); } } }//攻撃する物質に貼り付けます、僕の場合tamaです
それぞれのスクリプトを細かく解説していきます
インターフェースの中身から
ファイル名は、hidame.csにしました、被ダメを管理するものという意味でつけました
public interface hidame { void hidame_01(int damage); }
まずインターフェースの中身、最初のがhidameというインターフェースを作ります
{}これの中身にvoid hidame_01(int damage)という機能が入ってます
この書き方実は、僕よくわかってませんが、インターフェースを使って変数をやり取りするためにこういう書き方をする物、と今は、深く考えずに使うことにしてます
ダメージを受ける側にアタッチするスクリプト
public class hakoste_02 : MonoBehaviour, hidame
赤文字の所がいつもと違いますインターフェースにつけたファイル名を「、」の後につけることで機能を使うことができるようになるらしいです
これ自体のファイル名がhakoste_02 なのは、hakosteを含めて廃棄して_02で成功したということです(気にしないでください)箱のステータス(今回僕が準備した敵がcubeだからです)
void hidame.hidame_01(int damage) { hako_hp -= damage; }
今回の目玉部分です
上で機能を使えるようにしたことでこのdamage(ダメージという意味で名付けました)という変数を受け取れるようになりました、このdamageに数字を入れるのは、攻撃側でやります
大事なこと書き忘れてた
推測になりますがこの機能が呼び出されるのは、int damageに数値が入った時だと解釈しています
攻撃側のスクリプト
public class yodame_tama : MonoBehaviour //ここでは、「,hidame」つけなくてOK
スクリプトの下の方で使ってるように見えるけどつけなくていいみたいです
private void OnCollisionEnter(Collision col) { var yodame_kakunin= col.gameObject.GetComponent<hidame>(); if(yodame_kakunin != null) { yodame_kakunin.hidame_01(10); } }
今回は、このスクリプトを貼り付けているオブジェクトが何か(インターフェースでは、これができるからありがたい)の判定とぶつかった時
varは、暗黙のなんちゃら変数といって=の右側が明らかならわざわざ型を定義しなくてもいいよ、という者らしいけどこの場合の適切な型がわからなかったので、調べているところに書かれてたままこれにしました
まず最初に判定があったらこれが処理されます
var yodame_kakunin= col.gameObject.GetComponent<hidame>();
yodame_kakunin(名前は、与ダメできるか調べるための変数ということで僕が名付けました)のなかにcol.gameObject.GetComponent<hidame>()の情報を参照し入れておいて?という意味だと思います(ちょっと自信ない)不確かだけどそういう動きっぽいので今は、良しとしておきます
で、次のif文if(yodame_kakunin != null) yodame_kakuninがnullじゃなければ、つまりyodame_kakunin(当たった相手のGetComponent情報の<hidame>が使われているなら
nullじゃないつまりこの攻撃を食らうことができるオブジェクトであるという使い方をします
その時yodame_kakunin.hidame_01(10);これを処理します
つまりyodame_kakuninという変数?を使ってhidame_01(int damage)のなかのdamegeに数値を代入今回の例だと「10」ダメージを設定できました
つまりどうなったのか、どういうことができそうか?
最初攻撃を実装しようとしたらcollisionを使ってどれに当たったか?その場合の処理は、というやり方がわかりましたこれでもいいのですが、敵の種類、攻撃の種類が増えると
たとえばAがパンチを食らった時のダメージは10、キックを食らった時のダメージは20と山ほど追加していかないといけない、かもしれませんが、これなら攻撃側が100ダメージと言ってるなら食らっとくかー、みたいな感じでできるので後から頭突きを実装しようダメージは、50にする、とかのとき攻撃側だけ作ればいいということです
逆にインターフェースに炎、氷、雷とか作れば敵側に実装しないとかで氷攻撃が効かない敵とかも作れそうです
ただ一つのインターフェースにやってしまうのは、ダメ(厳密には、いいんだけど)
一つのインターフェースを実装したら中にある全ての機能を使わないといけないらしいです
うまく使って面白いもの作ってみたいな
他にもこういう風に使うとこういうことができるよ、とかあれば教えてください
せっかく攻撃できるようになったので敵にHPバーをくっつけてみたくなりますよね。気になった方は、上のリンクをどうぞー、みてください
コメント