VRに使ったスクリプト(Unity側)

(関連記事)

  • VRについての記事はこちら
  • SerialHandlerについての記事はこちら

上記リンク先の記事SerialHandlerを使ったUnityの制御です.

 

using UnityEngine;
using System.Collections;
using System;//use for time
using UnityEngine.UI;//use for UI


//アセットSuperSplinesのメニューを追加
	[AddComponentMenu("SuperSplines/Animation/Regular Animator")]


	public class mySpline2 : MonoBehaviour{
		public Spline spline;
		public WrapMode wrapMode = WrapMode.Clamp;//SuperSplineの初期モード実際はLOOPで使用
		public float speed = 0f;//初期速度ゼロでないと起動したら動いてしまう
		public float offSet = 0f;//オフセット値/スタート位置を変えたい場合など.

		public float passedTime = 0f;//何に使ったかな?
	float myspeed = 0f;//何に使ったかな?

		public Text myText; //UIで使う用
		public SerialHandler serialHandler;//serialHandlerスクリプトがアサインされたゲームオブジェクトをアサインする用.

		//for arduino
		public bool spBool = false;//停止用

		//時間計算用,試行錯誤してるので要らない変数あるかも
		private int starttime;
		private int now;
		private int duration;
		private float truespeed;
		private float myPos = 0f;
		private float mytime = 0f;
		float lerpspeed =0f;
	float firstSpeed = 0f;

	float mymillsec= 0f;
	string kmspeed;



	void Start(){

			myText.text = "0km/h";//GUI表示用に0km/hいれる
		starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;//起動した時間をstarttimeにミリセカンドで入れる.ペダル停止検知用
		//信号を受信したときに、そのメッセージの処理を行う
		serialHandler.OnDataReceived += OnDataReceived;
		}



		void Update( ) {
			mytime += Time.deltaTime * speed;//いまの時間とスピードかけてspline動かす指標にする
		if (spBool) {//ペダル動いてるとき
		myPos += Mathf.LerpUnclamped (speed ,firstSpeed, mytime);//スプライン上の位置myPosを時間でslerpする
		}
		if (Input.GetKeyDown ("s")) {//停止用
			myPos += Mathf.LerpUnclamped (0f, 0f, mytime);
				spBool = false;
			myspeed = 0f;
		}

			if (Input.GetKeyDown ("r")) {//リセット用
				myPos = 0;
				spBool = true;
				myspeed = 0f;
			speed = 0f;
			}
// 下3行がsplineを動かすやつ
			float clampedParam = WrapValue (myPos + offSet, 0f, 1f, wrapMode);
			transform.position = spline.GetPositionOnSpline (clampedParam);
			transform.rotation = spline.GetOrientationOnSpline (clampedParam);

////
		}



	void OnDataReceived(string message){//arduinoから文字列を受信したら
		
		firstSpeed = speed;初期速度をさっきの速度に入れ替え(2回目以降用)
		mymillsec = float.Parse (message);//車輪が1回転した間隔を受信してるので,それをフロート値に変換
			myspeed = (3600000f / mymillsec) * 0.000628f;//速度km/hを計算
		if (myspeed < 0.9) {//速度が1km未満ならゼロに
			myspeed = 0f;
		}

			kmspeed = myspeed.ToString ("N2");//小数点2桁でカット
		speed = myspeed * 0.00005f;//乗数で速度感変わります
		//}
	
		myText.text = kmspeed + "km/h";//速度をUIに表示
		//以下使ってない(タブでデータ区切り用)
		var data = message.Split(
			new string[]{"\t"}, System.StringSplitOptions.None);
		if (data.Length < 2) return;

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

	}



	public void stopper(){ //使っていません.ペダルの回転間隔を調べて回っていないのならゼロにしようと思いましたが,惰性で進むことを優先してこちらはカット(ただしBoolだけ使ってる)
		now = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
		duration = now - starttime;

		if (duration > 3000) {
			spBool = false;
			kmspeed = "0";
			myText.text = kmspeed + "km/h";
		} else {
			spBool = true;
		}
		//Debug.Log (spBool);
		starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
	}



	public void testBtn(){//センサを使っていないときに,GUIのボタンでテスト出来るよう

		int myrand = UnityEngine.Random.Range (150, 1800);
		string randStr = myrand.ToString ();
		OnDataReceived (randStr);


	}



//splineのモード設定用みたい
		private float WrapValue( float v, float start, float end, WrapMode wMode )
		{
			switch( wMode )
			{
			case WrapMode.Clamp:
			case WrapMode.ClampForever:
				return Mathf.Clamp( v, start, end );
			case WrapMode.Default:
			case WrapMode.Loop:
				return Mathf.Repeat( v, end - start ) + start;
			case WrapMode.PingPong:
				return Mathf.PingPong( v, end - start ) + start;
			default:
				return v;
			}
		}

	}

です.