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

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

UGUIのテキストをSQLでチェックするPHP

そのユーザ名が存在するかチェックする

<?php
    // Send variables for the MySQL database class.
    $database = mysql_connect('myserver.jp', 'username', 'passwd') or die('Could not connect: ' . mysql_error());
    mysql_select_db('dbname') or die('Could not select database');
	
	
	
	//変数宣言
$keyword='';	//不正防止用キーワード
$resultData='';	//返すデータ
 
//データ受け取り
if(isset($_POST['keyword'])){
  $keyword=$_POST['keyword'];	//キーワード
  
}
//print $_POST['keyword'];
$name= $_POST['keyword'];
//print $name;
//if($keyword==null or !($keyword==$key['get_score_ranking'])){
//  $redirectUrl = "http://filmm.info/404.html";
//  header("HTTP/1.0 404 Not Found");
//  print(file_get_contents($redirectUrl));
//  exit;
//}



//search test
	$nameresult = mysql_query("SELECT * FROM `scores` WHERE `name` = $name");//文字列検索はシングルクォート
if (!$nameresult) {
    die('クエリーが失敗しました。'.mysql_error());
}
//echo mysql_num_rows($nameresult);
	print mysql_num_rows($nameresult);
	
?>

かなり不要部分多し

ちょっとセキュリティ的には良くない部分有り

スコアを追加するPHP

Unityから呼び出したサーバ側に設置するPHPです

<?php 
        $db = mysql_connect('severurl', 'sq_lusername', 'sql_password') or die('Could not connect: ' . mysql_error()); 
        mysql_select_db('sql?database_name') or die('Could not select database');
 
        // Strings must be escaped to prevent SQL injection attack. 
        $name = mysql_real_escape_string($_GET['name'], $db); 
        $score = mysql_real_escape_string($_GET['score'], $db);
		$cName = mysql_real_escape_string($_GET['cName'], $db); 
        $hash = $_GET['hash']; 
 
        $secretKey="****"; # Change this value to match the value stored in the client javascript below 

        $real_hash = md5($name . $score . $cName . $secretKey); 
        if($real_hash == $hash) { 
            // Send variables for the MySQL database class. 
            $query = "insert into scores values (NULL, '$name', '$score', '$cName');"; 
            $result = mysql_query($query) or die('Query failed: ' . mysql_error()); 
        } 
?>

スコアを追加できます

MySQL(5.5)にテーブルを追加(ハイスコア用)

ハイスコア記録用のCSスクリプト組んでます.

たぶんscoresというテーブルを作って,ID番号(自動インクリメント),名前,スコア,cName(独自に追加)を要素にするというものだと思う

CREATE TABLE `scores` (
   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   `name` VARCHAR(128) NOT NULL DEFAULT 'anonymous',
   `score` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`cName` VARCHAR(128) NOT NULL DEFAULT 'anonymous'

)
ENGINE=MyISAM;

最後のENGINE=MyISAMはmySQL5.5用

4.xだと

ENGINE=MyISAM;

だそうです

追加

CREATE TABLE `scores` (
   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   `name` VARCHAR(128) NOT NULL DEFAULT 'anonymous',
`cName` VARCHAR(128) NOT NULL DEFAULT 'anonymous',
`area` VARCHAR(128) NOT NULL DEFAULT 'anonymous',
`quize` BOOL NOT NULL DEFAULT '0',
   `score` INT(10) UNSIGNED NOT NULL DEFAULT '0'
`time` INT(10) UNSIGNED NOT NULL DEFAULT '0'
)
ENGINE=MyISAM;