UnityとArduinoを使っておみくじゲームを作ろう
今回は最近個人的にハマっているUnityとArduinoを使ったゲーム制作を紹介したいと思います。
ゲームアイディア
まず、Unity上におみくじ筒を設置します。Arduinoを利用しておみくじ筒を傾けて、Arduino側がある一定の傾きを検知するとUnity側で画面遷移して、ランダムで大吉や中吉などのおみくじがランダムで表示されるおみくじゲームを作りました。
用意するもの
・Unity バージョン2022.3.8.f1
・Arduino IDE
・Arduino Mega
・Wit Motion(ジャイロセンサ)
・ジャンパー線
・MAX3323(RS232をTTLに変換するモジュール)
UnityとArduinoを連携させる
まず、Unityでゲームを作る前にこのゲームで大切なUnityとArduinoの連携を行います。
Arduino側
Arduinoに書き込むソースコードははGiot hubから参照しました
。URLは下記に添付します。
・https://github.com/WITMOTION/WitStandardModbus_WT901C485
このソースコードを使うとき、REG.h、wit_c_sdk.hなどのライブラリを入れてあげないとエラーが起こるので注意してください。
Unity側
今回ArduinoとUnityを連携させるときの方法として、シリアル通信をして連携させました。参考サイトは下記に添付します。
・https://qiita.com/Ninagawa_Izumi/items/f6595dcf788dd316be8a
ここで「SerialReceive」というスクリプトがあって参考URLのコードから少し書き換えましたが、またあとで説明します。
おみくじゲーム作成
①スタート画面作成
まず背景を設置します。背景の設置の仕方は下記のサイトを参考にしました。
・https://uni.gas.mixh.jp/unity/canvas-text-image.html
画像はネットから適当に引っ張てきました。
次にスタート画面からゲーム画面に画面遷移させるための ボタンを作ります。
ボタンの仕様はボタンを押したときに効果音が流れてきて、そのあとに画面遷移するようにしました。そのときのスプリクトは下記です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ChangeScenes : MonoBehaviour
{
public GameObject audioObject;
//ボタンタップで呼ばれるメソッド
public void Audio()
{
audioObject.GetComponent().Play();
//1秒後にTappButtonを呼び出す
Invoke(nameof(TappedButton), 1.0f);
}
public void TappedButton()
{
SceneManager.LoadScene("PlayScene");
}
}
画面遷移:https://nosystemnolife.com/unity-scene/
効果音:https://tech.pjin.jp/blog/2020/12/31/unity-audio
②ゲーム画面
背景はスタート画面の時と同様のやり方で設置して、おみくじの筒は下記のURLを参考にしました。
筒の作り方:https://3dcg-school.pro/unity-probuilder-tutorial/
筒に文字を張り付ける:https://qiita.com/rival/items/f45ad362297c9fc86bef
ジャイロセンサーを振ると、画面上のおみくじも動いて、ジャイロセンサーがある一定の角度を超えると、画面遷移するようにしたプログラムです。画面遷移時にはフェードインします。そのスクリプトは下記です。
void OnDataReceived(string message)
{
var data = message.Split(new string[] { "\n" }, System.StringSplitOptions.None);
try
{
var str_xyz_deg = data[0].Split(new string[] { "," }, System.StringSplitOptions.None);
float x_deg, y_deg, z_deg;
x_deg = float.Parse(str_xyz_deg[0]);
y_deg = float.Parse(str_xyz_deg[1]);
z_deg = float.Parse(str_xyz_deg[2]);
//条件下でセンサを傾けるとおみくじの筒が傾く
if( (x_deg <= 30) && (x_deg >= -30) && (y_deg <= 30) && (y_deg >= -30) )
{
transform.rotation = Quaternion.Euler(x_deg,0,y_deg);
}
//条件下でセンサを傾けると画面遷移
if( (x_deg >= 30) || (x_deg <= -30) || (y_deg >= 30) || (y_deg <= -30) )
{
//条件下でセンサを傾けるとおみくじから音が鳴る
if( (x_deg >= 5) || (x_deg <= -5) || (y_deg >= 10) || (y_deg <= -10) || (z_deg >= 10) || (z_deg<=-10))
{
GetComponent().Play();
}
fade.FadeIn(6f, () => SceneManager.LoadScene("Result Scene"));
}
Debug.Log(data[0]);//Unityのコンソールに受信データを表示
}
catch (System.Exception e)
{
Debug.LogWarning(e.Message);//エラーを表示
}
}
③おみくじの結果
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ramdoms : MonoBehaviour
{
[SerializeField] GameObject image1, image2, image3, image4, image5;
int number;
// Start is called before the first frame update
void Start()
{
number = Random.Range(1, 5);
}
// Update is called once per frame
void Update()
{
GameObject[] images = new GameObject[5]; // 5つのゲームオブジェクトを格納する配列
// imagesにゲームオブジェクトを割り当てる
images[0] = image1;
images[1] = image2;
images[2] = image3;
images[3] = image4;
images[4] = image5;
images[number - 1].SetActive(true);
}
}
まず、5枚のおみくじをランダムに画面上に張り付けて非表示にします。そして、このおみくじの結果のSceneが表示されると、おみくじ5枚のうちランダムで表示の状態になるようにしました。参考サイトは下記です。
・https://tech.pjin.jp/blog/2021/03/31/unity_howto_random/
一応、最低限の仕上がりにしたつもりですが、改善点が多いので、直していきたいと思います!!
コメント
コメントを投稿