得点アイテム(コイン)の作り方

前回までの作業でゲームがかなり完成に近づいてきました。しかし、今の状態だと単に障害物をジャンプで避けるだけなので、シンプルなのは良いのですが単調すぎる気がします。できればもう少し駆け引きを楽しめるようなゲームにしたいものです。

そこで、今回のゲームでは得点アイテムの「コイン」を導入することにします。ここではコインの作り方はもちろん、そもそもゲームに得点アイテムがあるとなぜ楽しいのか?といった部分についても説明しますね。

スポンサーリンク

なぜゲームに得点アイテムがあると楽しいのか?

では、まずは今言った「なぜゲームに得点アイテムがあると楽しいのか?」という根本的な部分について簡単に説明します(※)。

今回のゲーム「悪路王2020」の場合を含めて、一般的にゲームの得点アイテムは

  • 取れば得点アップ
  • 取らなくてもペナルティはない

というものだと思います。

それで、ここで重要なのが「得点アップの有無」と「ペナルティの有無」の組み合わせです。下の表をご覧ください。

得点アップあり 得点アップ無し
ペナルティあり 敵など 穴などの障害物
ペナルティ無し コインなどの得点アイテム 普通の道など

まず、ペナルティがあるゲーム要素は敵や障害物で、こうしたものにうまく対処しないとHPが減ったり、即ゲームオーバーになってしまったりしてしまいます。つまりペナルティがあるゲーム要素はプレイヤーにとっては「対処しなければならない障害」であり、ある種の「義務」が生じることになります。

一方で、ペナルティがないゲーム要素は特別対処しなくてもゲームオーバーになったりしないので、そういう意味ではプレイヤーの裁量次第だといえます。

さて、それを踏まえて得点アイテムの立ち位置を見てみましょう。得点アイテムは別に取らなくても問題はない(=取ることを強制されない)のですが、プレイヤーとしては「スコアを伸ばしたい!」という欲があるので「できればコインを取りたい」と考える人が多いと思います。

するとどうなるかというと、

  1. プレイヤーは自分の意志でコインを取るかどうかを判断する
  2. コインを取れれば気持ちが良いし、取れなかったら「次は頑張ろう」と思う→楽しい!

という流れになります。ここで重要なのが「自分の意志で」という部分で、やるかやらないかをプレイヤー自身が判断する余地があるから楽しいのです。そういう意味では得点アイテムはプレイヤーに選択の余地を与え、ゲームの楽しさをアップさせる重要な要素だと言えるでしょう。


※こういった根本的なことについてしっかり考えながらゲームを作ることで、「何となく」を減らして密度の濃いゲームにすることができます。

コインのゲームオブジェクトの作り方

…さて前置きが長くなってしまいましたが、ここからが本題です。コインのゲームオブジェクトを作り、スクリプトを書いていきましょう。

では、まずはコインのゲームオブジェクトを作ります。「くろくま基本アセット」を導入してあれば、「Sprites」→「Basic」フォルダ内に白い円のスプライトがあると思うので、それをシーンにドラッグ&ドロップしてください。そうしたら

  • 名前:Coin
  • タグ:Item
  • レイヤー:Item

という風に変更して、下の画像のようにコンポーネントをアタッチ&設定してください。

コインのゲームオブジェクトのコンポーネント

コインのC#スクリプト

そうしたら、次はコインのC#スクリプトを書きます。新しいC#スクリプトを作り、名前を「Coin」に変更したら次のスクリプトを書いてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Coin : MonoBehaviour
{

    [SerializeField]
    AudioClip getSe = null;

    GameManager gameManager;
    SoundManager soundManager;
    int score = 100;    //とりあえずデフォルト値を100としておく
    float speed = 5;    //とりあえずデフォルト値を5としておく

    public int Score
    {
        set
        {
            score = Mathf.Max(value, 0);
        }
    }

    public float Speed
    {
        set
        {
            speed = value;
        }
    }

    private void Start()
    {
        gameManager = GameObject.FindGameObjectWithTag("GameController").GetComponent<GameManager>();
        soundManager = GameObject.FindGameObjectWithTag("GameController").GetComponent<SoundManager>();
    }

    void Update()
    {
        transform.position = new Vector2(transform.position.x - speed * Time.deltaTime, transform.position.y);
    }

    //プレイヤーが接触したらスコア加算
    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            if(getSe != null)
            {
                soundManager.PlaySeByName(getSe.name);
            }

            gameManager.Score += score;
            Destroy(gameObject);
        }
    }

    //画面外に出たら破棄(※テストプレイ時にシーンビューに映っていると破棄されないので注意)
    private void OnBecameInvisible()
    {
        Destroy(gameObject);
    }

}

書けたら、これを先ほど作ったCoinオブジェクトにアタッチしましょう。それができたら忘れずにプレハブ化しておいてください。


次のページ→コイン生成オブジェクトの作り方