「Unity」カテゴリーアーカイブ

Unity用のリアルな地形を取得する2

Windowsの場合

基盤地図情報ビュアーをDLします.下記リンク先の下の方にあります.

http://fgd.gsi.go.jp/download/menu.php

起動し,新規プロジェクトを作成し,ダウンロードして(1度解凍された中にある)ZIPファイルをそのまま読み込みます.

ki7

 

設定>表示設定

ki9

 

DEM表示設定>連続段彩

ki8

 

設定を以下のように

ki11

 

以下のような標高画像となります(陰影があるとうまくいきません)

ki12

 

画像イメージの保存を選択し,書き出す範囲を選択します.高解像度のtiffが保存されます.

ki13

1ピクセルは5mのようですが,別のパタンでは4km=780ピクセルとなり,1ピクセルは5.1282mのようです.

Photoshopでトリミングします.正方形がベターです

画像を16bitに変換し,RGBからグレースケールに変換します.

解像度を2のべき乗+1にします.(512なら513,1024なら1025)

ki15

汎用フォーマットで保存します.設定は以下のように.

ki14

 

Unity用のリアルな地形を取得する1

国土地理院から公開されている地形を取得し,Unityで使用可能な地形に変換します.

 

国土地理院の基盤地図情報サイトへアクセスします

http://www.gsi.go.jp/kiban/

ダウンロードには会員になる必要がありますので,予め会員になっておきます.

ダウンロードファイル形式は数値標高モデルにします

ki2

5m =メッシュを選択

ki3

必要なエリアを選択します.

ki4

選択完了をクリック.

ki5

ダウンロードするファイルにチェックを入れ,まとめてダウンロードをクリックします.ログイン状態であればそのままダウンロードが始まります.

ki6

ダウンロードされたZIPファイルを解凍します.

Windowsの場合,解凍フォルダ内に別のZIPファイルがあります.これを解凍しないで使用します.

Macの場合,解凍フォルダ内にあるZIPフォルダを全て解凍します.

つづく

Unityでトゥーンシェーダ

なんだ,Wordpress動画いけるんやん.

UnityでToon Shaderです.

Mayaではこちら

Mayaと似ていて、MaterialのシェーダをToonにするというアプローチです.これ,良いのか悪いのか,,,そのMaterialを割り当てた物だけToonになるということは,全体をToonにするのはかなり手間がかかるんでは?とSIを懐かしむ。

ーー

UnityにEffectsパッケージを読み込みます.

Assets>Import Package >Effects

ut2

アセット内のStandard Assets内にEffects,その中にToonShadingが読み込まれたか確認します.

ut1

Materialを作成します.

Assets内で 右クリック>Create>Material

ut3

名前をtoon等に変更します.

ut7

InspectorのShaderを Tonn>Basic Outilineに変更します.

UT8

次に,ToonShader CubemapのテクスチャにToonLitを選択します.

ut9

Main ColorとOutiline Colorを変更し,このマテリアルをモデルにアサインします.

ut10

再生するとこんなかんじになります.

ut11

参考動画

【カスタマイズ】

奥は3階調,手前は4階調になっています.このようにカスタマイズすることも可能です.

ut13

まず,Photoshopで適当なグラ-デーションを作成します.

画像サイズは64×64ピクセルです

ut14

次にこの階調数を落としていきます.

イメージ>色調補正>ポスタリゼーション

UT15

できた画像を補正します.以下のようにしてみました.

ut16

Unityに読み込み,Texture Typeと,Mappingを変更します.

ut17

これをToonのマテリアルのToonShader Cubemapにアサインすれば独自の階調のToonが作成可能です.

UnityでIBL風

UnityでもIBL風の描画が可能です.

以前はCubeMapという6枚の画像を作成する必要がありましたが,現在はそこが自動化されているようです.

まず適当にオブジェクトを配置します.

マテリアルのMetalicの設定を多めにしたものをアサインしています.

unityibl1

 

つづいて,HDRファイルを読み込みます.色が変になっていますが,気にしないで.

