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

UnityでARアプリ

UniyにVuforiaを入れてARアプリ.
簡単に作成できますが問題が.

Prefabでオブジェクトを作成(instantiate使って)したときに,ARマーカー非認識時でも隠したい見えちゃう問題です.

解決法.staticなブールを置いて,状態をチェックする.

(1)原因のおそらく
Vuforiaのスクリプトは子オブジェクトまでを配列に読み込んでrenderをON/OFFさせるが,prefabの2個目以降が入ってこない.タイミングの問題か,同じ名前だから1つ目以外は無視されているか.

(2)解決方法
いろいろ試したが,強引にやることに.

DefaultTrackableEventHandlerに以下を追加

public static bool meshVisi = false;

コード(抜粋)黄色の部分を追加

public class DefaultTrackableEventHandler : MonoBehaviour,
                                            ITrackableEventHandler
{
    #region PRIVATE_MEMBER_VARIABLES
 
    private TrackableBehaviour mTrackableBehaviour;
    
    #endregion // PRIVATE_MEMBER_VARIABLES



    #region UNTIY_MONOBEHAVIOUR_METHODS
	//
	public static bool meshVisi = false;
	/// 


    
    void Start()
    {

次に,同じくDefaultTrackableEventHandlerに以下を追加.(70行目前後にあり)

マーカーを発見したとき用 黄色の部分だけを追加

  private void OnTrackingFound()
    {
		meshVisi = true;//bird mesh renderer-on

        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
        Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

 

マーカーを見失ったとき用(100行目くらい) 黄色の部分だけを追加

    private void OnTrackingLost()
    {
        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
        Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

		meshVisi = false;//bird mesh renderer-off

 

(3)プレファブのメッシュに追加するスクリプト

using UnityEngine;
using System.Collections;

public class renderVisi : MonoBehaviour {
	
	void Start () {
		renderer.enabled = false;

	}

	void Update () {
		if(DefaultTrackableEventHandler.meshVisi == true)
			renderer.enabled = true;
		if(DefaultTrackableEventHandler.meshVisi == false)
			renderer.enabled = false;

	}
}

これを renderVisiというc#で保存し,プレファブのメッシュにアサイン

 

(4)やってみる。

 

(5)

実行順とかでもクリアできそうな強引なスクリプトが目立ちますが,,ご容赦.

納期が近いので、、

UnityでARアプリ作成

(1)Unityをインストール
http://japan.unity3d.com/

(2)VuforiaのUnityPackageをダウンロード

https://developer.vuforia.com/
へ行き,Downloadをクリック

Unity Extensionを選択してDL

Unity側でImport PackageのCustom Packageで入れる

(細々とした使い方をここにかく予定)

・マーカーは
https://developer.vuforia.com/
へ行きアップロードし.サーバで作られたマーカー用のUnityPackageをDL

・ノートPCでもテスト可能(MacBookは単体でチェック可能)
そのままAndroidビルドおK

簡単でした.
マーカーをけっこう選びます

ブラウザにデータを保存できるwebstorageのサンプル

ここのサンプルを少し改造しています.

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset=utf-8>
<script>
//変数storageにlocalStorageを格納
var myData = localStorage;//たぶん”localstorage”というのは変えてはいけない

//myDataに保存する
function dataSave() {
  var myKey = document.getElementById("mykey").value;
  var myValue = document.getElementById("myvalue").value;
  myData.setItem(myKey, myValue);
  show_result();
}

//データを消去
function myclear() {
  myData.clear();
 show_result();
}

//保存されているデータをリスト表示する
function show_result() {
 var result = "";
  //保存されているデータの数だけループ
  for(var i=0; i<myData.length; i++){
    //i番目のキーを取得
  //  var k = myData.key(i);
    var calledData = myData.key(i);

    result += calledData + "は" + myData.getItem(calledData) + "です<br>";
  }
  //上のループで作成されたテキストを表示する
  document.getElementById("show_result").innerHTML = result;
}


  // 
  function removeStorage() {
    var key = document.getElementById("sakujoKey").value;
    myData.removeItem(key);
    key = "";
    show_result();
  }

</script>
<title>Web Storage サンプル</title>
</head>
<body onload="show_result();"><!-- ←ここで結果を自動表示させている-->
<p>
キー:<input id="mykey" type="text">
値:<input id="myvalue" type="text">
<input type="button" value="ストレージに保存" onClick="dataSave()">
</p>
<p>
<div id="show_result"></div>
<input type="button" value="ストレージをクリア" onClick="myclear()">

<input type="button" value="リスト表示" onClick="show_result()">
<br />
削除するキー:<input id="sakujoKey" type="text">
  <button id="button" onclick="removeStorage()">このキーを削除</button>
</p>
</body>
</html>

このデータは共有できるので,同じサーバ(で判別している)であれば別のページからでもこのデータをみられる.

そこで,書き込み用ページと,読み出しようページを分けて,普段は読み出し用ページ,特別な時に書き込みようページへ移動してデータを追加というのも可能です.

データはクリア以外にも,キーワードを指定して削除という方法があります.

「削除するキー」の横に削除したいキーワードを入れて,削除ボタンを押すと,そのキーと値が削除されます.

なお,同じキーの場合は,上書きされますので,日付などで固有化させてください.

例えば,「2014年11月電気代」という風に.

配列に入れているので並び替え可能かと思われますが(ソート)その場合は配列への書き込み方法を変更する必要があるかも.

ローカルファイルにデータ保存(実験)

Webアプリで入力を行わせる場合,通常はサーバ側に記録するのですが,それではデータベースが必要となります.

HTML5ではWeb Storageという機能があり,URLに紐付けてデータをブラウザ側に保存できるようです.ユーザの購買傾向を見てお奨め商品を出してくる通販サイトはこの技術を利用しているようです.

参考

このデータは何かの拍子に消える可能性もありますので,通販のお奨め商品といったレベルで重要な要素には使わない方がいいかもしれませんが,データベースを構築するよりは簡単そうです.

「保存するデータを見るのは自分だけ」「単に数値や文字といった軽いデータだけ」であればこの方法を使ってみてください.

つづく(できなかったら消す)

みんなで書き込むーを実現するには

「みんなで書き込む」を実現するには,データベースの構築あたりが必要かと.

PHPを使って,サーバ側に置いた○○.txtを書き換えるスクリプトをコントロールすれば良いかと.

そして,PHP,html,css,javascriptのファイルを組み合わせればできそうです.

ただphpの実行ができるサーバ環境を準備してください.

 

EXCELで配列のデータを作成その2

(その1はこちら

つづいて,ワードを開きペーストします.ペースト時には,指定形式でペーストし,テキスト形式を選択します.

paste1


ペーストされました.このままでは使えませんので,検索置換機能で全てカンマを入力します.

word1


編集の置換をクリックします

word2


置換語の文字列には半角のカンマ,上の検索する文字列フィールドをクリックしてカーソルを移動させ,特殊文字のプルダウンメニューを表示させます

word3


 

段落記号を選択

word4


 

全て置換をクリックします.

これで数字とカンマでできた配列用のデータが作成できました.

 

EXCELで配列のデータを作成その1

時刻表を全て分(0時0分起点)に変換し,配列に入れるデータを作成します.

まずEXCELに時と分を分けて,時刻表のデータをとりいそぎ1件入力します

結果の欄には全てを分に直す式を入力します.

kakezan


 

次に,時刻表を全て入力します

excel2


 

計算結果のセルの右下の黒四角をドラッグして下へ引き延ばします.

excel3

excel4

自動で計算結果が入力されます.

つづく

Unity-ローディング画面

数字だけですが,,この数字をGUIに適用すれば棒グラフ作れますね.

var percentageLoaded : float = 0;

function Update() {
    if(Application.GetStreamProgressForLevel("読み込みたいシーン名") == 1) {
        guiText.text = "ゲームの準備完了!!";
    } else {
        percentageLoaded = Application.GetStreamProgressForLevel("読み込みたいシーン名") * 100;
        guiText.text = percentageLoaded.ToString() + "%読み込みました"; 
    }
}

 

Unity-スピード検出

スピードを検出します.キャラクタコントローラがアサインされていることが必須です.

それと同じオブジェクトにアサインしてください.

#pragma strict

static var horizontalSpeed : float = 0.0;

function Start () {

}

function Update () {
    var controller : CharacterController = GetComponent(CharacterController);
    var horizontalVelocity : Vector3 = controller.velocity;
    horizontalVelocity = Vector3(controller.velocity.x, 0, controller.velocity.z);
    
    // The speed on the x-z plane ignoring any speed 
    horizontalSpeed = horizontalVelocity.magnitude;

   
  //print(horizontalSpeed);
  Debug.Log(horizontalSpeed);
}

 

Unity-カメラの切り替え

ボタンを2つ用意してカメラを切り替えます

スクリプトを適用した後,カメラをアサインしてください.

var cameraA : GameObject;
var cameraB : GameObject;
cameraA.camera.enabled = true;
cameraB.camera.enabled = false;
 function OnGUI () {
// background box
GUI.Box (Rect (Screen.width -110,10,100,90), "Cam Type");
// first button
if (GUI.Button (Rect (Screen.width -100,40,80,20), "RGB CAM")) {
cameraA.camera.enabled = true;
cameraB.camera.enabled = false;
  }

// second button.
if (GUI.Button (Rect (Screen.width -100,70,80,20), "Move CAM")) {
cameraA.camera.enabled = false;
cameraB.camera.enabled = true;
  }
}