饂飩コーディング

iOSアプリやら、Unityやら、Cocos2dやらごにょごにょ書いております

BlenderモデルがUnityで透明?面が無くなっている場合の対応

f:id:appdeappuappu:20140619225413p:plain
左の青い箱は奥側面が透明になって向こう側の方眼が見えています。
一方右側の黄色い箱は突き抜けていません。←Blenderでは黄色になると思って作成しました。

なんで青のパターンになるんだろうとしばらく悩み、何度かモデリングし直したりしたんですが、うまくいったりいかなかったり。でぐぐったらここにたどり着きました。

↓StackOverFlowにも質問があったみたい
http://blender.stackexchange.com/questions/1489/messed-up-blender-models-when-exporting-to-unity3d

Faceの表裏(法線の方向でわかる)が自分が思っていなかった面に向いている場合、Unityではその面を表示しないらしい。解決方法としてはBlender側で面の表裏を整えてあげるとOK!
方法1Control+N でrecalculate Outsideして法線面をすべて外側を向く様に処理を施す。
f:id:appdeappuappu:20140619230700p:plain

方法2透明になった面をEditModeで法線面を表示させて該当の面を探し出して、Mesh menu →Normal→Flip Normalsする。
法線は下の様に、normalの面選択ボタンっぽいアイコンをクリックするとでてきます
f:id:appdeappuappu:20140619231143p:plain

法線面の方向を示す青い線を注意深くみるとわかった。




さらにコチラの情報を参考にさせていただき、法線面が逆になっていたことが確認でき、対応できました
http://cgnoteblender.blogspot.jp/2011/04/blender-256-normal.html



追記
この件しらべていて今更ながら分かったんですが、今使ってるUnity Version4.5はBlender Version2.7のファイルそのままAssetとしてImportできて使える。いままで.fbxでExportして使ってました。


Blender 3DCG モデリング・マスター

Blender 3DCG モデリング・マスター

Unity でパチンコ台を作ってみたその1

f:id:appdeappuappu:20140617104400p:plain
↓実行結果 ただ玉が出てスタートチャッカーにはいってデジタルが回るってだけです
http://nrtkb.sakura.ne.jp/forblog/unityFolder/PachinkoSWeb.html

Textureちゃんとしたの作って
リーチアクション作って
大当たり処理つくって
釘ちゃんとして
とかやってたら、使ってくれる人いるかな?


作成手順概略
1、枠の作成 Cube + 曲線部分
2、スタートチャッカー、玉吸い込み口(下部)作成
3、釘配置、玉作製、液晶枠作製
4、出目部分作製
5、保留ランプ作製
6、スタートチャッカーと絵柄のスタート停止コーディング

ざっと、こういう流れで作製しましたが、
今後の機能追加は実装自体はらくそうです。


演出をどうやって作ろうか頭が痛い。

Transparent CutOut使ってみる!

f:id:appdeappuappu:20140611174554p:plain
実行結果はこちら↓
http://nrtkb.sakura.ne.jp/forblog/unityFolder/transparentcutoffT.html

Photoshopかなにかで下の様に、グラデーションのマスクをかけます。
f:id:appdeappuappu:20140611174623p:plain

上で作成した画像ファイルをTextureとしてUnityにAssetにして、Materialを作る時にUnlit Transparent CutOutを選択します。
f:id:appdeappuappu:20140611174753p:plain

あとはAlpha CutOffの値をいじるとAlphaの値を境に表示するかしないかをやってくれるので
使い道ありそうですね。

Animationで上記の値を操作できるので楽チンです。
f:id:appdeappuappu:20140611175124p:plain





コチラを参考にさせていただきました
http://d.hatena.ne.jp/nakamura001/20130208/1360346901

Depth Maskをつかってみる

f:id:appdeappuappu:20140611091857p:plain
やっぱりパチンコのデジタル画面みたいなのを実装する場合は
マスク領域を確保したいのでググっていたらDepth Maskなる物があるという事で使ってみました。
実行結果↓
http://nrtkb.sakura.ne.jp/forblog/unityFolder/depthd.html


画面描写の順番をコントロールする事で実現している?って程度しか理解できちませんが、色んな場面で使えそうです。


参考とさせていただきました。
http://unitygeek.hatenablog.com/entry/2013/04/01/164040
http://wiki.unity3d.com/index.php?title=DepthMask
https://www.youtube.com/watch?v=Lz94SDbpvNc

スロット的な物を実装! 前回とは違ったやり方 Animation Texture編

