前回までの作業でゲームがかなり完成に近づいてきました。しかし、今の状態だと単に障害物をジャンプで避けるだけなので、シンプルなのは良いのですが単調すぎる気がします。できればもう少し駆け引きを楽しめるようなゲームにしたいものです。
そこで、今回のゲームでは得点アイテムの「コイン」を導入することにします。ここではコインの作り方はもちろん、そもそもゲームに得点アイテムがあるとなぜ楽しいのか?といった部分についても説明しますね。
なぜゲームに得点アイテムがあると楽しいのか?
では、まずは今言った「なぜゲームに得点アイテムがあると楽しいのか?」という根本的な部分について簡単に説明します(※)。
今回のゲーム「悪路王2020」の場合を含めて、一般的にゲームの得点アイテムは
- 取れば得点アップ
- 取らなくてもペナルティはない
というものだと思います。
それで、ここで重要なのが「得点アップの有無」と「ペナルティの有無」の組み合わせです。下の表をご覧ください。
得点アップあり | 得点アップ無し | |
ペナルティあり | 敵など | 穴などの障害物 |
ペナルティ無し | コインなどの得点アイテム | 普通の道など |
まず、ペナルティがあるゲーム要素は敵や障害物で、こうしたものにうまく対処しないとHPが減ったり、即ゲームオーバーになってしまったりしてしまいます。つまりペナルティがあるゲーム要素はプレイヤーにとっては「対処しなければならない障害」であり、ある種の「義務」が生じることになります。
一方で、ペナルティがないゲーム要素は特別対処しなくてもゲームオーバーになったりしないので、そういう意味ではプレイヤーの裁量次第だといえます。
さて、それを踏まえて得点アイテムの立ち位置を見てみましょう。得点アイテムは別に取らなくても問題はない(=取ることを強制されない)のですが、プレイヤーとしては「スコアを伸ばしたい!」という欲があるので「できればコインを取りたい」と考える人が多いと思います。
するとどうなるかというと、
- プレイヤーは自分の意志でコインを取るかどうかを判断する
- コインを取れれば気持ちが良いし、取れなかったら「次は頑張ろう」と思う→楽しい!
という流れになります。ここで重要なのが「自分の意志で」という部分で、やるかやらないかをプレイヤー自身が判断する余地があるから楽しいのです。そういう意味では得点アイテムはプレイヤーに選択の余地を与え、ゲームの楽しさをアップさせる重要な要素だと言えるでしょう。
※こういった根本的なことについてしっかり考えながらゲームを作ることで、「何となく」を減らして密度の濃いゲームにすることができます。
コインのゲームオブジェクトの作り方
…さて前置きが長くなってしまいましたが、ここからが本題です。コインのゲームオブジェクトを作り、スクリプトを書いていきましょう。
では、まずはコインのゲームオブジェクトを作ります。「くろくま基本アセット」を導入してあれば、「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オブジェクトにアタッチしましょう。それができたら忘れずにプレハブ化しておいてください。
次のページ→コイン生成オブジェクトの作り方