ここに書いてあったよー!!
第6回はよ!
ここに書いてあったよー!!
第6回はよ!
この項,実質Javascript入門です
プログラムの動きを見るためにコンソールという機能を使用します.この機能はプログラム内の変数や実行した場所がちゃんと実行されているか検知することができます.私はテスター代わりに使用しています.
このテスターになるコマンドは
console.log(hoge);
です.
(余談)ちなみにUnityでは
Debug.Log (hoge);//C#,JSとも
このコンソールをFirefoxでは
ツール>Web開発>Webコンソール
で表示できます
実行を検知したいだけであれば,検知したい場所(行)に
console.log(“固有名詞”);
と入力します
その行が実行されれば,コンソールに”固有名詞”と表示されます.
変数たとえばhogeという名前の変数の中身をチェックしたければその検知したい場所(行)に
console.log(hoge);
と入力します
その行が実行されれば,コンソールに 変数の中身=例えば3 とか 4.3 とか false などと表示されます
まずは,このテスターを作ってみましょう.
<!DOCTYPE html> <html> <head> <title>コンソールのテスト</title> <meta charset="UTF-8"> </head> <body> <h1>コンソールの表示テスト</h1> <canvas id="myCanvas" width="300" height="300" style="border:1px solid #000000;"></canvas> <script type="text/javascript"> var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); var mycolor = "#ff0000"; context.fillStyle = mycolor;//変数mycolorがここに代入 context.fillRect(100, 100, 20, 20); console.log(mycolor); </script> </body> </html
解説
結果はこのように表示されます
16行目の
console.log(mycolor);
を
console.log("mycolor");
に変更してみましょう.ダブルクォーテーションで囲むだけです.
結果はどうなりましたか?
“ ”で囲むと,変数ではなく「固有名詞」となり,それ自信を表示してくれます.
これはバグの取り方にも使われます.(次へ)
ワークショップで作ったスクリプトその5
#pragma strict var ranprefab : Transform;//プレファブの位置 var numberOfObjects = 50;//個数 var rposxMax : int;//xの上限 var rposyMax : int;//xの上限 var rposzMax : int;//zの上限 var rposxMin : int;//xの下限 var rposyMin : int;//yの下限 var rposzMin : int;//zの下限 //numberOfObjectsの個数だけ生成 範囲は上記 for (var i : int = 0;i < numberOfObjects; i++) { var pos = Vector3(Random.Range(rposxMin,rposxMax), Random.Range(rposyMin,rposyMax), Random.Range(rposzMin,rposzMax)); Instantiate(ranprefab, pos, transform.rotation); }
ワークショップで作ったスクリプトその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); } }
今回のワークショップで作ったスクリプトその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移動 } }
今回のワークショップで作ったスクリプトその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);//これなんだっけ? }
今回のワークショップで作ったスクリプトメモ その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スキンを使用するスクリプト
事前に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 () { }
これで動くかな?
送られる側のスクリプト
#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を送る }
スクリプト
#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