ペット育成ゲームの作り方#4|ごはんとあそぶのボタンでお世話しよう

#4の完成GIF。ごはんを押すとペットが笑顔でジャンプし、おなかのゲージとコインが増えて、ボタンがしばらく灰色になる

ゲージが減っていくだけだと、ペットがかわいそうですよね・・・。育成ゲームの一番の楽しみは、やっぱりお世話!今回はペット育成ゲームのシリーズの4回目として、「ごはん」「あそぶ」のボタンでゲージを回復させ、お世話をするとコインがもらえるようにしてみたいと思います。効果音とBGMも付けて、いよいよゲームらしくなってきますよ!

目次

今回作るもの

  • 「ごはん」ボタンで、おなかが回復する
  • 「あそぶ」ボタンで、きげんが回復する
  • お世話をすると、コインが5枚もらえる
  • お世話をするとペットが喜ぶ(#2で作ったHappy)
  • ボタンを押したときの効果音と、ずっと流れるBGM
  • 押しすぎ防止:1回押したら、3秒間はボタンを押せない
スクリプト今回やること
PetControllerお世話を受け取るメソッド(Feed・Play)を追加する
CareButtonsボタンが押されたときの処理(新しく作る)

前回の続きから

  • Unityのバージョンは6.3 LTS
    • 記事作成時点では6000.3.22f1で確認しています
  • テンプレートはUniversal 2D
  • #3の状態:おなかときげんが時間で減ってゲージに反映され、少なくなるとペットがしょんぼりする

ボタンの基本は9-2 テキスト、ボタン、画像の基本UI要素、音の鳴らし方は12-1 音を鳴らそうで紹介しています。

音の素材を取り込もう

今回使う音は3つです。

  • se_feed.wav:ごはんをあげたときの「パクッ」
  • se_play.wav:あそんだときの「ピロリン」
  • bgm_home.wav:ずっと流れるBGM(約17秒でループ)

素材は下のリンクからダウンロードしてください。シリーズで使う画像と音が全部入っているので、1回ダウンロードすれば#8まで使えます。

取り込み方は2つあります。

  • かんたん:zipの中のPetRaisingAssets.unitypackageをダブルクリック(またはUnityでAssets>Import Package>Custom Package…)。画像の取り込み設定(Sprite・Single)ごと入ります
  • 自分で入れる:zipの中のPetRaisingフォルダを、UnityのAssetsにドラッグ&ドロップ(画像はSprite Mode:Singleにする)

素材は自由に使ってOKです(クレジット不要。作ったゲームの公開・販売にも使えます)。素材そのものの再配布はご遠慮ください。

  • PetRaisingの中に「Sounds」フォルダを作る
  • ダウンロードした3つのファイルを、Soundsにドラッグ&ドロップ
Assets/PetRaising/Soundsに、bgm_home・se_feed・se_playの3つの音が並んでいる

お世話を受け取れるようにしよう(PetController)

#3で作ったPetControllerに、お世話を受け取るメソッドを追加します。追加するのは「お世話」の変数と、Feed・Play・Careの3つのメソッドです。

using UnityEngine;

// ペットの状態を時間で減らし、少なくなったらしょんぼりさせる。お世話を受け取る
public class PetController : MonoBehaviour
{
    [SerializeField] private PetStatus status = new PetStatus();

    [Header("バランス")]
    [SerializeField] private float hoursToEmptyHunger = 6f; // おなかが100から0になるまでの時間(時間)
    [SerializeField] private float hoursToEmptyMood = 8f;   // きげんが100から0になるまでの時間(時間)
    [SerializeField] private float sadLine = 30f;           // これより少ないとしょんぼりする

    // ---- ここから追加 ----
    [Header("お世話")]
    [SerializeField] private float feedAmount = 30f;        // ごはんで回復するおなか
    [SerializeField] private float playAmount = 25f;        // あそぶで回復するきげん
    [SerializeField] private int coinsPerCare = 5;          // お世話1回でもらえるコイン
    // ---- ここまで追加 ----

    [Header("確認用")]
    [SerializeField] private float timeScale = 1f;          // 時間の進む速さ(確認するときだけ大きくする)

    [Header("参照")]
    [SerializeField] private Animator animator;
    [SerializeField] private StatusView statusView;

    private static readonly int SadHash = Animator.StringToHash("Sad");
    private static readonly int HappyHash = Animator.StringToHash("Happy"); // 追加

    public PetStatus Status => status;

    private void Update()
    {
        float seconds = Time.deltaTime * timeScale;

        status.hunger = Mathf.Max(0f, status.hunger - PerSecond(hoursToEmptyHunger) * seconds);
        status.mood = Mathf.Max(0f, status.mood - PerSecond(hoursToEmptyMood) * seconds);

        bool isSad = status.hunger < sadLine || status.mood < sadLine;
        animator.SetBool(SadHash, isSad);

        statusView.Show(status);
    }

    // ---- ここから追加 ----
    // ごはんをあげる:おなかが回復する
    public void Feed()
    {
        status.hunger = Mathf.Min(PetStatus.Max, status.hunger + feedAmount);
        Care();
    }

    // あそぶ:きげんが回復する
    public void Play()
    {
        status.mood = Mathf.Min(PetStatus.Max, status.mood + playAmount);
        Care();
    }

    // お世話したときに共通でやること
    private void Care()
    {
        status.coins += coinsPerCare;
        animator.SetTrigger(HappyHash);
        statusView.Show(status);
    }
    // ---- ここまで追加 ----

    // 「何時間で空になるか」から、1秒あたりに減る量を計算する
    private static float PerSecond(float hoursToEmpty)
    {
        return PetStatus.Max / (hoursToEmpty * 60f * 60f);
    }
}
  • Mathf.Min(PetStatus.Max, …)
    • 100より大きくならないようにする。#3のMathf.Maxの逆です
  • Care()にまとめる
    • コインをもらう・喜ぶ・表示を更新する、はごはんでもあそぶでも同じなので、1つのメソッドにまとめた
    • あとでお世話の種類を増やしても、Careを呼ぶだけでOK
    • メソッドの作り方は6-6 メソッドを作ろうで紹介しています
  • animator.SetTrigger
    • #2で作ったHappyのトリガー。しょんぼりしていても、Sad → Happyの矢印で喜んでくれます
  • FeedとPlayはpublic
    • ほかのスクリプト(CareButtons)から呼ぶため。Careは中だけで使うのでprivate

保存すると、PetのInspectorに「お世話」の項目が増えます。

PetのPet Controllerに、お世話のFeed Amount:30、Play Amount:25、Coins Per Care:5が追加されている

ボタンの処理を作ろう(CareButtons)

ボタンが押されたときの処理です。音を鳴らすのと、押しすぎ防止もここでやります。

  • PetRaising/Scriptsに「CareButtons」を作る
using UnityEngine;
using UnityEngine.UI;

// 「ごはん」「あそぶ」ボタンが押されたときに、ペットのお世話をして効果音を鳴らす
public class CareButtons : MonoBehaviour
{
    [SerializeField] private PetController pet;
    [SerializeField] private Button feedButton;
    [SerializeField] private Button playButton;
    [SerializeField] private float cooldown = 3f; // 1回押したら、次に押せるまでの秒数

    [Header("効果音")]
    [SerializeField] private AudioSource seSource;
    [SerializeField] private AudioClip feedSe;
    [SerializeField] private AudioClip playSe;

    private float cooldownLeft;

    private void Update()
    {
        if (cooldownLeft > 0f)
        {
            cooldownLeft -= Time.deltaTime;
        }

        // 待ち時間の間は、ボタンを押せなくする(灰色になる)
        bool isReady = cooldownLeft <= 0f;
        feedButton.interactable = isReady;
        playButton.interactable = isReady;
    }

    // 「ごはん」ボタンの On Click に登録する
    public void OnFeed()
    {
        pet.Feed();
        seSource.PlayOneShot(feedSe);
        cooldownLeft = cooldown;
    }

    // 「あそぶ」ボタンの On Click に登録する
    public void OnPlay()
    {
        pet.Play();
        seSource.PlayOneShot(playSe);
        cooldownLeft = cooldown;
    }
}
  • OnFeed・OnPlayはpublic
    • ボタンのOn Click ()に登録するメソッドは、publicにしておく必要がある
  • PlayOneShot
    • 効果音を鳴らす。同じAudio Sourceで、音を重ねて鳴らせる
  • cooldownLeft
    • 残りの待ち時間。押したらcooldown(3秒)を入れて、Updateで少しずつ減らす
  • interactable
    • falseにすると、ボタンが押せなくなって灰色になる。0秒になったらtrueに戻る
スライム

押しすぎ防止がないと、ボタンを連打するだけでコインが無限に増えちゃいます・・・

フェアリー

3秒待つだけでも「ちょっと待ってね」って感じになるし、ペットが喜ぶアニメーションも最後まで見られるよ!

音を鳴らす準備をしよう

BGM

  • Hierarchyで右クリック>Create Empty で「BGM」を作る
  • Add Component>Audio Source
    • Audio Generator:bgm_home
      • Unity 6.3では、音のファイルを入れる欄の名前が「AudioClip」から「Audio Generator」に変わっています
    • Play On Awake:チェック
    • Loop:チェック
    • Volume:0.4(BGMは効果音より小さめに)
BGMのAudio Source。Audio Generatorがbgm_home、Play On AwakeとLoopにチェック、Volumeが0.4

効果音

  • Hierarchyで右クリック>Create Empty で「SE」を作る
  • Add Component>Audio Source
    • Audio Generator:空(None)のままでOK(鳴らす音はPlayOneShotに渡すので)
    • Play On Awake:チェックを外す
SEのAudio Source。Audio GeneratorがNone、Play On Awakeのチェックなし

BGMと効果音でAudio Sourceを分けておくと、「BGMだけ小さくしたい」ときに片方だけ変えられて便利です。

ボタンにつなごう

CareButtonsを付ける

  • HierarchyでButtonBarを選び、Add Component>CareButtons
  • 次のようにドラッグ&ドロップする
    • Pet:Pet
    • Feed Button:FeedButton
    • Play Button:PlayButton
    • Se Source:SE
    • Feed Se:se_feed
    • Play Se:se_play
ButtonBarのCare Buttons。Pet・Feed Button・Play Button・Cooldown・Se Source・Feed Se・Play Seが設定されている

On Click ()に登録する

  • HierarchyでFeedButtonを選ぶ
  • ButtonコンポーネントのOn Click ()の「+」を押す
  • 左下の欄にButtonBarをドラッグ&ドロップ
  • 右の「No Function」から、CareButtons>OnFeed ()を選ぶ
  • PlayButtonも同じようにして、CareButtons>OnPlay ()を選ぶ
FeedButtonのOn Click ()に、ButtonBarのCareButtons.OnFeedが登録されている

ショップのボタンは、#7で使います。今は押しても何も起きないままでOKです。

動かして確認しよう

  • 再生(▶)する
    • BGMが流れることを確認
  • 「ごはん」を押す
    • 「パクッ」と鳴って、ペットが喜んでジャンプする
    • おなかのゲージが増えて、コインが5枚増える
    • 3秒間、ボタンが灰色になって押せなくなる
  • 「あそぶ」を押す
    • 「ピロリン」と鳴って、きげんのゲージが増える
ごはんを押したあとの画面。おなかのゲージが増えてコインが5になり、ごはん・あそぶのボタンが灰色になっている

しょんぼりしているときに押すと、ちゃんと喜んでから、またしょんぼりに戻ります。おなかが30を超えるまでごはんをあげれば、元気な顔に戻ってくれますよ!

お世話のバランスを考えよう

#3で「6時間でおなかが空になる」速さにしたので、回復の量もそれに合わせています。

  • ごはん1回で30回復
    • 空っぽ(0)から満タンにするには、4回押す
    • 1回で全部回復しないので、何回かあげる楽しみがある
  • あそぶ1回で25回復
    • きげんは減るのがゆっくりなので、回復も少し控えめにした
  • お世話1回でコイン5枚
    • #7のショップで、おやつを1つ買うのに4〜5回お世話するぐらいにする予定です

数字はInspectorから変えられるので、実際に遊んでみて「ちょうどいい」と思うところを探してみてください。

あとがき

今回はボタンでお世話をして、ゲージの回復とコイン、効果音とBGMまで付けました。これで「放っておくと減る → お世話して回復する」の基本の遊びが出来ました!ただ、今はゲームを閉じると時間が止まってしまいます。次回は、閉じている間も時間が進むようにして、久しぶりに開いたときにおなかが減っている仕組みを作りたいと思います!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (1件)

コメントする

目次