unityibl2

 

読み込んだHDRファイルを選択し,インスペクタを調整します. Texture Typeは Cubemapにし,MappingはAutoでかまいません.設定後,Applyをクリックします.

unityibl3

 

つづいて, Asset>Create>Material マテリアルを作成し,名前を適当に決めます.この場合はmysky2にしています.

unityibl4

 

作成したMaterialを選択し,インスペクタを以下のように設定します.ShaderはSkybox/Cubemapに.Cubemapに読み込んだHDR画像を.

unityibl5

 

つづいて,現在のカメラのSkyboxの設定を変更します.Window>Lighting を選び,開いたインスペクタの Scenesのタブを選択し,Skyboxの項目にさきほど作成したマテリアルmysky2をいれます.

unityibl6

 

こんなかんじになります.左の球2つは,反射にボカしを入れて,質感を変えていますよ〜

unityibl8

 

この影についてはIBLではんくDirectional Lightの影を使用しています.そこまで複雑な計算はできないようですね.

追加

メタリックなもの以外にも効果はあります.(HDR設定入れ済み)

unityibl9tuning

左 ノーマルのスカイボックス,右 IBLとカメラエフェクト追加

(参考)

右図のカメラエフェクトの例

unityIBL10

おつかれさまでした.

あれをUnityで作ろう2

Unityを開き,

作成したCubeのFBXファイル,テクスチャ画像ノーマルマップ画像を読み込み,ゲーム画面に配置します.(この画像ではScale Factorを10に変更していますが,このあたりは各自設定によって変わります)

u06

作成した画像もよみこまれています.

u07

assetの中で 右クリック>Create Material で新規マテリアルを作成します.

そのマテリアルのインスペクタのAlbedoの左の□部分に,テクスチャ画像をドロップしてアサインします(下図)

u08

次に,Normal Mapの部分に,作成したノーマルマップ画像をドロップしてアサインします.(下図の紫の部分)

u09

作成したマテリアルをステージのCubeにドロップします.

u10

おしまい.

正確に作るにはAdobe Illustratorを使用してデザインし,Photoshopに出力し,NormalMapに変換するという流れになり,Mayaで作成したこれ,

m19

近い形も作成可能です.

Photoshop,Illsutratorは必須のツールです.

 

さて,ここで注意しなくてはならないのは

NormalMapは画像で法線方向を変えることで擬似的に立体感を出しているということです.

実際には6ポリゴンの立方体です.年輪のような細かいシワをゲームで表現したいとき,デバイスの能力が限られており,このような方法でごまかすことになります.

Mayaではディスプレイスメントマップという方法で,同様のことが可能です.こちらは実際にモデルを変形することもできます.

モデリングでいくのかNormalMapでいくのかは状況に応じて使い分けてください.

こうした細かいモデリングは,Mayaなどではなく,スカルプト系と言われるモデラーが使用されます.AutodeskだとMudBoxなどですね.

あれをUnityで作ろう1

あれをUnityで作ります.

まずはMayaでcubeを作成し,

UVの編集>UVテクスチャエディタ でテクスチャエディタを開き,

ポリゴン>UVのスナップショット でUV展開の様子を保存します

u01

 

このcubeを選択し,

ファイル>選択項目の書き出し をおこない,FBX形式で書き出してください.

u05

 

これをPhotoshopで開き,枠線を頼りに下図を作成します.

u02

実際に使用するファイルはこちらからダウンロードできます.(枠線は隠してることに注意)

 

次に,Photoshopで凹凸の画像をグレースケールで作成します.レイヤーの組み合わせなどは下図を参考に

u03

実際に使用するファイルはこちらからダウンロードできます.(実際にはこのファイルは使いません)

PhotoshopCCであればこれをノーマルマップ形式に変更します.MacであればCrazy Bump,Winであればノーマルマップ変換用ソフトでこれをノーマルマップに変換します.

下図はCrazyBumpでの編集の様子です.

u04

作成したノーマルマップを書き出します.

