はじめまして、フリーランスのますみです!
『一人一人が自立・共存・革新している「クリエイターエコノミー」を創る。』というビジョンに向けて活動しています。
この記事では、Unityというゲーム開発エンジンを使って、「星集めゲーム」を作っていきます。具体的には、「盤面の端っこにある星をどれだけ速く集められるかを競うゲーム」です。
【このコースの全体像】
1. Unity入門編 〜インストールしてみよう〜
2. Unity基礎編 〜ボールを動かしてみよう〜
3. Unity発展編 〜星集めゲームを作ろう〜
コンテンツ
1. プロジェクトの確認
【1. Unity入門編 〜インストールしてみよう〜】を参考にして環境構築・プロジェクト作成を行い、【2. Unity基礎編 〜ボールを動かしてみよう〜】にて、ボールを矢印キーで動かせるようにできていることを前提としています。
Unityで実行して、矢印キーで動かせるかまず確認しましょう。
2. 星オブジェクトの生成
次に、メインとなる星のオブジェクトを生成してみましょう。
今回は、簡易的に作成するために、Cube
に星のエフェクトをつけることで、星っぽさを出しました。
Hierarchy > Create > 3D Object > Cube
を選択します。
すると、以下のようにCube
が現れると思います。
このオブジェクトを盤面の端に動かしましょう。
私は、Position(位置)を(4, 0.5, -4)の位置に動かしました。
3. 星エフェクトの追加
続いて、Hierarchy > Create > Effects > Particle System
をクリックしましょう。
すると、以下のように星が出てくると思います。
続いて、このエフェクト(Particle System
)を星オブジェクト(Cube
)の中にドラッグ&ドロップで入れます。
星オブジェクト(Cube
)の中央からエフェクト(Particle System
)を出したいため、エフェクト(Particle System
)のpositionを(0, 0, 0)にしましょう。
そして、以下のように自由に星エフェクト(Particle System
)の設定を調整しましょう。
最後に、星オブジェクト(Cube
)の大きさを調整しましょう。
3. ボールと星オブジェクトの接触判定の追加
続いて、ボールが星オブジェクトに触れたら消える処理を書いていきます。
まず、星オブジェクトにTag
を追加していきましょう。
以下のようにCube
を選択して、Tag > Add Tag
を選択します。
すると、Tag
の管理画面が出てくるため、+
ボタンをクリックします。
そして、Star
と入力して、Save
をクリックします。
すると、Star
というタグが追加されたことがわかります。
もう一度Cube
を選択して、TagをStar
にします。
以下のようにTag
がStar
になれば、タグ付け成功です!
タグが設定できたら、ボールオブジェクト(Sphere
)において、Add Component > new script > get_star > Create and Add
をして、スクリプトを生成します。
get_star.cs
というファイルが以下のように生成されたら、ファイルをVisual Studioなどで開いてみましょう。
以下のようにStar
タグに触れた時、星オブジェクトを削除するというコードを書きましょう。
もしも書き終わったら、保存・ビルドをして、エラーがないか確認しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class get_star : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
void OnTriggerEnter(Collider star)
{
if(star.gameObject.tag == "Star")
{
Destroy(star.gameObject);
}
}
}
そしたら、当たり判定を有効にするために、Unity上で星オブジェクト(Cube
)のBox Collider
というComponentのIs Trigger
というチェックボックスをチェックしましょう。もしもチェックが入れられたら、実行してみましょう。
以下のように出ているオブジェクトに向かって、ボールを動かします。
星オブジェクトが消えたら成功です!
うまく星オブジェクトを取ることができたら、停止しましょう。
4. タイムアタック機能の作成
続いて、Hierarchy > Create > UI > Text
を選択して、いきましょう。
UIのテキストが追加されたか確認するために、一度実行しましょう。
下部に小さなテキストが見えると思います。初めは中央から離れた場所に生成されます。
Text
のコンポーネントの設定を変えて、ちょうどいい大きさなどにしましょう。
Add Component > new script > time_attack > Create and Add
という順で、タイムアタック用のスクリプトをUIのテキストに生成して、追加します。
以下のようにtime_attack.cs
というファイルが生成されているか確認しましょう。
もしも生成に成功したら、ファイルを開き、コーディングしていきましょう。
続いて、以下のように時間に伴って、タイムが増えて、それを表示するスクリプトを書きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class time_attack : MonoBehaviour
{
float time;
// Start is called before the first frame update
void Start()
{
time = 0.0f;
}
// Update is called once per frame
void Update()
{
time += Time.deltaTime;
gameObject.GetComponent<Text>().text = time.ToString("F2");
}
}
保存・ビルドして、エラーが出なければ、Unityで確認していきましょう。
しっかりと時間が増えて、テキストが更新されれば成功です!
最後に、Star
タグのついたオブジェクトを全て回収したら、時間が止まるようにしたいと思います。
以下のようにコードを編集しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class time_attack : MonoBehaviour
{
float time;
public GameObject[] starObj;
// Start is called before the first frame update
void Start()
{
time = 0.0f;
}
// Update is called once per frame
void Update()
{
starObj = GameObject.FindGameObjectsWithTag("Star");
if (starObj.Length != 0) {
time += Time.deltaTime;
gameObject.GetComponent<Text>().text = time.ToString("F2");
}
}
}
編集し終わったら、実行してチェックしましょう。
もしも時間がしっかりと止まれば成功です!
5. リスタートボタンの作成
続いて、ゲームをもう一度遊ぶためのリスタートボタンを作成していきましょう。
Create > UI > Button
から新しいボタンを追加します。
以下のようにボタンが表示されれば成功です。
ボタンを右下などに動かして、好きな位置に配置しましょう。
Button
の中のText
を選択して、文字やフォントを好きなように編集しましょう。
リスタートボタンが押されたら、リスタートするスクリプトを生成しましょう。
Button
オブジェクトを選択して、Add Component > new script > restart > Create and Add
から新しいスクリプトを生成して、追加しましょう。
以下のようにスクリプトが生成されたら成功です。
次に、現在編集しているゲームのSceneを再ロードするため、Sceneの名前をわかりやすい名前に変更しましょう。
デフォルトでは、SampleScene
になっていると思います。
これをGameScene
に変更しましょう。
これで準備完了です。
以下のようにrestart.cs
を開いて、コーディングしていきましょう。
以下のようにボタンがクリックされたら、GameScene
をリロードするというようなスクリプトを書きましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class restart : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
gameObject.GetComponent<Button>().onClick.AddListener(RestartGame);
}
// Update is called once per frame
void Update()
{
}
void RestartGame()
{
SceneManager.LoadScene("GameScene");
}
}
それでは、Unityを実行して、リスタートされるか確認しましょう。
6. 星オブジェクトの複製と配置
最後に、星オブジェクトを好きな個数だけ好きな位置に配置して、完成です。
以下のようにCube
を右クリックして、Duplicate
を選ぶと、複製することができます。
以下のようにCube(1)
が生成されたでしょうか?
Cube
とCube(1)
が同じ位置にあるため、おそらくゲーム画面ではオブジェクト自体は増えているように見えないかもしれません。
私は、以下のように3回複製しました。
そして、以下のように重なっているため、位置を調整しましょう。
私は以下のように4つの角に動かしました。
最後に、実行して確認していきましょう。
もしも
- 星オブジェクトが複数出てきて、
- 全て回収して、時間がとまって、
- Restartボタンを押して、もう一度遊べるようになったら、
大成功です!
これで、Unityコース
は修了です。
ぜひたくさんアレンジして、面白いゲームにして、twitterなどでシェアしてくれると嬉しいです!
【このコースの全体像】
1. Unity入門編 〜インストールしてみよう〜
2. Unity基礎編 〜ボールを動かしてみよう〜
3. Unity発展編 〜星集めゲームを作ろう〜
最後に
最後まで読んでくださり、ありがとうございました!
いかがだったでしょうか?
この記事を通して、少しでもあなたの学びに役立てば幸いです!
おまけ
エンジニアの仲間(データサイエンティストも含む)を増やしたいため、公式LINEを始めました🎉
「一緒に仕事をしてくれる方」「友だちとして仲良くしてくれる方」は、友だち追加をしていただけますと嬉しいです!(仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆)
とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました!
友だち追加後に、アンケートに回答してくれた方へ「エンジニア図鑑(職種20選)」のPDFをお送りします◎