前回ベースの素材を作ったので今回はブロックにあと何回ヒットしたら消えるかを表示します。
※この項目は後々#15 パフォーマンスを改善するで大幅に修正されます!決してやってはいけない訳ではないのですが大量に並べるという用途には合ってません。それでも読んでみたいという 奇特な方はアンチパターンとして生暖かい目でご覧ください
Create > UI > Text で、作成されたCanvasをBlockの中に入れます。
Render ModeをWorld SpaceにするとCanvasをオブジェクトのように扱うことができます。Blockオブジェクト1つ1つがCanvasを持つことになるので破壊された時にBlockを消去すれば一緒に消えてくれます。
設定はこんな感じです。
using を追加してUIを扱えるようにして、Start関数の中で子要素のテキストを取得して初期lifeを表示させます。OnCollisionEnterの中ではそのテキストを更新してます。
numTextをpublic変数にしてinspectorから登録しないのは、ステージを複数作ることを考えるとブロックを動的に生成して自身に取得させたほうが都合がいいからです。
Start()でsetBlockを呼び出してInstantiateで11個ブロックを生み出してます。
土台の横幅が9でブロックの横幅が0.8なので-(9/2)+(0.8/2) = -4.1、つまり左端を起点にして追加するたびに0.8ずつ右にずらして生成してます。
これを空のBlockBornという名前のオブジェクトを作ってアタッチします。
無事生成されました。
※この項目は後々#15 パフォーマンスを改善するで大幅に修正されます!決してやってはいけない訳ではないのですが大量に並べるという用途には合ってません。それでも読んでみたいという 奇特な方はアンチパターンとして生暖かい目でご覧ください
Canvasを使ってオブジェクト表面に表示
実装はCanvasをBlockに内包するして表面に貼り付けるようにします。Create > UI > Text で、作成されたCanvasをBlockの中に入れます。
Render ModeをWorld SpaceにするとCanvasをオブジェクトのように扱うことができます。Blockオブジェクト1つ1つがCanvasを持つことになるので破壊された時にBlockを消去すれば一緒に消えてくれます。
設定はこんな感じです。
慣れないと位置調整がめんどくさい。
Textの文字はあとでScriptで書き換えるのでなんでもいいです。
CanvasのRect TransformのPosYがなぜこんな中途半端かというと、Blockの高さが1に対してその半分の高さ + オフセットだからです。ぴったり0.5だとかすれます。
Block_lifeの修正
次に前回作ったBlock_lifeを修正します。
〜略〜
using UnityEngine.UI;
public class Block_life : MonoBehaviour {
public int life = 2;
Text numText;
void Start(){
GameObject child =
gameObject.transform.Find ("Canvas/Text").gameObject;
numText = child.GetComponent<Text>();
numText.text = life.ToString();
}
void OnCollisionEnter(Collision col){
if(col.gameObject.CompareTag("Ball")){
life -= 1;
}
if (life <= 0) {
Destroy (gameObject);
}
numText.text = life.ToString();
}
}
using を追加してUIを扱えるようにして、Start関数の中で子要素のテキストを取得して初期lifeを表示させます。OnCollisionEnterの中ではそのテキストを更新してます。
numTextをpublic変数にしてinspectorから登録しないのは、ステージを複数作ることを考えるとブロックを動的に生成して自身に取得させたほうが都合がいいからです。
自動生成させる
BlockBornという名前で自動生成スクリプトを書いていきます。
public class BlockBorn : MonoBehaviour {
public GameObject square; //ブロックオブジェクト
void Start () {
setBlock ();
}
public void setBlock(){
for (int i = 0; i < 11; i++) {
GameObject ob = Instantiate (
square,
new Vector3 (-4.1f + i * 0.8f, 0, 5),
Quaternion.identity)as GameObject;
}
}
}
Start()でsetBlockを呼び出してInstantiateで11個ブロックを生み出してます。
土台の横幅が9でブロックの横幅が0.8なので-(9/2)+(0.8/2) = -4.1、つまり左端を起点にして追加するたびに0.8ずつ右にずらして生成してます。
これを空のBlockBornという名前のオブジェクトを作ってアタッチします。
無事生成されました。
コメント
コメントを投稿