ArduinoのデータをUnityに送る

Uniduino(Arduinoでなく)ではシリアル通信のデータ=Serial.println(hogehoge);したもの=が見えない.

サイクルコンピュータのようなものを作ろうとしたのですが,UnityのFPSを越える間隔のデータはUnityでは処理しきれないため,Arduino側でデータを処理し,Unityのupdateより遅い速度でUnityへ送る必要がある.

そこで,シリアル通信を送るサンプルを探していたのですが,以下リンクより見つけることができました.

 

UnityとArduinoをシリアル通信 – Qiita

はじめに (読み飛ばしてください 笑) ちょっとした趣味でデータグローブを作ってUnityで遊べたらなと思いました。 ハードウェアの部分はArduinoで制御すればいいんですがUnityとArduino間の通信とどうしたもんじゃと。 調べたらUniduinoという大変素晴らしいAssetがあるみたいですが、使うのに$30するようです。 ふえぇ…学生には高いよぉ… ということでいろんなネットの情報を参考にUniduinoを使わずにUnityとArduin…” name=”description

LINK: qiita.com/yjiro0403/items/54e9518b5624c0030531

 

このプログラムのうち,SerialHandlerをそのまま使わせていただき,別の呼び出すスクリプトだけを変更します.

以下は,シリアルデータを読み出すスクリプトです.別途,SerialHandlerが必要です.

using UnityEngine;
using System.Collections;


	public class mySpline2 : MonoBehaviour{

	public SerialHandler serialHandler;


		void Start(){
		serialHandler.OnDataReceived += OnDataReceived;
		}



		void Update(){

		}



	void OnDataReceived(string message){
		Debug.Log(message);

		var data = message.Split(
			new string[]{"\t"}, System.StringSplitOptions.None);
		if (data.Length < 2) return;

		try {
		} catch (System.Exception e) {
			Debug.LogWarning(e.Message);
		}


	}
	}

 

7行目でInspectorにボックスが出ますので,serialHandlerがアサインされたオブジェクトを入れてください.

11行目は必須です.これがないとエラーがでます.

23行目にあるようにmessageでString形式でデータが戻ってきます.

最終的にはこれをintParseして数値として使用する予定です.

Uniduinoが動かないとき

UnityでArduinoと通信できる魔法のプラグインUniduino(おそらく開発停止)をインポートして動かないとき,

PlayerSettings.NET 2.0 subset.NET 2.0に変更する.これ大事.Uniduinoは以下リンクより.

 

Uniduino

LINK: www.uniduino.com/

 

 

なお,UnityでArduinoを扱えるシステムの最新版は,

 

ARDUnity Home Page

Innovative IoT base Physical Computing DIY Solution ‘ARDUnity’ Official Web Site

LINK: www.ardunity.com/

 

があり,しかも基本的なDOUT.INやAINなどは無料で使用可能です.

外部センサの入力間隔を速度に変更