実際に使用するファイルはここからダウンロードできます.

つづいて,Unityでの作業です.

c#のファイル名を間違ったとき

プログラミングは独学なので,他の一般的なプログラミングの話とは異なるかもしれませんが,,,

Unityでc#のファイルを作成したとき,うっかりファイル名を変え忘れたり,ファイル名を変えたのに動かないときがあります.

それには,ここを修正してください.

public class qwatch : MonoBehaviour {

この qwatchがファイル名と同じなら動作します.そうでない場合はエラーがでます.

例えば,neko.csというファイルをinu.csと変更したいとき,

public class neko : MonoBehaviour {

となっているのを

public class inu : MonoBehaviour {

と変えればいいわけです.

ところで,うしろの{ から 一番下の行の }までがプログラムの中身になります.

using UnityEngine;
using System.Collections;
using System;

public class inu : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}

	void Awake(){

		//StartCoroutine ("colorSwitch");
	}

}

黄色で示した5行目から17行目の間が,このinu.csで動作するプログラムです.なので,プログラムはこの{と}の間に書きましょう.

スクリプト事例ークイズ中の経過時間表示

staticで変数をグローバル化しているけど,これは使用したのか不明.

lapTimeのboolをOn/Offしてて,ポーズ中は時間経過をスルー if(false) させている.

ポーズ中は色を点滅= コルーチンのcolorSwitch()のとこ

これ,colorSwitch()のコルーチンを止めていないっぽいんで,7問だからいいけど,ポーズ以外はコルーチン止めたほうがいいかも.

using UnityEngine;
using System.Collections;
using System;
using UnityEngine.UI;


public class qwach : MonoBehaviour {

	public static float Quiztime = 0;//read from global
	public GameObject startPanel;
	public GameObject startKaitou;

	public Text timeTex; //Text用変数
	private bool lapTime;


	// Use this for initialization
	void Start () {
		Quiztime = 0f;
		startPanel.SetActive (true);
		lapTime = false;
		timeTex.color = Color.grey;
	}

	void Awake(){

		//StartCoroutine ("colorSwitch");
	}

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

		if (lapTime) {
			Quiztime += Time.deltaTime;
			timeTex.text = Quiztime.ToString ("f2") + "秒経過";
			;
			//timeTex.text = timeTex + "秒経過";
			//Debug.Log (time.ToString ());
		} else {
			//pause syori
			//StartCoroutine("colorSwitch");
				
			}
	
	}

	private IEnumerator colorSwitch(){
		while (true) {
	
				timeTex.color = Color.grey;
				yield return new WaitForSeconds (0.5f);
				timeTex.color = Color.white;
				yield return new WaitForSeconds (0.5f);
		}
	}


	public void qwPause(){
		StartCoroutine ("colorSwitch");
		lapTime = false;
	}

	public void qwStart(){
		StopCoroutine ("colorSwitch");
		timeTex.color = Color.white;
		lapTime = true;
	}


	public void qStart(){
		lapTime = true;
		startPanel.SetActive (false);
		timeTex.color = Color.white;

		startKaitou.SetActive (true);
	}

}

 

スクリプト事例ースコアをランキングして表示

PHP用のスクリプト(コア部分)

    $query = "SELECT * FROM `scores` ORDER by `score` DESC, `time` ASC LIMIT 20";//score timeの順にソート
    $result = mysql_query($query) or die('Query failed: ' . mysql_error());
 
    $num_results = mysql_num_rows($result);  
 
    for($i = 0; $i < $num_results; $i++)
    {
         $row = mysql_fetch_array($result);
		 echo $row['cName'] . "\t" . $row['name'] . "\t" . $row['score'] . "\t". $row['time'] ."\n";
    }

score(降順)と time(昇順)でソートしたデータの

色,名前,スコア,時間を表示している

 

ユーザ名重複をチェックしていないので,1人で何ランキングも表示される.ユーザ名重複チェックは,PHP側,Unity側のどちらですればいいのか,今後検討.