「授業用」カテゴリーアーカイブ

Unity-Uniduinoの値を計算

ワークショップで作ったスクリプトその4くらい


using UnityEngine;
using System.Collections;
using Uniduino; //aruduino tukau nara hitsu you

public class analog_test : MonoBehaviour {// haifun wa tsukae nai no?


	public Arduino arduino;//
	
	public int pin = 0;//?
	public int pinValue;//pin level get
	public int yValue;
	public int zValue;

	public int pinValueX;
	public int pinValueY;
	public int pinValueZ;
	

	public float spinSpeed;//kaiten sokudo
	public GameObject rotBone;//add my bone here

	public double rotZ = 0;

//ここあらネットで拾ったスクリプト組み合わせ大会
	ArrayList pinValueListX = new ArrayList();
	ArrayList pinValueListY = new ArrayList();
	ArrayList pinValueListZ = new ArrayList();
	// smoothing回数 多いほど滑らか
	int SMOOTHING_LENGTH = 20; 
	

	void Start () {//初期化など
		
		arduino = Arduino.global;
		arduino.Log = (s) => Debug.Log("Arduino: " +s);//log dakara huyou?
		arduino.Setup(ConfigurePins); //call ConfigurePins function
		
		//cube = GameObject.Find("Cube");

	}
	
	void ConfigurePins( )
	{
		//arduino.pinMode(pin, PinMode.ANALOG); //
		//arduino.reportAnalog(pin, 1); //pin number 1 is enable(1)
		arduino.pinMode(0, PinMode.ANALOG); 
		arduino.reportAnalog(0, 1);
		arduino.pinMode(1, PinMode.ANALOG); 
		arduino.reportAnalog(1, 1);
		arduino.pinMode(2, PinMode.ANALOG); 
		arduino.reportAnalog(2, 1);
	//	spinSpeed = 0.1;
	}



	
	void Update () {

		//以下も追加

		updatePinValueList (
			arduino.analogRead (0),
			arduino.analogRead (1),
			arduino.analogRead (2)
			);


		pinValueX = getSmoothedValue (pinValueListX);
		pinValueY = getSmoothedValue (pinValueListY);
		pinValueZ = getSmoothedValue (pinValueListZ);
		///追加

		double degX = Mathf.Atan2(pinValueX - 536, pinValueZ - 500) / 3.14159 * 180.0 ;//角度を加速度から
		double degY = Mathf.Atan2(pinValueY - 530, pinValueZ - 500) / 3.14159 * 180.0 ;//climb
		//double degZ = Mathf.Atan2(pinValueZ - 500, pinValueX - 533) / 3.14159 * 180.0 ;//角度を加速度から
		double degZ = Mathf.Atan2(pinValueZ - 500, pinValueY - 530) / 3.14159 * 180.0 ;//角度を加速度から

		if(degX > 1)
		{
			rotZ = rotZ - (degX * 0.01);
		}if(degX < -1){
			rotZ = rotZ - (degX * 0.01);
		};
	}


	void updatePinValueList(int x, int y, int z){
		if (pinValueListX.Count > SMOOTHING_LENGTH) {
			pinValueListX.RemoveAt(0);	
		}
		if (pinValueListY.Count > SMOOTHING_LENGTH) {
			pinValueListY.RemoveAt(0);	
		}
		if (pinValueListZ.Count > SMOOTHING_LENGTH) {
			pinValueListZ.RemoveAt(0);	
		}
		// smoothingしたの値
		pinValueListX.Add (x);
		pinValueListY.Add (y);
		pinValueListZ.Add (z);
	}
	
	int getSmoothedValue(ArrayList list){
		if (list.Count < SMOOTHING_LENGTH) {
			return 0;
		}
		
		int sum = 0;
		for (int i=0; i<list.Count; i++){
			sum += (int)list[i];
		}
		return (int)(sum / SMOOTHING_LENGTH);
	}

}

Unity-スピード関係のスクリプト

今回のワークショップで作ったスクリプトその3

#pragma strict
var mySpeed : Vector3;
var maxHeight : int;
var currentHeight : int;

function Start(){
yield WaitForSeconds (5);//いきなりスタートさせると子ども困るので5秒待たせてる.カウントダウンの絵とか入れたかったなぁ
SpeedCheck(true);//SpeedCheckをtrueにすると動きます
}


function Update() {
        currentHeight = transform.position.y;//いまの高さ出します
     if (currentHeight > maxHeight){//maxheightより高ければ
       transform.position.y = maxHeight;//maxheightの高さで固定ね
     }
       transform.Translate(mySpeed);//移動〜
    }
    
function SpeedCheck(sp : boolean){//falseが来たら
   if(sp == false){
   mySpeed = Vector3(0,0,0);//飛行機停止
   GetComponent(myAlt).fallOff();//爆発のスクリプト実行
   yield WaitForSeconds (5);//残念でした画面の前に5秒待ちます
Application.LoadLevel ("bad");//シーンbad読み込み
   }if(sp == true){
      mySpeed = Vector3(2,0,0);//普段は常に2移動
   }
   }

