Unity勉強会1日目その2

ひとつのスクリプトで判定させる,文系的な解答例

using UnityEngine;
using System.Collections;

public class loadlevel1 : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	public void OnClick(){

		if (Application.loadedLevelName == "1stScene") {
			Application.LoadLevel ("2ndScene");
		}
		if (Application.loadedLevelName == "2ndScene") {
			Application.LoadLevel ("1stScene");
		}

	}
}

ifで総当たり(全てチェック)します.

2択なので,elseを使えばいいかもしれませんが,,,

これで,このスクリプトはLevel2でもLV1でも共用できるスクリプトになります.

他にもアイデア次第ではどんなレベルでも使い回せるスクリプトがくめるでしょう.1つのスクリプト使い回すと,修正もしやすいですよ〜(ただ制約も生まれる).LV20まであれば20個修正するとかってばかばかしいですよね,,

Androidアプリの作成

  1. AndroidSDKをダウンロード(エディタ無しの純粋なSDKでOK)
  2. UnityのSDKの場所をUnity>Preferenceで指定
  3. BuildSettingsを開き,Androidを選び,switch platformを選択
  4. アプリ名や会社名を設定し,buildする
  5. できたアプリ(.apk)をAndroidにインストール

プロジェクト発表

  1. 配布のデバイスを使って、、、
  2. 「ガラガラアプリを作成せよ」
  3. ガラガラを作る理由としては,,
  4. 音,画像,加速度センサ,タッチ といったデバイスが持つ機能を利用させるから
  5. 構造としては「オープニング」→ 選択画面 ←→ ガラガラの実行画面(複数OK) という3つのシーンで構成します
  6. Androidデバイスは貸し出します

AndroidのデベロッパモードONの方法

  1. 貸出したタブレットは
  2. アプリ>設定>端末情報>ソフトウェア情報>ビルド番号 の部分を何回かタップするとデベロッパモードONになる
  3. タブレットにコピーしたアプリ( .apkファイル)は,ホーム>ASUSをタップ>黄色いフォルダのアイコンで「ファイル…」をタップ>コピーしたファイルをタップ>「インストール」をします

Unity勉強会1

Unity勉強会の内容を転記

  1. 本日,Unity5リリース.1日目(インストールし起動確認済みとの前提で)
    ・ソフトウェアの起動,終了
    ・ソフトウェアのUI説明
    ・ゲームの実行
    ・プロジェクトの作成
    New Projectを作成,.packageの読み込み,2Dモード3Dモード選択
    ・アセットストアの使い方
    ・サンプルシーンの説明
    ・サンプルシーンのビルドなど
  2. 簡単なページ遷移の作成
    1. デスクトップをデフォルトに(その後好きなの選べ)
    2. AssetsフォルダはプロジェクトのAssetsフォルダのこと.フォルダ,ファイルの作成はここでもできる(これ超便利)
    3. 他のAssetsとの名前の差別化が必要 mySceneとかmyMaterialとmyをつける方法,全部大文字でPREFABにするなど各自スタイル決めて
    4. フォルダ作成してmySceneかSCENEと名前つける
    5. そのフォルダ内にシーンを保存
    6. GameObject>UI>Buttonでボタン作成(※このUIはuGUIを呼ばれver4.6から搭載)
    7. 位置を調整し,色をカスタマイズ
    8. 1stSceneという名前で保存,また新規シーン作成し,2ndSceneという名前で保存(シーンを2つ作る)
    9. 1stSceneを開く
    10. 自作スクリプト保存用フォルダ作成 ex. myScript
    11. C#スクリプトを作成,スクリプト名はloadlevel1
    12. void update{}の下に以下3行を追加
(黄色い部分)
using UnityEngine;
using System.Collections;

public class loadlevel1 : MonoBehaviour {

	// Use this for initialization
	void Start () {
	//ここは起動時に1回実行
	}
	
	// Update is called once per frame
	void Update () {
	//ここは毎フレーム実行
	}

	public void OnClick() {
		Application.LoadLevel ("2ndScene");
	}
}
  1.  Buttonにこのスクリプトをアサイン(アサイン方法は2通りある)
  2. ◎ボタンをクリックし,このボタンオブジェクトを選択,右のfunctionの中からloadlevel1のonClickを選択
  3. 再生ボタンで実行>失敗するはずです
  4. 保存して,File>Builsettingsを開きAddCurrentをクリック,次に2ndSceneを開き,またAddCurrent,また1stSceneを開き,ゲーム実行する.
  5. 今度は2ndSceneが開けたはずです.
  6. 複数あるシーン(レベルと考えてもかまわない)をBuildSettingsに予め登録しておくことが必要.(重要)
  7. ビルドすると,アプリが作成される
  8. 余裕があれば2ndSceneにボタンとスクリプトを追加し,往復できるアプリにする
  9. さらに余裕があれば,スクリプトが1つで済むようにシーン名で判断させる