※現在はこの方法は使用していません.Arduino内で1周にかかるmsを検出し,シリアル通信でその数値をUnityに送信しています(現在の方法はこちら

自転車の速度計のように,円周nのタイヤが1周するのに何秒かかったかで,時速を計測するスクリプトです.

余談ですが,これはゲーム内の速度ではなく,実際に外部のデバイスの速度を計算するスクリプトです.

なお,Unity内の速度は1ユニット1mで計算することが多いです.

 

using UnityEngine;
using System;//時間計測するのに必要

public class mySpline : MonoBehaviour
{

	//時間計測に必要な変数
	private int starttime; //最初の初期値用
	private int now; //現在の時間を格納する用
	private int duration; //経過時間を格納する用

	void Start(){

		starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
		//ゲームスタート時の時刻をミリセカンドに変換してstarttimeに格納します
	}


	public void cycle1(){ //1周ごとにセンサーなどでこの関数を呼びます.publicにしてあるのは,テスト用にGUIボタンで呼べるようにしてる
		now = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; //この関数が呼ばれた時の時間をミリセカンドにして格納
		duration = now - starttime; //経過時間を算出してdurationに格納
		float myspeed = (3600000f / duration) * 0.00062f; //円周0.00062km(つまり62cm)と経過時間で時速を計算し,ローカル変数myspeedに格納する
		string kmspeed = myspeed.ToString ("N2"); //myspeedを文字列に変換し,ただし小数点2桁までで切り捨てて,文字用ローカル変数kmspeedに格納.文字列に変更しているのはGUIにすぐいれられるようにするため
			Debug.Log (kmspeed + "km/h");//コンソール画面に速度と単位Km/hを追加して表示
		starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;//次の計測開始用にstarttimeの時間を現在時間に更新

	}

}

speedscreen

ところで,Unityの計算間隔を超えた場合ってどうなるんでしょう?

MB1(Maya to MB)

MayaのデータをMotionBuilder(以下MB)で編集しましょう。

はグラボ必須です.無いと起動できません.そのためMacでWindowsを使用可能にするパラレルデスクトップでもMayaは起動しますがMBは動きません.

モーションデータは、BVH又はc3dのモーションファイル使用します.
http://www.mocapclub.com/Pages/Library.htm
http://accad.osu.edu/research/mocap/mocap_data.htm
カーネギーのデータ
http://mocap.cs.cmu.edu/

 

  1. MBで使用するには,カーネギーのデータをBVH化したもの(MBはBVH形式が楽です.こちらを利用してください)
    https://sites.google.com/a/cgspeed.com/cgspeed/motion-capture
    Motion builder friendly versionを使う
  2. directories番号の内容はこちらに.リンク先に動きのサンプル動画があるので,それを手がかりにすること
  3. 通常は,MayaからMotinBuilderにシーンを送信するか,fbx(スキニング又はエンベロープ済み)を読み込むが.今回は配布されたデータを用いる
  4. MotionBuilderをMayaと同じショートカットで動かしたい場合,Interaction ModeMayaにする(下図参考)
    mb0701
  5. ドラッグ&ドロップでBVH(又はC3Dファイル)を読み込む
  6. 読み込み後,再生バーを調整し0フレーム目や-1フレーム目Tポーズが入っているか確認する
  7. アセットのTemplate内Character(C3DのときはActor)をシーンにドロップ
    chara
  8. ここまでで,読み込んだデータは概ね以下のような構造になっている
  9. 読み込んだBVHのデータをCharacterにアサインする.CharacterをダブルクリックするとCharacoter Definitionのタブを探しやすい下記画像を参考にMapping Listの部分に読み込んだBVHファイルのボーンをアサインする
    cahacter2
  10. referenceとBaseの項目は必須です.他は部位にあわせて近い部分をアサインしてください.
  11. Tポーズのフレームへ行き,Characterizeにチェックを入れる,その際にキャラクタのスタイルを聞かれるの二足歩行の場合はBipedにする
    chara3

つづく

 

 

 

Mayaが起動しない時の対処方法

Mayaが起動しない時はプロファイルを消去します

ただし,プロジェクトの場所を設定していない場合,保存していたものが全て消える可能性があります

必ずバックアップをとってください

プロファイル消去の方法

  1. マイドキュメント>maya
    または
    マイドキュメント>maya>(Maya2016)
    というフォルダを探します
  2. 正しくプロジェクトを設定していない場合,こちらにシーンファイルが保存されている可能性がありますので,必ずバックアップをとってから,このmayaフォルダを削除します
  3. その後Mayaをスタートさせる

参考WEB

cgjishu.net/blog-entry-32.html

 

Mayaヘルプ

Mayaヘルプコーナー

  • Mayaが起動しない=>Mayaのプロファイルが壊れているようです.対策方法はこちら
  • プロジェクトの設定方法について=>こちらを参考に
  • 保存されない=>保存先が一杯な可能性があります.USBメモリなどに移動させましょう.その際プロジェクトフォルダの取り扱いについては=>こちらを参考に
  • テクスチャなどが表示されない=>上位階層も含め絶対に日本語など2バイト文字のフォルダ名やファイル名を使ってはいけません
  • レンダリングしたものが保存されない=>上位階層も含め絶対に日本語など2バイト文字のフォルダ名やファイル名を使ってはいけません
  • FBX exporterが選択できない場合=>こちら

※いずれの項目も映像メディア2しつこく解説しております.

2バイト文字使用禁止についてですが,業務用ソフトで2バイト文字が使えないのは普通です.諦めてフォルダ名は半角英数字で命名する習慣をつけましょう.

 

敵と味方を見分けたり,敵のランクを区分ける「タグ」について

FPSなどのゲームをプレイしていると,味方を撃っても味方が死なないことがあります.つまりプレーヤーである兵士は,クーデター待遇改善要求はできない仕様になっています.ゲームの世界にまで社畜が浸透しています.

さて,この味方を撃っても影響が出ない件,Unityではこれをタグというシステムで実装します.

基本的なタグ(Player=自分,GameController=自分に影響を与えるもの)は用意されていますが,自作のタグを使用することもできます.

このタグ名が一致する,あるいは味方のタグ以外の場合において,ポイントを加算するということができます.

では実装してみましょう.

  1. まずタグを追加します.Sphereを選んで(タグを追加するだけなら,選ばなくてもいいのですが),,tag01
  2. InspectorのTagをプルダウンし,Add Tag…を選択します
  3. tag02
  4. +ボタンをクリックし,タグ名を追加します.今回はenemy1,2,3を追加しましたtag03
  5. タグを設定したいオブジェクト(敵)を選び,Tagをプルダウンし,enemy1やenemy2,3のどれかを選択します.他の敵オブジェクトにも同じ処理をしてください.
  6. tag04
  7. つづいて,スクリプトです.新規C#スクリプトを作成し,スクリプト名はhitcheckにし,全て下記に入れ替えてください.
using UnityEngine;
using System.Collections;

//use for UI
using UnityEngine.UI;

public class hitcheck : MonoBehaviour {

	//variable
	int countInt = 0;  //計算用に整数を使用する変数宣言
	public Text myText; //UnityUI内の文字を扱うための変数宣言
	string tagName; //タグ名を格納するための変数宣言

	void Start(){
		myText.text = "000"; //初期値を数字ではなく文字列として設定する
	}


	void OnTriggerEnter(Collider mycollider) { //トリガーに何か入ったらそのコライダを変数「mycollider」に格納する

		tagName = mycollider.tag; //mycolliderのタグ名をtagNameに入れる
		if (tagName == "enemy1") { //上でtagNameに入れたタグがenemy1と一致するなら
			countInt = countInt + 1; //countintに1を足す
		}else if (tagName == "enemy2") { //上でtagNameに入れたタグがenemy2と一致するなら
			countInt = countInt + 10; //countintに10を足す
		}else if (tagName == "enemy3") {
			countInt = countInt + 100;
		}



		Destroy(mycollider.gameObject); //mycolliderのゲームオブジェクトを消去する


		//sound

		//effect

		//add point
		//countInt++;
		//myText.text = countInt.ToString ();
	   myText.text = string.Format("{0:D3}", countInt);
	}

}

これでタグ(つまり当たった物)に応じて加算される点数を変えることができます.スクリプトの例はenemy1なら1点,enemy2なら10点,enemy3なら100点です.りんごにenemy1のタグを,みかんにenemy2のタグを指定すれば,りんごは1点,みかんは10点得ることができます.

これを応用すれば,味方に撃たれてもHP減らない!ってのができます.このタグの設定をプログラムを使って動的にで変更すれば,謀反も可能。下克上ですね.(違う)

プログラムのif文の中を変更すれば,同じタグの敵だけ消すなどということもできます.

Unity勉強会やるかも

やるかもしれません

たぶん,9月の前半です.

ゼミ,学年,学部不問.内容は入門の内容です.ゼミ落ちたかたも是非参加を.

私物のパソコンにUnityをインストールしてくることが参加の条件です.なおWindowsのバージョンによっては,日本語のユーザ名ではUnityがインストールできないことがあります.

フォルダ名やファイル名(特に業務用ソフトで使用する場合),ユーザ名は半角英数字で作成する習慣をつけましょう.

なお,ユーザ名を変更するといろいろ不都合が起きる場合もありますので,新規ユーザを作成することをおすすめします.

 

アニメーション出力(2)

レンダリング設定(参考)

  1. レンダー設定をクリックします
    ren9
  2. (A)動画を提出する場合
    Windows版の場合は以下のように設定します.イメージフォーマットはAVIに,圧縮をクリックし,圧縮プログラムはMicrosoft Video1に,フレームレンジは1〜200(このサンプルの場合)に(※この設定はOSの設定に応じて変更することがあります)
    ren16
    (B)連番画像を提出する場合
    図のように設定してください.
  3. イメージサイズプリセットHD1080に設定するren17
  4. (※)動画ファイルで書き出すのは一般的ではありません.通常は連番ファイル(連続した番号の静止画ファイル)で書き出す
  5. 使用するレンダラMayaソフトウェアに(レンダラーとは描画エンジンのこと.Pixarならレンダーマンを使い,最近の商用レンダラーはV-Rayが増えてきました)Mayaソフトウェアのタブを選択し,精度制作の精度エッジのアンチエイリアシング(境界線のギザギザ=ジャギーをぼかす度合い)を最高精度に,レイトレーシングの精度レイトレーシングにチェックをいれます
    ren8
  6. パースのビューで,ビュー>カメラ設定>解像度ゲート の設定に変更します
  7. ビューポートに白い枠が現れます.この枠にあわせてアングルを調整してください
  8. レンダリング開始ボタン(下図赤線)をクリックし,レンダリング結果を確認します
    ren11
  9. この場合は,静止画でレンダリングされます
  10. 照明が暗い場合は,照明を追加してくださいlight
  11. 身体が黒い場合には,テクスチャのリンクを再設定してください.rendertex1
  12. ライティングなどを調整し,レンダリングの状態をベストなものにします
  13. メニューセットレンダリングにし,メニューバー>レンダー>バッチレンダー を選択します
    ren12
  14. レンダリングが開始する
    ren13
  15. レンダリングが完了されたら以下のように表示されます.動画の保存場所はこのページ2のレンダー設定の共通のパスの部分にも記述されていますren14
  16. 動画を確認する

お疲れ様でした