【Day6 / 100】起業に向けてAIと二人三脚!ゲーム作り 100日チャレンジ【HP100の正方形】
こんにちは。ゆるふわ女医 Sakiです。
私は3Dモデリングを主軸とした起業を目指し、目下勉強中です。
3Dモデリングについては、アクセサリー作成を進めており、試作段階に入ったため、一旦3Dモデリングの勉強は一時中断中です✨✨
(✨詳細はまた後日✨)
そして、現在は新たな挑戦、Unityの練習に入っています😆
前回に引き続き、頼れるAI先生、Claudeに手引きしてもらいます🥸
今回のテーマは前回作ったゲームに「HPゲージをつける」です。
では、ゆるふわ女医名物、てんやわんやの勉強をお楽しみください✨
🎮 正方形をジャンプさせるゲーム「じゃんぴん正方形」にHPをつける
1.HPゲージをゲーム画面に表示するには何が必要か考える
いつもどおり、Claude先生からの質問です🧐。
「HPゲージをゲーム画面に表示する」のに必要なものをたずねられました。
前回とやることは基本的に同じですが追加する動作があるので、
「UIでHPを表示させる。スクリプトで正方形のHPの値を設定し、攻撃を受けた時に徐々に減らしていく。なので攻撃のスクリプトも必要。」
と答えます。

攻撃を受ける仕組みは複雑??どういうことでしょう🧐
まあ、いっか。
シンプルに「スペースキーを押す」→「HPが減る」という順序で実装していくことになりました。
2.HPゲージをスライダーで表示させる
前回同様にUIでスライダーを挿入していきます😆
Canvas右クリック > UI > Slider

おおー。挿入されていますね。
次にスライダーの位置を右下に変更します。
(x, y) = (330, -200)
続いて、「Max Value」= 1→10、「Min Value」=0(デフォルト)にします。
これでHP100の正方形ができました💪🏻
3. 新しくScriptを書いていく→GameManagerと紐づけ
また新しく「HPManager.cs」というスクリプト📃を作成しました。
余談ですが、最近スクリプトが増えてきたので、プロジェクトのところで、Assets直下に「Scripts」というフォルダを作成し、そこに今までのスクリプトを全てまとめました。
(ファイルの移動は勝手にUnityが紐づけてくれるらしいです🙌)

今回SliderというUIを使うにあたってScriptの始めに
using UnityEngine; に加えて、using UnityEngine.UI;という宣言も行います。
次いでHPManagerクラス内に「public Slider slider;」「public float HP = 10;」と変数を宣言。
スペースキーを押す度にSliderの値がスペースキーを押す度に1ずつ減少するので、Update()内にif文を使って処理を書きます。
// Update is called once per frame
void Update()
{
//スペースキーを押す度にSliderの値が1減少
if (Input.GetKeyDown(KeyCode.Space))
{
HP += -1;
slider.value = HP;
}
}いつも通りGameManagerとSliderをInspecterで紐づけます。
これでPlayすると、スペースキーを押す度にスライダーが右から左へ移動していきます。

ただし、一つ問題があります💦
10回以上スペースキーを押した場合、スライダー自体は左端から動くことはありませんが、HP自体は負の値となっています。

これは今後何らかのエラーにつながるかもしれないので、負の値をとらないようにHPManager.csのスクリプトを変更していきます。
私は0と自然数を定義するunitを使って変数を定義すればいいのかなと思ったのですが、Unityでは違う方法をとるようです。
if (HP < 0)
{
HP = 0;
}ifを使って条件分岐させる方法の方がよいようです。これを 「HP += -1;」と 「slider.value = HP;」に挟みます。

すると、HPが0になると、どんなにスペースキーを押してもHPは負の数にはならなくなりました🥳
🚀おまけ HPが0になったら、スペースキーに対して無反応にする
このままだと、HPが0になってもスペースキーを押し続けることができます。
そのため不自然なゲーム映像になってしまいます。
なので、ここは、HPが0になったらスペースキーに対して無反応になるようにコードを追加していきたいと思います。

