RPGでよくある、敵を攻撃したとき、敵キャラの上にダメージを与えた時に数字がでてくるやつ、気持ちいいですよね、今回これを作っていきます。
今回は、2ページ構成です。https://fumimin40.com/post-486/こちらもどうぞ見てください
今回の課題は、どこにスクリプトを追加したほうがいいのか?
今作っているプロジェクト、あとからあとから、いろいろ考えなしに追加してしまって、わけわからなくなってきました。本当は、最初からいろいろ考えて作っていったほうがよいのでしょうけど。いまからでも、やらないよりは、ましだろう、ということで、いろいろ考えていきます。
目次 まず今ある攻撃関係のスクリプト紹介 今実装されているスクリプトを紹介します こういう感じで実験してみます1 いまの状態からわかりやすい、あとで困らなそうな 実装方法を考えてみます さっそく実験 だめっぽいいー 次の実験 これもだめー 何がダメなの考えてみる とりあえず今回は、実装無理でした、でもまだあきらめていません 次の作戦は、ちょっと自信あります、でも検索しまくってからにするかも
このページ作った時に買ったものではないですが、僕の買ったやつの2019版ですかね、どうせ買うなら、最新版、自分の使ってるunityのバージョンと合わせて買いましょう、安心ですよ※このページの内容が丸ごと乗っているわけではないです、この本プラスネット検索が大事かもです、でも1冊以上は、買ったほうがいいかもですので、おすすめのやつを紹介
まず今ある攻撃関係のスクリプト紹介
今、僕が作った攻撃のスクリプトは、3つ、攻撃判定のある物体につけたスクリプト、攻撃を受ける側のスクリプト、そして値を受け渡しするために作ったスクリプト
攻撃受ける側のオブジェクトにつけたスクリプトの一部です
public class tekitama_sute : MonoBehaviour, hidame
{
//MonoBehaviorのあとに「、」を付けて
//hidame(自分で作ったインターフェースの名前ファイル名
//これをやるとインターフェースの中のやつが使える
public int tama_hp = 30;
void hidame.hidame_01(int damage)
{
tama_hp -= damage;
}
攻撃力を管理するために作ったインターフェースです
public interface hidame
{ void hidame_01(int damage);}
攻撃判定のあるオブジェクトにつけたスクリプトです
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)
{
var d = GameObject.Find("sutekanri_m").GetComponent<sutekanri_m>();
int a = sutekanri_m.ATK;
a += 10; //実験です気にしないで
yodame_kakunin.hidame_01(a); } }}
簡単に説明します
攻撃判定のあるオブジェクトのスクリプトが攻撃食らう判定のあるオブジェクトと当たった時、インターフェースを通して攻撃判定のあるオブジェクトの攻撃力を攻撃受ける側にわたしています。
興味のある方は、こちらも見てください(僕がインターフェースを勉強したときのページです)
こういう感じで実験してみます1
まず、どういうことがしたいのか
どうやったら、わかりやすい(後で読みやすい)のか、
拡張性は、大丈夫なのか(ノリで仕様を変える僕には、限度があるかもだけど重要)
全部を満たすことは、難しいかもしれないが、これに気を使いながらかつ、初心者の僕が実装しやすい難しくないコードを作っていきたいと思います
今後のことで気になるところが、今は、ない防御力が、仕様変更で出てくるかもしれない、アイテムやなんかとかで敵がパワーアップするかもしれないバフ、デバフが追加されるかもしれない
これを考えると、受ける側のhpを減らしてるところに計算された後の数値を変数を作っておいたほうがいいかもしれない
テキストの生成位置は、大丈夫か?受ける側のスクリプトに、コリジョンがあるのでそのまま、それから当たったオブジェクトの位置に生成してしまえば程よくいい位置に出てきそう
と思ったけど今は、ない大きい範囲攻とか実装してしまうと、大きさにもよるけど、離れた位置に表示されるかもしれない、今、ある敵オブジェクトは、動きがないから、向きも適当に配置されている、コリジョン判定のあった位置を取得する方法がないか、あったらいいなー、をちょっと調べてきます。
あるっぽいですコンタクトポイントというやつが
ただしコンタクトポイントを使うスクリプト側へどうやって位置を渡すのかが難しい場合妥協するかもしれません
ちなみに僕がインスタンティエートを勉強したときの記事です興味のある方は、どうぞ
でも、それだと食らった側から食らうダメージの変数を持ってくるタイミングが難しそう、イメージだけど防御力加味して計算終わる前の数値を持ってきてしまったり、いろいろ、変なことがおきそうな予感がする。
さっそく実験
いろいろ考えたのですがとりあえずこれでやってみます
とりあえずテキストを適当なサイズで作ります。
world spaceの設定にするのを忘れずに、そしてこれをプレハブにして今います、今後使いまわしていきたいので
名前は、tekidame_txにしようかな、
void hidame.hidame_01(int damage) { hidame_tx = damage; tama_hp -= hidame_tx; // tama_hp -= damage; いろいろ追加するため変数をふやします }赤文字のところを変更しました。
あぶねー複数シーン使っているので、今回試したいところから始めたのですが、(テストプレイ)キャラクターの経験値とかいろいろ管理しているオブジェクトが読み込まれてなくてエラーになって余計なところ修正するところでした、皆さんも気を付けてください。
public int hidame_tx; public GameObject dameteki; void hidame.hidame_01(int damage) { hidame_tx = damage; tama_hp -= hidame_tx; // tama_hp -= damage; いろいろ追加するため変数をふやします Instantiate(dameteki, transform.position ,transform.rotation); dameteki.GetComponentInChildren<Text>().text =""+hidame_tx; }
向きとか、調整しないとですね一応できたので(できては、いない)向きは、カメラの位置にするのと、コンタクトポイントを使って位置をだしたいですね
一応動画撮ったので貼ります
キャンバスのサイズと、テキストの表示位置ワープロとかでよくある中央揃い(縦横)とか気を付けるといいと思いました。これを適当にやってたため、また座標ミスったかーってなりました
あとおかしいところが多すぎて、後日直します。もうちょっとテストプレイしないと、特定できないかも
ページ内の目次へ戻る
あきらめずに次の実験へ
public interface dametx_fcsi { void dametx(int dametx); }
void hidame.hidame_01(int damage) { hidame_tx = damage; //防御力等を追加する時用 tama_hp -= hidame_tx; Instantiate(dameteki, transform.position, transform.rotation); dameteki.GetComponent<dametx_fcsi>().dametx(hidame_tx); }
}sing System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ftx_cs : MonoBehaviour,dametx_fcsi { private GameObject damage_tekitx; // Use this for initialization void Start () { }
何がダメなのか考えてみる
一回目の実験
ステータス管理側からインスタンティエートしてそのままテキストをそのスクリプトから書き込む
キャンバスの子になっているテキストにゲットコンポーネントして書き込む、できてるし、やったねと、思ったのですが、動画では、プレハブ作るときにヒエラルキーに入れたやつ消し忘れた、これだけでは、なく、ダメージの数字がおかしい、(攻撃力プラス10が正しいダメージ)のはずなのになぜか、一個前のダメージの数字が表示される、シーン遷移した後、一回20(たぶんプレハブの初期設定?自分が位置合わせに使ったやつ)が表示されたあと次の攻撃から、それでもちょっとおかしい数字だけど、なおる、これから考えられるのは、生成と代入がずれている??ほかの理由もありそうだけど
2回目の実験
テキストの代入とかのずれが原因なのであれば、テキストを表示させるスクリプトをテキストに、持たせておけば、と考えインターフェースを使用し実装してみた。
これも失敗たぶんではあるが、理由は、(英語がちゃんと読めなかったのだが)インターフェースを使って数字を入れたまでは、よかったけど、まだ生成されてない(?)ため数字がもっていけなかった、のかもしれない、
つぎどうしよう
1回目も2回目も生成と代入のタイミングに生成されていないのが原因であるのならば1回目のやり方のほうがスパゲティーコード(つい最近覚えたので使いたかった)防止によいとおもう、どう実装するかは、できるかは、ともかくif文つかって、条件を生成されてたらゲットコンポーネントからのテキストーにしてみたい、
あと今回かなりいじり倒して間違ったスクリプトに記入したり本当なきそうなくらい、取り返しのつかない状態まで来ていた、次からは、実験前にプロジェクトファイルごとどっかにバックアップとっておこうと思う。いっかいプロジェクトごと消そうかと思うほどだった、皆様は、お気を付けを
次の実験で成功させるぞー、バックアップちゃんととってからね
また次回お会いしましょう
https://fumimin40.com/post-486/解決編です、こちらもみてください
コメント