uenoakiko - dominickchen/cmrd GitHub Wiki
・5W1H
・反省
上野安貴子(うえのあきこ) ドミニクゼミ1期生
論文執筆:2018年11月中旬~12月上旬
制作:2018年10月中旬~12月上旬
実世界の植物と連動して遊べる植物育成ゲーム
VRやARなど、リアルとバーチャルの境界を曖昧なものにするゲームが増えているが、結局のところプレイヤーはVRゴーグルやスマートフォンの画面を見ているに過ぎない。
その点で、文字通り「画面を越えた」といえるようなゲームを作ってみたいと思ったから。
・以前から「空間を生かすことでリアルとバーチャルを連携させるのはどうか」というフィードバックをゼミ中に受けていた。
・それを踏まえ、プレイヤーの生活空間のインテリアと連動したゲーム=ゲーム内の植物(以下、CG植物)に触る(クリックして撫でる)とCG植物は嬉しそうに左右に揺れ、現実世界の植物(以下、インテリア植物)も同じように揺れることで、実際に癒しを得ながら遊べるゲームを作ろうと考えた。
・CG化が楽そうなシンプルなデザインのフェイクグリーンをニトリにて購入。
・購入したフェイクグリーンをフリーの3DCGソフトBlenderにてモデリングした。
参考:Blender Tutorial For Beginners: Coffee Cup - 1 of 2
・作成したCG植物のモデルをフリーのゲーム制作ソフトUnityにインポートした。
・開いた右手のイラストを描き、カーソルに設定した。
・「左クリックをすると、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;
}
}
}
・「左クリックをすると、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接続
・インテリア植物を分解し、茎とマイクロサーボを合体させ、それを切り抜いた土部分に埋め込んだ。
・「左クリックをすると、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
・5名には5分間、2名には5日間、計7名に本ゲームで遊んでもらった。
・CG植物とインテリア植物の揺れる動きを似せることができた。
・インテリア植物を正確にモデリングすることができなかった。
・ゲーム要素(ランダム性やコレクション要素など)をあまり加えることができなかった。
・技術的な問題。
・よりゲーム要素を加えることで、育成ゲームとして多くの人に遊んでもらいたい。
・リアル(マウス入力)→デジタル(CG植物の揺れ)→リアル(インテリア植物の揺れ)という入力/出力のかたちを生かせば、「画面を越えた」といえるゲームは作れるのではないだろうか。