HPバーを実装していきます(スクリプト間変数やりとり使用)
攻撃を受けた時、ダメージを受けます、その減り具合を一目でわかるようにゲージを敵キャラの上につけていきます。
今回のテーマは、スクリプト間で変数を参照することです
目次 1全体の流れ 今回の概要です 2敵キャラ(Cube)にHP表示をくっつける(見た目) まずは、見た目を整えていきます。 3さっそくスクリプトを貼ります 苦労しました。 4何をおこなっているのか説明 苦労したのに、コードは、かなり少ない いいことでは、あるのですが 5ひとつづつ解説 がんばりました、スクリプト間での変数のやり取りを 覚えたのが今回のかなりの収穫です 6まとめ
このページ作った時に買ったものではないですが、僕の買ったやつの2019版ですかね、どうせ買うなら、最新版、自分の使ってるunityのバージョンと合わせて買いましょう、安心ですよ※このページの内容が丸ごと乗っているわけではないです、この本プラスネット検索が大事かもです、でも1冊以上は、買ったほうがいいかもですので、おすすめのやつを紹介
1全体の流れ
今回難しそうなのは、変数をスクリプト間でやり取りするところ
まずは、ヒエラルキーでcanvasを作成それにスライダーを付けて敵オブジェクトの子にする
3Dだから常にカメラに向いてもらう
体力設定も作る
攻撃(別のページで、インターフェースを使ってやったよ、興味がある方は、カテゴリからどうぞー)
ダメージに合わせてゲージ(スライダーを動かす)
2.敵キャラにHP表示をくっつける
まだみためだけですが、敵キャラ(cube)をつくり、ヒエラルキーのところでcreate,ui,sliderと選択していきスライダーを作り、名前は、それぞれhpcanvas,hpsliderにしました。
canvasが設置する領域
sliderが全体
backgroundがスライダーの背景(体力がないときに見える背景)
fill area
fillが体力自体としてつかいます
Handle Slide Area これは、体力ゲージには、いらないから消します(マウスでクリックしてスライダーを操作するあれです)
hpcanvasの設定
そして敵キャラの上に配置しようとしたら動かないインスペクターのところでhpcanvasの設定項目のRender Modeをworld spaceにしたら動かせるようになりました(これは、UIを動かしたいときに設定するものらしいです)好みで敵キャラとスライダーの位置、サイズを設定してください。僕の場合は、下の項目もいじりながら戻って調整戻って調整でかなり大変でした
hpsliderの設定
インスペクターのsliderscliptのdirectionの項目でスライドの方向を変えれるみたいです、僕は、left to rightを選びました
backgroundの設定
hpsliderの子要素に最初からあるはずなので、そこを開いて設定していきます。スライダーの背景らしいです、インスペクターのImage(script)の項目のsource imageでnoneを選択すると四角になるみたいです、僕は、これにします。colorは赤にしました
いつかは、デザインしたかっこいいやつ使ってみたいです
Fill areaの設定
recttransformの値だけ変更します、数値は、あとで何個かまとめてかきます
Fillの設定
Fill areaの子要素にあります、開いて設定していきます、
Image(script)の項目のsource imageでnoneを選択しcolorを好みの色にします僕は、緑にしました
backgroundとFill areaとFillの値の設定
それぞれのインスペクター内のRect transformは、たぶん統一がいいと思います。
まだ詳しくないのでどれがどれかわからないのですがCanvasが親に指定されてるのであればそれを基準にされるのだと思います
Rect transform内の
left top pos Z
Right Bottom
この5つのあたいは、backgroundとFill areaとFillで統一しといたほうがいいかも
この3つ×5つの値ぼくは、全部0にしました
たぶんですがスライダーのサイズで調整するほうが楽だと思ったからです
3スクリプトをはります
スライダーをいじるためのスクリプト
スライダーをくっつけているCanvasにスクリプトをアタッチします。
どこにアタッチするのが適切か実は、わかってないですが、Canvasにアタッチしておけば動きました
たぶんスクリプト内の親子関係の記述をもうちょい勉強しなきゃ(新しい課題です)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; //これ忘れないよう注意 public class tekihp_03 : MonoBehaviour { private hakoste_02 hakosteyou; //hakoste_02(前に作った敵キャラのスクリプトです //たぶんこうやって宣言したらそこにある変数を使える? private Slider hpslider; //スライダーを動かすための宣言 hpsliderというものを作りました // Use this for initialization void Start () { //敵のHPの値を参照するための儀式です //hakoste_02(敵のステータス管理用に作ったスクリプトです) //tranform.root これをやるとヒエラルキー上での親子かんでやりとりができるらしいです //それを指定しそこにあるhakoste_02をゲットコンポーネントします hakosteyou = transform.root.GetComponent<hakoste_02>(); //transform.Find("")でスライダーの名前指定で探します //たぶんtransform.Find transform.root はオブジェクトが親子関係の時使えるものです //上で宣言したスライダー用の箱(hpslider)にSliderの機能をゲットコンポーネントします //今回スライダーの名前は、いじってないのでSliderのままです、必要に応じて名前かえてもいいかも hpslider = transform.Find("Slider").GetComponent<Slider>(); } // Update is called once per frame void Update () { hpslider.value = hakosteyou.hako_hp; } }
実際僕が試行錯誤しながら意味を調べながらコメントを書いていきましたが、見にくかったので、必要なやつを赤文字にしました
敵オブジェクトにアタッチしているスクリプト
今回の関係している部分だけ、貼り付けます
ファイル名は、hakoste_02.csと名付けてあります。
public int hako_hp = 100;
4.スクリプトのながれ
スライダーを動作させるための宣言
敵キャラのhpを管理しているスクリプトにアクセスするための宣言
取得してきたhpをスライダーに反映
たったこれだけなのですが理解するのにかなり大変でした
5スクリプトの解説
using UnityEngine.UI;
using ~~が並んでるところにこれを書いておけばUI今回は、スライダーがいじれるようになります、おまじないなので、忘れないよう書きましょう
private hakoste_02 hakosteyou;
これこれ、今回苦労したところの一つですhakoste_02(僕が敵キャラ用に作ったスクリプトの名前です)
スクリプトの中の変数を参照するために必要なので宣言しました
private Slider hpslider;
スライダーを操作するためにhpsliderという名前で作りました
宣言しといてください
hakosteyou = transform.root.GetComponent<hakoste_02>();
今回苦労したところパート2です
どうやったらほかのスクリプトの変数を参照できるか大変でした
transform.rootこれがたぶん親子関係で探し出すやつ?
hakosteyou(さっき宣言した奴)これにゲットコンポーネントでhakoste_02の中身を参照できるようになりました、たぶんほかにもこの中に入っているいろいろなものをいろいろなことに使えるらしいですが、まだ勉強してないので
hpslider = transform.Find(“Slider”).GetComponent<Slider>();
上のと似てますが今度は、Find使って名前で探してみましたそしてゲットコンポーネント<Slider>はたぶんunityが準備してある機能です
hpslider.value = hakosteyou.hako_hp;
今回苦労したところパート3です
さっき宣言したhpslider(Sliderの機能を使えるようにしたやつ)にhakosteyou(ゲットコンポーネントしてhakoste_02.csにアクセスできるようにしたやつ)からhpを持ってきてvalueを変えればスライダーが動きます
hpslider.value こう書くことでhpsliderのvalue(スライダーの機能value)を変えることができます。
hakosteyou.hpこう書くことでhakosteyou(hakoste_02.csにアクセスできるようになっている)の中にあるhp(public int hako_hp = 100; hakoste_02.csでこういう風に宣言してあります)を参照できます
update()に書いてあるのでhako_hpを毎回参照してその数値を代入してスライダーを動かすことができるようになりました。
6まとめ
こんかいスクリプト親子関係にあるものだけを参照しあうやり方を覚えました
いろんな使い方ができそうです
宣言してそのはこに探してゲットコンポーネントです
きになるのは、親子関係にないファイルを呼び出すやり方がインターフェースを使ったやり方しかわかりません(transform. を使えるのがルート(親子関係をこういうらしい)関係だけなのかも実験してみたいです
もしかしたらfind系を使えばいけるのか?まだまだいろいろがんばっておぼえていきます
まちがってるところ、こうやったらもっと簡単に書けるよとかあれば、教えてください、まってまーす
ちょっとこれつかえるかも?GameObject.Find( “名前” );今度実験してみます
コメント