uenoakiko - dominickchen/cmrd GitHub Wiki

目次

・5W1H
・反省

5W1H

Who

上野安貴子(うえのあきこ) ドミニクゼミ1期生

Where

When

論文執筆:2018年11月中旬~12月上旬
制作:2018年10月中旬~12月上旬

What

実世界の植物と連動して遊べる植物育成ゲーム

Why

VRやARなど、リアルとバーチャルの境界を曖昧なものにするゲームが増えているが、結局のところプレイヤーはVRゴーグルやスマートフォンの画面を見ているに過ぎない。
その点で、文字通り「画面を越えた」といえるようなゲームを作ってみたいと思ったから。

How

7月中旬:制作物の仮仕様決定

・以前から「空間を生かすことでリアルとバーチャルを連携させるのはどうか」というフィードバックをゼミ中に受けていた。
・それを踏まえ、プレイヤーの生活空間のインテリアと連動したゲーム=ゲーム内の植物(以下、CG植物)に触る(クリックして撫でる)とCG植物は嬉しそうに左右に揺れ、現実世界の植物(以下、インテリア植物)も同じように揺れることで、実際に癒しを得ながら遊べるゲームを作ろうと考えた。
・CG化が楽そうなシンプルなデザインのフェイクグリーンをニトリにて購入。
Image from Gyazo

10月中旬:CGモデリング

・購入したフェイクグリーンをフリーの3DCGソフトBlenderにてモデリングした。
Image from Gyazo
参考:Blender Tutorial For Beginners: Coffee Cup - 1 of 2

10月中旬:ゲーム制作(前半)

・作成したCG植物のモデルをフリーのゲーム制作ソフトUnityにインポートした。
Image from Gyazo
・開いた右手のイラストを描き、カーソルに設定した。
・「左クリックをすると、1秒間CG植物が左右に揺れる」という処理をC#で記述。

using UnityEngine;
using System.Collections;

public class SwingScript : MonoBehaviour
{
	public float speed = 1.0f; // 揺れる速さ
	public float maxRotation = 10.0f; // 揺れる最大角度
	public float swingDuration = 3f; // 揺れる秒数

	void Update()
	{
		if (Input.GetMouseButtonDown(0)) // 左クリックすると
		{
			StartCoroutine(Swing(swingDuration)); // コルーチン開始
		}
	}

	private IEnumerator Swing(float duration)
	{
		float startTime = Time.time;
		float endTime = startTime + duration;
		while (Time.time < endTime)
		{
			float timeSinceStart = Time.time - startTime;
			transform.rotation = Quaternion.Euler(0.0f, 0.0f, maxRotation * Mathf.Sin(timeSinceStart * speed));
			yield return null;
		}
	}
}

参考:Unity Answers

11月上旬~12月上旬:ゲーム制作(後半)、電子工作

・「左クリックをすると、1秒間インテリア植物が左右に揺れる」という出力のやり方が分からなかったため、先生にアドバイスを貰った。
・同時に「もっとゲーム要素を加えないとゲームとはいえない」というフィードバックもいただいたため、「3日間ゲームを起動しないと画面が暗転し、操作できなくなってしまう(植物の死)」というゲームオーバーを追加した。

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

public class GameOver: MonoBehaviour {

		float startTime;
		float limitTime= 259200.0f; // 3日間

		void Start()
		{
			startTime = Time.time;
		}

		void Update()
		{
			if (Time.time - startTime > limitTime) // 3日間操作しないと
			{	
				SceneManager.LoadScene("GameOverScene"); // ゲームオーバーシーンに遷移
			}
		}
	}

参考:Unity Answers/Unityでゲームの停止時間を取得する/Unity3D:一定時間マウス操作が無いと動き出す/Unityでフェードイン/フェードアウトを実装する方法

・アドバイスを踏まえ、Arduino unoとマイクロサーボ9g SG-90を購入。
・UnityとArduinoを連携させるアセットUNIDUINOを買うも、バージョンに対応していなかったため、UDUINOという別のアセットを購入。手順に従い連携させた。
参考:Unity2017でUDUINOを使ってArduino接続
・インテリア植物を分解し、茎とマイクロサーボを合体させ、それを切り抜いた土部分に埋め込んだ。
Image from Gyazo
・「左クリックをすると、1秒間インテリア植物が左右に揺れる=マイクロサーボが左右に回転する」という処理をC#で記述し完成。

using UnityEngine;
using System.Collections;
using Uduino;

public class ControllServo : MonoBehaviour {

	[Range(0,255)]
	public int servoValue;

	void Start () 
	{
		UduinoManager.Instance.pinMode (9, PinMode.Servo);   
	}
		
	void Update () 
		{
		if (Input.GetMouseButtonDown (0)) // 左クリックすると
		{ 
			UduinoManager.Instance.analogWrite (9, 0); // サーボが0まで回転

			Invoke ("DelayMethod", 0.5f); // 0.5秒後に
		}
	}

	void DelayMethod () 
	{
		UduinoManager.Instance.analogWrite (9, 30); // サーボが30まで回転
	}
}

参考:Control a Servo from Unity - Easy Uduino Tutorial
Image from Gyazo

12月上旬:実験

・5名には5分間、2名には5日間、計7名に本ゲームで遊んでもらった。

反省

【工夫した点】

・CG植物とインテリア植物の揺れる動きを似せることができた。

【できなかったこと】

・インテリア植物を正確にモデリングすることができなかった。
・ゲーム要素(ランダム性やコレクション要素など)をあまり加えることができなかった。

【なぜできなかったのか】

・技術的な問題。

【今後の展望】

・よりゲーム要素を加えることで、育成ゲームとして多くの人に遊んでもらいたい。
・リアル(マウス入力)→デジタル(CG植物の揺れ)→リアル(インテリア植物の揺れ)という入力/出力のかたちを生かせば、「画面を越えた」といえるゲームは作れるのではないだろうか。

【卒論】

URL

⚠️ **GitHub.com Fallback** ⚠️