ヒント
  10. 
if (Application.loadedLevelName == "2ndScene") {

     //ここに何をいれるといい?
    
}

     

UnityRemoteというソフト

Unity Remoteというソフトがあります.

デバイスにインストールしなくても,iOSの場合はX-CODEでビルドしなくても,エミュレータソフトで,加速度やジャイロ,タッチなどの動作を確認できます.

開発速度あがります.

 

デバイスでオブジェクト当たり判定

タッチ動作ですがマウスクリックのスクリプトを書いても,タッチ判定できるようですね.

もちろんスワイプなどはInput.touchあたりを使わなきゃならないんでしょうが,,

単にクリックだけでは当たり判定できない.Raycastを使ってタッチした位置から見えない光線を出して,コライダにあたっているか判定させる.こうしないと当たり判定にならない(しつこい)

 

ということで全文.

こちらのスクリプトを利用ー徐々に改良書き込んでいきます

http://bribser.co.jp/blog/tappobject/

using UnityEngine;
using System.Collections;

public class touch : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {

		if (Input.GetMouseButtonDown(0)) {
			
			Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
			RaycastHit hit = new RaycastHit();
			
			if (Physics.Raycast(ray, out hit)){
				GameObject obj = hit.collider.gameObject;
				Debug.Log(obj.name);
			}
		}


	}
}

 

ネットワークタイムサーバから時刻もってくる

カウントダウンのアプリなのに,デバイス毎に時刻違うってダメじゃん.

ということで,NTP(ネットワークタイムサーバ)から時刻もってくるの.

NTPについては(ここ)みんなのスマホもこれ時間合ってるんだよ。

これ,コンソールに時刻差出します.(多分コンソールで出る数字はミリ秒)

<!DOCTYPE html>
<html>
<head>
<title>Time</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<!-- metaタグで スマホの挙動を制限している -->
</head>
<body>

<script type="text/javascript">


httpObj = new XMLHttpRequest();
httpObj.open("get", "https://ntp-a1.nict.go.jp/cgi-bin/json", true);
httpObj.onload = function(){

	var myData = JSON.parse(this.responseText);
	//var mySt = myData.st;
	var mySt = (myData.st * 1000) - Date.now();
	//var txt = "";
//	for (var i=0; i<myData.weather.length; i++){
//		txt = txt + myData.weather[i].description + "  " + myData.weather[i].main+"<br>" + "<img src=http://openweathermap.org/img/w/" + myData.weather[i].icon + ".png>";
//	}

	console.log(mySt);

}
httpObj.send(null);


</script>



</body>
</html>

で,現時刻との差分ですが

まず,コードの上の方の初期化あたりに

///ネットワーク時刻取得
var mySt;
httpObj = new XMLHttpRequest();
httpObj.open("get", "https://ntp-a1.nict.go.jp/cgi-bin/json", true);//NTPサーバに行って時間取得
httpObj.onload = function(){

	var myData = JSON.parse(this.responseText);//JSONで内容をmyDataに入れる
	mySt = (myData.st * 1000) - Date.now();//IDがstの数字をひっぱってくる.NTPの戻り値は小数点以下3桁まであるので,1000描けてUNIX時間に変更する.ほんでミリ秒の誤差を出す

}
httpObj.send(null);

いれておいて(2行目のvar myStがグルーバル変数になります)

そのあとの日付ほしいところで

var nowDate = new Date(Date.now() + mySt);//ネットワークタイムを利用して時差を埋める

で,日付入れてます.

カウントダウンなので毎回new Date();していますが,本当はこの時刻を100ミリ毎くらい引いていけばいいのですが,元のプログラムを大幅に変更するのがいやだったので,,

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

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

UTCからJSTに変換

日付扱っている方,日付オブジェクトの中身を確認してください

下の例だとmyDateをコンソールで表示

時間が9時間前ならutcです.

JSTを使いたい場合,これでうまく行きそうです.

日付をとる場合、午前だと前日が表示される場合があり,その原因はUTCです.

myDate = new Date();
console.log(myDate, "UTC");
myDate.setHours(myDate.getUTCHours() + 9);//時差の9時間を足す.サマータイムはとかの突っ込みはご容赦
Year = myDate.getFullYear();
Month = myDate.getMonth() + 1;
Day = myDate.getDate();
console.log(myDate, "JST");