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

速習:ARアプリ1

瞬時にARアプリを作ります(更新中 2017年7月)

Unity ver. (5 or latest?) no info.

renew 05.Jul.2017

Vuforia is not Free > https://developer.vuforia.com/pricing

Vuforia Lib ver. 6-2-10(latest ver. on Jul 2017)

https://developer.vuforia.com/

へ行き,Regisiterをクリックし,必要事項を入力し登録します.

Vuforia Developer Portalへログインし,

Downloads>SDKの,

Download Unity Extensionをダウンロード(Win,Mac共通)

※UnitypackageはWin,Mac共用できることが多いですよ

Unityを開き,Assets>Import Package>Custom PackageダウンロードしたUnitypackageを選択し,全てImportします

vuforia2

Importします

古いスクリプトを最新版にコンパイルし直すか聞かれるので,I MADE a Backup,,,,,をクリックします

次へ

こんなデザインはイヤだ(その1)

その2は未定です。

モリコロパーク行って案内図のひどさに悲しくなりました.

問題の地図は↓ですが,,,

map1

ささいなことですが,簡単なルールは守って欲しいなぁ〜ということでどこがマズイのか.

(1)地図内の記号と周囲の説明写真が不一致.

bad1

関連づける記号は色とタイプフェイス(フォント)は一致させるべき.すなわち大観覧車の写真には,地図内と同じく緑地の白文字のゴシック,エンボス有りの記号をつけなくてはなりません.(またはその逆)

 

(2)スタンプラリーのスタンプの枠の色が,地図内では違う意味で使われている.

これも「色の一致」という基本ルールを忘れてしまったようですね.

ちなみにスタンプは9の数字があるあたりにありましたが,,地図にはそのことが書かれてありません。

bad2

(3)近接あるいは交差している線が似ている

これは細かいことですが,サイクリングロードとバスの道が同じ線幅で描かれています.しかも明度が近いため誤認しやすそうです.

bad3

一般客には重要度が低いバスの線は細くしたり,サイクリングロードは破線にするとかしたほうがいいかもしれませんね.

この地図は大丈夫ですが,公共のデザインをする際には色覚異常を持つ人のための,カラーユニバーサルデザインあたりを参考にしてデザインしてみてください.

 

(4)番外編

地図の種類が複数あります

http://moricoro-park.com/riyouannai/parkmap/

のページに行くとパンフレット「裏面」と,「クリックで拡大します」の地図の2種(その下に解像度が低くて読めない地図も入れると3種)ありますが,この3つが見事にバラバラです.

パンフレットの番号は,エリア名ですが,クリックで拡大の地図はバス停の停車順になっています.最近は駅に番号をつけるのが流行っています.八事なたT15,M20です.こういうのを含めたトータルデザインをすべきなんですが,,

特定の日付までのカウントダウンを作る

とあるイベントまでのカウントダウンタイマーの例です.

C#ですとこんな書き方があります.

using UnityEngine;
using System.Collections;
using System;//.netフレームワークを使います一行上のものと一緒?
using UnityEngine.UI;   // UIを使います.UI使用時は必須

public class countTime : MonoBehaviour {
	System.DateTime mynow;//日付形式の入れ物作成(以下2つも)
	System.DateTime date2;
	System.DateTime date1 = new DateTime(2015, 4, 2, 18, 30, 0, DateTimeKind.Local);//カウントダウン終了時刻を時刻形式で設定
	string myString;//日付表示のための文字の入れ物
	string myString2;//ん?これ未使用?
	bool countdSW = false;//これも未使用?

	public Text countDownTime;//unity UIのTextコンポーネントをプロパティ画面でアサインできるように準備
	void Start () {

		// 現在時刻の取得
	mynow = DateTime.Now;//これ無意味ですが,気持ちの問題です

	
	
	}
	
	// Update is called once per frame
	void Update () {

			
						mynow = DateTime.Now;//最新時刻を取得
		if (mynow < date1) {//日付の入れ物同士は比較演算子が使えますので,カウントダウン終了時刻と現時間を比較

						TimeSpan span = date1 - mynow;//Timespanという時間の長さを入れる専用の入れ物を作ってspanに入れる.これ.NETらしい

						myString = string.Format ("{0:00}h{1:00}:{2:00}:{3:00}", span.Days, span.Hours, span.Minutes, span.Seconds); //これも未使用?
						countDownTime.text = string.Format ("{0:00}d{1:00}h{2:00}m{3:00}s", span.Days, span.Hours, span.Minutes, span.Seconds);//残時間spanから各時間要素を取り出す {0:00}はその表示形式の設定ルール

				} else {
						countDownTime.text = "00d00h00m00s";//カウントダウンを越えたら0を入れる.ここに別のテキストを入れてもいいかも
				}
		}



}

ポイントは

1.日付形式 System.DateTime で変数作成

2.時間の長さを入れる TimeSpan で変数作成

3.日付形式の変数同士で > や <が使える

4.stringのフォーマット形式{0:00}{1:00}など

です

PlayMarketでの公開について

Google Play Marketへの公開って.apkは50MB制限だそうです.

で,SpilAplication Binary というオプションで50MB以下におさえられるみんな言ってるけど,おさえられない.

どうも,分割されないものもあるらしい.

なのでこれやっても100MB 越え,,,

基本的に読み込んだアセットなどのうち,未使用のものはアプリに入らないらしいが,

ということで,試しに未使用の日本語フォントを削ってみたらあっさり減りました.

ということで,日本語フォントは(再配布可能なフォントですよもちろん)あまり種類使えない,,,

1書体15MBとすると,1つかふたつが限界かと,,

どうしても多種のフォントを使用したい場合,静的な文字は画像でいれるのが良いかも.

となるとキレイに出力するためには,AdobeIllustrator,Photoshopがやはり重要になってきますね,,

iTweenのonCompleteがおかしい

iTweenの処理後の操作でoncompleteを使うけど,指定した関数に飛ばない.

DebugLogを見ると飛んでいるようだけど,やってくれない.

うまくいかなかった例

iTween.FadeTo(obj, iTween.Hash("alpha", 0, "time", 0.4f,"oncomplete","boolReset","oncompletetarget", obj));

function boolReset(){
//bool reset
}

 

iTween.FadeTo(obj, iTween.Hash("alpha", 0, "time", 0.4f,"oncomplete","boolReset"));

function boolReset(){
//boolreset
}

 

うまくいった例

iTween.FadeTo(obj, iTween.Hash("alpha", 0, "time", 0.4f,"oncomplete","boolReset","oncompletetarget", gameObject));

ほげぇ,,,

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") {

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

     

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

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

ということで,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ミリ毎くらい引いていけばいいのですが,元のプログラムを大幅に変更するのがいやだったので,,