Photonについて

Photon(光子)の設定です

光子と飛ばして光りのふるまいを計算させる手法です.

GIを使用する場合,IBLならばHDR画像が光源になるのですが,そうでなくMaya内の光源(Point Lightとか)を使用する場合にはPhotonを飛ばします.

(未確認)IBLはPhoton出してると思います.

光源(この場合Pointlight)を選択し,コースティクスとグローバルイルミネーションの中にある設定を以下のように

photon7

最下部のコースティクスフォトン(コースティクスをONにしないと選択できない) GIフォトンは最初は少なめの9万くらいから調整しましょう.

レンダラーの設定でGIをONにします.下記も参考に.

photon2

フォトンが見えすぎています.

そこでFGをONにします.

photon3

 

真ん中の球をガラスの設定にし,屈折率を入れ,コースティクスをONにします.ライトのコースティクスの値を99万くらいにいsています(下図右).下記はrefraction 1.4

photon5

下記はrefraction 2.0

photon6

以上,Photonでした.

メンタルレイはチューニングに時間がかかりますが、仕上がりはとても綺麗です。一度見てしまうと中毒になります。

また、光源をArea Lightにするともう少し柔らかい影になると思いますが,計算時間が大幅にかかります.

チューニングを繰り返すことで大幅に時間がかかり、うまくいかずストレスも、、

《今週の標語》

メンタルレイをONにするたび、寿命が100日縮むよ。 (恐怖新聞)

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側のどちらですればいいのか,今後検討.

スクリプト事例ースコアをポストする

スコアをポストするそのコルーチン

ただし,エラーが出ても,コンソールに表示されるだけで,処理はなし(ダメやろ)

	// remember to use StartCoroutine when calling this function!
	IEnumerator PostScores(string name, string cName, string area,int quize,  int score, int time)
		{
		string hash = Md5Sum(name + cName + area + quize + score + time);

		string post_url = addScoreUrl + "name=" + WWW.EscapeURL(name) + "&cName=" + cName + "&area=" + area + "&quize=" + quize + "&score=" + score + "&time=" + time + "&hash=" + hash;

			// Post the URL to the site and create a download object to get the result.
			WWW hs_post = new WWW(post_url);
		Debug.Log (post_url);
			yield return hs_post; // Wait until the download is done

		if (hs_post.error != null) {
			print ("There was an error posting the high score: " + hs_post.error);
		} else {
			print("done ");
		}
		}

 

スクリプト事例ーネットワーク接続チェック

PUN使用のためのネットワーク接続チェックスクリプト.UIのパネルをsetactivateをfalseにする.

using UnityEngine;
using System.Collections;

public class netCheck : MonoBehaviour {
	public GameObject netAlertPanel;

	// Use this for initialization
	void Start () {
		if (Application.internetReachability == NetworkReachability.NotReachable) {
			//接続されていないときの処理
			netAlertPanel.SetActive (true);
		} else {
			netAlertPanel.SetActive (false);
		}
	}
	
	// Update is called once per frame
	void Update () {
	
	}


	public void closeAlert(){

		netAlertPanel.SetActive (false);
	}
}

 

スクリプト事例ー色相を動的に変更する

PNUで使用したコルーチンの中身

	private IEnumerator hotaru() {
		Debug.Log ("start rainbow");
		while (true) {
			//Debug.Log (destColor);
			float myHue = 0;
			currentColor =  Color.HSVToRGB (0.5f, 1f, 1f);
			destColor = Color.HSVToRGB (myHue, 1f, 1f);
		//	t += (Time.deltaTime) / duration;
		//	Camera.main.backgroundColor = Color.Lerp (currentColor, destColor, t);
		//	if (t > 1.0) {
		//		currentColor = destColor;
		//	}
			yield return new WaitForSeconds (1.0f);//color hold time
			t = 0;
			if (myHue > 1.0f) {
				myHue = 0;
			} else {
				myHue += 0.2f;
			}
		}
	}