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");
	}
}

Audio()という効果音が再生される関数を呼んだ後、1秒後にTappButton()という画面遷移する関数を呼び出すことによって、ボタンを押した後画面遷移することに成功しました。

参考サイトは下記です。

画面遷移: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);//エラーを表示
    }
}
 

 UnityとArduinoを連携させるとき、SerialReceiveというスクリプトを書いたが、そのOnDataReceiveというメソッドを書き換えたものです。効果音はスタート画面のやり方を参考にしました。画面遷移時のフェードインの参考サイトは下記です。

 ・https://www.youtube.com/watch?v=excJp8ah7qU

 

③おみくじの結果

ゲーム画面から画面遷移するとき、フェードアウトしておみくじの結果がランダムで出るようになります 。その時のスクリプトは下記です。

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/

 

 

一応、最低限の仕上がりにしたつもりですが、改善点が多いので、直していきたいと思います!!

 

 

 

コメント

このブログの人気の投稿

DockerのNextcloudでエラーが出た SQLSTATE[08006] [7]

Arduinoで電流を測定する