今度は「MoveSquare.cs」のスクリプトを変更していきます。
HPの変数自体は「HPManager.cs」にあるので、
①HPManagerの変数HPを参照する
②正方形が跳ねる条件にHP>0を加える
の2点を変更していきます。
1. 別のスクリプトの変数を参照
まずMoveSquareクラスのところに「HPManager script;」を挿入します。これは「HPManager型の変数scriptを宣言する」という意味です。
これはまだ中身が空の箱を用意しているだけです。
次にStart()内にscript = GameObject.Find("GameManager").GetComponent<HPManager>();
と記述します。このコードは3つに分解でき、
① 「GameObject.Find("GameManager")」➡HierarchyからHPが0になる前から跳ねなくなっていますという名前のオブジェクトを探してくる(※HPManager.csを紐づけているオブジェクト⚠️)
②「.GetComponent<HPManager>()」➡そのオブジェクトからHPManagerスクリプトを取得する
③「script =」➡取得したHPManagerスクリプトを先ほどの空の箱に入れる
という意味になります。オブジェクトとコンポーネントの区別が少しややこしいですが💦
これで別のオブジェクトに紐づけられたスクリプトファイルから変数を参照することができます。
2. 条件文を付け足す
前回までの「正方形を跳ねさせる条件」は
「地面に着地しているとき ∧(且つ)スペースキーが押されたとき」でした。
そこで今回は更に「∧ HP>0」という条件を付け加えます。
且つは&&なので「&& script.HP > 0」とします。
if (isGrounded && script.HP > 0)
{
if (Input.GetKeyDown(KeyCode.Space))
{
GetComponent<Rigidbody2D>().AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
score += 1;
scoreText.text = "Score: " + score;
}
}これでスクリプトの編集は完了です。
Playして、どうなるか確認します。

静止画なのでわかりにくいですが、HPが0になったら、それ以上どれだけスペースキーを押しても正方形は跳ねなくなりました。
(※ボタンを押す+着地しているときしかスコアは増えません)
無事完成です🥳
🎮まとめ
今回はさっくりやっているように見えるかもしれませんが、そんなことありません。
実は、「おまけ」のオブジェクトの参照のところでオブジェクトの名前を勘違いして、間違えて設定していたため、エラーが起こり、すごく時間を食われました😱
それでもClaude先生のおかげで何とか解決し、完成させることができました🎉🎉🎉
いつもどおりClaude先生のまとめに入ります。
今回一番勉強になったのは、やはり「オブジェクトの参照」です。参照にしたいスクリプトが紐づけられたオブジェクトをヒエラルキーから探してくる、という一連の処理が分かっていなかったので、エラーも含めて非常に勉強になりました。
using UnityEngine.UIでUI道具箱の宣言、Sliderを使ったHPゲージの実装は簡単なので些末なことかな、と思います。
エラーの解決と深夜の作業でしんどくなって、かなりおざなりなまとめ。

フィードバックはこんな感じ😆
全てをそつなく、まとめてくれています✨
着実にスキルが積みあがったという評価もうれしいです👍
✨ほめ上手、Claude先生✨
今回も新しいゲームが無事に作れました🌸
ゲームが複雑化していくにつれて、エラーの解決時間が長くなっていっていますが、ゲーム制作の醍醐味を感じつつもあります😆
今回はここまで。今回使用したC#のコードは一番下に載せています。
よかったら、このゲーム作りにチャレンジしてみてください☺️
また、この記事が良いな😆と思われたら「スキ♥️」を頂けると励みになります😌
次回のチャレンジもお楽しみに✨
//MoveSquare.cs
using UnityEngine;
using TMPro;
public class MoveSquare : MonoBehaviour
{
public TMP_Text scoreText;
public float jumpForce = 5f;
public int score = 0;
HPManager script;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
script = GameObject.Find("GameManager").GetComponent<HPManager>();
}
public bool isGrounded = false;
void OnCollisionEnter2D(Collision2D col)
{
isGrounded = true;
}
void OnCollisionExit2D(Collision2D col)
{
isGrounded = false;
}
// Update is called once per frame
void Update()
{
// 端で跳ね返る
Vector3 pos = transform.position;
if (isGrounded && script.HP > 0)
{
if (Input.GetKeyDown(KeyCode.Space))
{
GetComponent<Rigidbody2D>().AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
score += 1;
scoreText.text = "Score: " + score;
}
}
}
}//HPManager.cs
using UnityEngine;
using UnityEngine.UI;
public class HPManager : MonoBehaviour
{
public Slider slider;
public int HP = 10;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
HP += -1;
if (HP < 0)
{
HP = 0;
}
slider.value = HP;
}
}
}
他にも、過去にこんなゲームを作りました😆
良かったら見てくださいね👍
いいなと思ったら応援しよう!
記事を読んで頂きありがとうございます。頂いたチップは製品開発に使用させて頂きます。今後ともよろしくお願いいたします🙇