Unity-墜落時のスクリプト

今回のワークショップで作ったスクリプトその2

#pragma strict
var explosionPrefab : Transform;//爆発のプレファブをアサイン.アセットストアからもってきたよ
var uniduinoObj : GameObject;//Uniduino関係をオフに.でないと爆発しても地面の中を飛び回るから
var myscript : GameObject;//止めるだかのスクリプトの位置を指示するために作った変数.後で出てくる
var AudioClip02: AudioClip;//音をここにアサイン..ジェット機の音.Macの作曲用の音源使ったよ
var counterObj : GameObject;//なんだっけ?


function Start () {
audio.loop = true;//音ループ再生
audio.clip = AudioClip02;//音はこれね
audio.volume = 0.5f;//音のボリューム.けっこうひかえめやね.1がMaxかな
audio.Play();//再生しちゃえ
}


function OnCollisionEnter(collision : Collision) {//コリジョンが入ったら

    var contact = collision.contacts[1];
    var rot = Quaternion.FromToRotation(Vector3.up, contact.normal);//墜落地点をゲット
  var pos = contact.point + Vector3(0, 5, 0);//墜落地点じゃ低すぎるんで上に5ったところで爆発
  Instantiate(explosionPrefab, pos, rot);//爆発オブジェクト出します(ところで爆発五郎って知ってる?)
audio.volume = 0.0f;//ジェット音を停止.でないと幽霊飛行機だ!
Destroy (gameObject, 0);//舞台から消す
Destroy (uniduinoObj, 0);//舞台から消す
myscript.SendMessage("SpeedCheck", false);//アサインしたスクリプトのSppedCheckってファンクションのブールをFalseに
counterObj.SetActive(false);//これなんだっけ?

}

Unity-高度計を表示

今回のワークショップで作ったスクリプトメモ その1

#pragma strict
var Alt:int;//staticにしたほうが良いかな?
var customSkin : GUISkin;//スキンの設定なので無くて良い(なんであるの?)
var vSliderValue : float = 0.0;//高度計を画面右隅に
var AudioClip01: AudioClip;//低高度警告音をここにアサイン
var myTexture : Texture2D;//なんだっけ?
var warningGameobject : GameObject;//高さによって警告表示するそのゲームオブジェクトをここでアサイン
var myBool : boolean;//墜落したときのスイッチ用

	
function Start () {
audio.loop = true;//音はループ再生ね
audio.clip = AudioClip01;//音はこれね
audio.volume = 0.0f;//とりあえず音量ゼロね
audio.Play();//ほんで再生しちゃえ!
myBool = true;//墜落スイッチはtrueで
}

function OnGUI(){//高さのスライドバーと高さの数値表示関係
GUI.skin = customSkin;
	GUI.Label(Rect(Screen.width-20, Screen.height-40, 40, 50), "ft");
	GUI.Label(Rect(Screen.width-80, Screen.height-40, 100, 50), vSliderValue.ToString());
	vSliderValue = GUI.VerticalSlider (Rect (Screen.width-60, 20, 100, Screen.height-80), vSliderValue, 6000, 0.0);
//GUI.DrawTexture(Rect(Screen.width/2-256,Screen.height/2-64,512,128), myTexture);

}


function Update () {
Alt=this.transform.position.y;//Y軸の絶対値を入れます

if(myBool==false){//myBoolがfalseなら
fallOff();//fallOffのファンクションをやって
}else{//ちゃうなら
altCheck();//高さチェックね
}

}

function altCheck(){
vSliderValue=Mathf.Round(this.transform.position.y / 0.3048);//Yの高さ(m)をフィートに直します

var posx = transform.position.x;
var posz = transform.position.z;
var height : float = Terrain.activeTerrain.terrainData.GetInterpolatedHeight(posx / Terrain.activeTerrain.terrainData.size.x, posz / Terrain.activeTerrain.terrainData.size.z);//このスクリプトがついているx,y座標のterrain=地形の表面からの高さ=を計測してheightに入れて

var jimen : float = Alt - height;//現在高度ー地面の高さで実際の地形との高さを出してjimenに入れちゃう

if(jimen < 100){//実際の高さが100以下なら
audio.volume = 0.8f;//警告音のボリュームを上げる(つまり警告音はずっと再生されていた!)
warningGameobject.SetActive(true);//warnignGameobjectにアサインしているゲームオブジェクトを表示させる
}else{
audio.volume = 0.0f;//高度を上げたら
warningGameobject.SetActive(false);//警告を非表示に
}


}

function fallOff(){//墜落時の挙動はここに
myBool = false;//myBookはfalseに
audio.volume = 0.0f;//警告音も消す(死んでるから)
warningGameobject.SetActive(false);//警告表示も消す(死んでるから)
}

GUIスキンを使用するスクリプト

GUIスキンを使用するスクリプト
事前にGUISKinを作成しておいてください