f:id:appdeappuappu:20140610184414p:plain
まずは実行結果↓
http://nrtkb.sakura.ne.jp/forblog/unityFolder/slotPachinkoSample.html





前回は↓コチラのエントリーで、Cameraを複数台使ったバージョンでしたが、やはり処理にコストがかかる事がネックでしたので今回はAnimation Textureでやってみました。
http://appdeappuappu.hateblo.jp/entry/2014/05/20/093253


こちらは、結構簡単で貼付けたtextureのTilingとOffsetをアニメーションでコントロールしていくだけ。

gameObjectの階層で注意する点

いままでオブジェクトの階層構造を意識したことがなかったので、prefabeから大量の同一GameObjectを作成した場合にRayでタッチ判定させたときのタッチされたGameObjectの動きは階層を意識しないと動きを制御できなることに気がつきました。

当然と言えば当然なんですけどね。

自分自身の子オブジェクトを操作する時は
gameObject.transform〜と「gameObject」は小文字で!!!
これはthis.gameObjectの略でスクリプトから見た時のくっついている親ってことですね。

 GameObject cube2 = gameObject.transform.FindChild("Shape1").gameObject;

GameObject.Find〜だとShape1を全体(root)から順に詮索して最初のObjectを返します

GameObject cube2 = GameObject.Find("Shape1").gameObject;

GameObjectの階層はまたしっかり勉強することとします。

ちなみにGameObject はClassだからgameObject(this.gameObject)とはそもそも別物ですね。


以下の「gameObjectとGameObjectの違いとは?」を参考にさせていただきました
http://unitylab.wiki.fc2.com/wiki/スクリプト

LineRendererで線を引いてみよう

f:id:appdeappuappu:20140603211219p:plain
↓実行結果
http://nrtkb.sakura.ne.jp/forblog/unityFolder/lineRendererWeb.html

こんな感じでオブジェクトを線で結ぶ場合は、LineRenderer compornentsを使用します

両端のobjectが固定の場合(添付画像の緑線でつながっている場合)

1、empty Objectを作成してLineRendererObjectと名前をつける
2、LineRendererObjectにLineRenderer compornentをAddする
3、LineRendererObjectに以下のLineRendererScript1を追加する
4、Cube objectを二つそれぞれCube1,Cube2という名前で設置する

using UnityEngine;
using System.Collections;

public class LineRendererScript1 : MonoBehaviour {
	
	void Start () {
	
	}

	void Update () {
		GameObject cube_1 = GameObject.Find("Cube1");
		GameObject cube_2 = GameObject.Find("Cube2");
		LineRenderer lineY = GameObject.Find ("LineRendererObject").GetComponent<LineRenderer> ();
		
		lineY.SetPosition(0, cube_1.transform.position);
		lineY.SetPosition(1, cube_2.transform.position);
	}
}


両端が固定で線をアニメーションさせる場合
1、empty objectを作成し、LineRenderer componentを追加する
2、LineAnimation Scriptを作成しLineRender Componentに追加する
3、始点のSphere、終点のSphereを設置しLineAnimation ScriptのPublic変数をこの二つのobjectで設定する
f:id:appdeappuappu:20140603224416p:plain

using UnityEngine;
using System.Collections;

public class LineAnimation : MonoBehaviour {

	private LineRenderer lineRenderer;
	private float count;
	private float howLong;

	public Transform saisyo;
	public Transform kokohe;
	public float lineDrawSpeed;


	void Start () {
		lineRenderer = GetComponent<LineRenderer> ();
		lineRenderer.SetPosition (0, saisyo.position);
		lineRenderer.SetWidth (.1f, .1f);

		howLong = Vector3.Distance (saisyo.position,kokohe.position);
	}
	
	void Update () {
		if (count < howLong) 
		{
			count += .1f / lineDrawSpeed;

			float x = Mathf.Lerp(0,howLong,count);

			Vector3 pointA = saisyo.position;
			Vector3 pointB = kokohe.position;

			Vector3 pointAlongLine = x * Vector3.Normalize(pointB - pointA) + pointA;


			lineRenderer.SetPosition(1,pointAlongLine);
		}
	}
}

線の描画がアニメーションかつ繰り返しば場合

線が最長になった時に以下の様にインデックスを0にして線を消す

lineRenderer.SetVertexCount(0);

その後再描写を行う様に

lineRenderer.SetVertexCount(2);
lineRenderer.SetPosition (0, origin.position);
lineRenderer.material=materials[1];

もう一度インデックスを二つにし、SetPosition,Materialの再設定をおこなう




Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル

UnityではじめるC# 基礎編

UnityではじめるC# 基礎編