前回までの作業でゲームがかなり完成に近づいてきました。しかし、今の状態だと単に障害物をジャンプで避けるだけなので、シンプルなのは良いのですが単調すぎる気がします。できればもう少し駆け引きを楽しめるようなゲームにしたいものです。
そこで、今回のゲームでは得点アイテムの「コイン」を導入することにします。ここではコインの作り方はもちろん、そもそもゲームに得点アイテムがあるとなぜ楽しいのか?といった部分についても説明しますね。
なぜゲームに得点アイテムがあると楽しいのか?
では、まずは今言った「なぜゲームに得点アイテムがあると楽しいのか?」という根本的な部分について簡単に説明します(※)。
今回のゲーム「悪路王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オブジェクトにアタッチしましょう。それができたら忘れずにプレハブ化しておいてください。
次のページ→コイン生成オブジェクトの作り方