#pragma strict
var customSkin : GUISkin;//変数customSkinをGUISkinという型で定義します.スクリプトをゲームオブジェクトにアサインしたあと,画面にskinを入れます

function Start () {
}

function OnGUI(){
GUI.skin = customSkin;//ここで使用するSkinはcustomSkinです
GUI.VerticalSlider (Rect (20, 20, 100, 100), 50, 100, 0);//このスライダがGUISkinで指定した色などに変更されます
}


function Update () {
}

これで動くかな?

HTML5入門その1-canvas

HTML5で実装されているcanvasを実行してみましょう.
以下を別の名前で作成し,保存してください.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>無題ドキュメント</title>
</head>

<body>

 <canvas id="myCanvas" width="200" height="200"
style="border:1px solid #000000;"><!--キャンバスを設定,名前はmyCanvas 幅200,高さ200,境界線hは1ピクセルの1本線で黒色-->
</canvas>

<script type="text/javascript">
var c = document.getElementById("myCanvas");//入れ物(変数)cはmyCanvasって名前のやつね
var ctx = c.getContext("2d");//変数ctxに入れろ=>変数cを2次元としてね

//var ctx = myCanvas.getContext("2d");//これもOK
ctx.fillStyle = "#FF0000";//色 HEX値(16進数)で指定
ctx.fillRect(0,0,10,100);//左上0,0の座標から幅10,高さ100に彩色される
line();//lineって指示のセットあるでしょ,あれをこのタイミングでやっちゃって

function line(){//lineって名前の指示の塊をはここからですよ〜
ctx.lineWidth = 5;//ctxってやつに線を用意します幅は5pxで
ctx.strokeStyle = '#00FF00';//ctxってやつに描くときの色は#00ff00ね
ctx.beginPath();//ctxの書き始めるんで一旦リセットね
ctx.moveTo(0, 0);//ctxの0,0に移動して
ctx.lineTo(200, 200);//ctxに線を引きます200,200まで
ctx.closePath();//パスはここまでね
ctx.stroke();//じゃ描いて

}
</script>
</body>
</html>


何かが描画されたかたと思います.

必ず,HTML5でcanvas対応のブラウザを使ってくださいね.

HTML復習その2

タグの影響範囲について考えてみよう

<html>
<head>
<title>泣ける猫写真館</title>
</head>
<body>
泣ける猫は,,,

<br/>
<a href="http://www.yahoo.co.jp/">YahooJapanのサイトへ</a>

</body>
</html>

8行目,9行目を追加し,ブラウザで開いてみましょう。
こんな表示になっているかと。


泣ける猫は,,,

YahooJapanのサイトへ


YahooJapanウェブサイトへのリンクができましたね.

タグの影響範囲について確認するために9行目を以下のように変更してみましょう.

 

<a href="http://www.yahoo.co.jp/">YahooJapan</a>のサイトへ

↓こうなりましたか?


YahooJapanのサイトへ


リンクする文字列が変わりましたね.
これだけできれば大丈夫!

HTMLやったかな?

シンプルなHTMLおさらい


<html>
<head>
<title>泣ける猫写真館</title>
</head>
<body>
泣ける猫は,,,
</body>
</html>

メモ帳などで作成し,拡張子をHTMLとして保存.保存先はローカルもしくはWドライブへ.
その後ブラウザで開いてみること.


HTMLの構造を確認してみよう.

<> を開始タグ, </>のスラッシュがついているものを閉じタグと呼んだりする

開始タグを閉じタグの間はその命令が実行される

他のスクリプトにBoolを送る

送られる側のスクリプト


#pragma strict
var mySpeed : Vector3;

function Start(){
SpeedCheck(true);
}


function Update() {
       transform.Translate(mySpeed);
    }
    
function SpeedCheck(sp : boolean){//<-ここに受信される

   if(sp == false){
   mySpeed = Vector3(0,0,0);//falseが来たら停める
   }if(sp == true){
      mySpeed = Vector3(2,0,0);
   }
   }

送る側のスクリプト

#pragma strict
var myscript : GameObject;

function OnCollisionEnter(collision : Collision) {

    var contact = collision.contacts[1];
myscript.SendMessage("SpeedCheck", false);//<-ここでfalseを送る

}

Android端末でオキューラスもどき

スクリプト

#pragma strict
var myTransform:Transform;
function Start () {
Input.gyro.enabled = true;// android ha must item dayo-
myTransform = transform;

}

function Update () {
var gyro:Quaternion = Input.gyro.attitude;
var myAxis:Quaternion = Quaternion.AngleAxis(90, Vector3.up);
myAxis = Quaternion.AngleAxis(90.0, Vector3.right);//jiku wo kaeru
gyro.x *= -1.0;
gyro.y *= -1.0;
myTransform.transform.localRotation = myAxis * gyro;
}

サンプルは以下に

https://www.dropbox.com/s/rsc9tx0qu61h24a/stereocamSample.unitypackage