一発成功わーい
難しいことしなくてもできるんだ
流れ的には、僕の敵キャラは、攻撃を食らったら、攻撃オブジェクトからインターフェースをつかって、ダメージの数値をもらう、となっています。
そのダメージをもらった時、の中に今は、まだないですが、防御力等を加味して、ダメージ計算をしてそれをプレハブ内のテキストに代入(書き込み)してインスタンティエートinstantiateで生成させようと思います。
ちなみにほぼ正解のスクリプト(僕的には、)を前回の1回目の実験の時にできていたのですが、生成と数字の記入を逆にしてしまった、このスクリプトの書き方の場合プレハブのテキストに書き込んでるのですが、勘違いで表示させた生成したオブジェクトを操作していると思い込んでた、うーん、コードの順番で細かく動作が変わるので気をつけなきゃです
目次 まずは、攻撃食らったら、ダメージを表示 前回いろんな失敗したので、どこを勘違いしたのかとかも まずは、成功スクリプト全文はりますね 表示させっぱなしだったテキストを消去 成功しているかどうかを確かめてから作る予定だった 今回は、こだわりもないのでちょっと表示して 普通に消すやり方にします。
このページ作った時に買ったものではないですが、僕の買ったやつの2019版ですかね、どうせ買うなら、最新版、自分の使ってるunityのバージョンと合わせて買いましょう、安心ですよ※このページの内容が丸ごと乗っているわけではないです、この本プラスネット検索が大事かもです、でも1冊以上は、買ったほうがいいかもですので、おすすめのやつを紹介
まずは、攻撃食らったら、ダメージを表示
まずは、スクリプトはりつけます。
ヒエラルキーにcanvas その子にtextを指定し、お好みのサイズに調整して、プレハブにして、ヒエラルキーからは、削除しておいてください。
もともとあった敵につけてあるスクリプトです赤文字が今回の追加したものですusing System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;//これは、テキストのプレハブをここから書き込むため //追加しました public class tekitama_sute : MonoBehaviour,hidame { //hidameは、攻撃を食らうために作ったインターフェースです public int tama_hp = 30; public int tama_maxhp = 30; public int hidame_tx; //テキストに表示させるために追加 public GameObject dameteki; //インスペクターのスクリプトに表示されるのでこれにテキストプレハブを //ドロップして入れてください //前からあったインターフェースでダメージをもらった時の処理の中に //付け加えました 詳しくは、本文でやります void hidame.hidame_01(int damage) { hidame_tx = damage; tama_hp -= hidame_tx; dameteki.GetComponentInChildren<Text>().text = "" + hidame_tx; Instantiate(dameteki, transform.position, transform.rotation); } //ここより下は、今回のダメージを表示させるのには、使ってないです // Use this for initialization void Start() { } // Update is called once per frame void Update() { // Debug.Log("のこりHPは" + hako_hp); if (tama_hp <= 0) { var yoexp_tama = GameObject.Find("sutekanri_m").GetComponent<exp_tekiatk_cs>(); //GameObject.Find("sutekanri_m").GetComponent<exp_tekiatk_cs>(); 指定しなくてもみつかるみたいね yoexp_tama.yoexp_I(10); Destroy(this.gameObject); //hpがゼロより少なくなったら、消去 } } private void OnCollisionEnter(Collision col) { if (col.gameObject.tag == "Player") //ここも修正 { var atkatk = GameObject.Find("sutekanri_m").GetComponent<exp_tekiatk_cs>();//ここも修正 if (atkatk != null) { atkatk.yoatk_I(10); } } } }
変数の宣言 オブジェクトの指定(上のスクリプト内で説明してます)は、省略します。
void hidame.hidame_01(int damage)
これは、攻撃オブジェクトと接触があった場合、int damageに数値が入り、{}この中の文が実行されます
詳しくは、こちらにて初心者なりに頑張って勉強してあります。
hidame_tx = damage; tama_hp -= hidame_tx;
まえまでは、そのままtama_hp(このてきのhp)から減らしてたのですが、今後防御力とかを作ったときとかに使いそうだったので計算後の数値を入れる変数を用意し計算しました。
dameteki.GetComponentInChildren<Text>().text = “” + hidame_tx;
dametekiは、上で宣言したプレハブを指定するためのものです、canvasの子にテキストがあるので、ゲットコンポーネントは、こう書きました、エディターの予測変換に出てきたので、試してみたら成功しました<Text>().text=で表示する文字を入れていきます。””+hidame_txわざわざダブルクオーテーションプラス変数にしているのは、なぜかそのままだと、int型の変数がストリング型がーっていうエラーが出たのでこうしました。
これでプレハブの中のテキストに表示させたい文字を設定できました。
これと次の生成のコードを逆に書いたのが失敗の始まりでした、今回のように表示する文字を設定してから表示、これが正解
Instantiate(dameteki, transform.position, transform.rotation);
インスタンティエートを使って生成したいもの、場所、向きを指定しました
インスタンティエートは、このページで勉強しました興味のある方は、どうぞー
表示させっぱなしのテキストを消去
destroy(オブジェクト、ディレイタイム)実は、これディレイタイムが使えるの、知らなかったのですが、いろいろ勉強してた時たまたまみてたので、使ってみたいと思います。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ftx_dcs : MonoBehaviour { // Use this for initialization void Start () { Destroy(gameObject, 1.0f); } // Update is called once per frame void Update () { } }
いったんプレハブをインスペクターにくっつけてスクリプトをcanvasにつけてapplyプレハブを改造してからインスペクターから消します
コメント