月別アーカイブ: 2013年11月

Unityの回転について

オブジェクトを特定のベクトルに向かしたい時

向く方向(Direction)だけ分かっている場合はQuaternion.LookRotation関数を使う。

by http://docs-jp.unity3d.com/Documentation/ScriptReference/Quaternion.LookRotation.html

オイラー角について

理解しやすいGIF画像がこちらにあるhttp://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E8%A7%92

オブジェクトをその場で回転させるには

TransformのPositionを含まないTransformのQuaternionの中のオイラー角だけを操作すればいい。Positionは考えなくていいのでオブジェクトは原点にあるとイメージとしてもいい。

以下の二つは結果的に同じ事をしている

//第2引数である原点を通るY軸(new Vector3(0,1,0))を回転軸として180度回転させる
transform.rotation = Quaternion.AngleAxis(180,new Vector3(0,1,0));

//第2引数は原点を通る軸の矢印部分(何も指定しなければデファルトで原点を通るY軸の矢印部分)を頭として第一引数である原点から伸びているベクトルの方向に振り向かせる
transform.rotation = Quaternion.LookRotation(new Vector3(0,0,-1),new Vector3(0,1,0));

Quaternion.AngleAxis()とtransform.Rotate()関数の違い

	//Quaternion.AngleAxis()は元のX,Y,Z座標を基準として回転するのに対して、transform.Rotate()はその現在の位置を基準として回転する。
	//例えばUpdate関数にtransform.rotation = Quaternion.AngleAxis(10,new Vector3(0,1,0));
	//とかいてもオブジェクトはUpdate関数が呼ばれる毎に回転しているように見えず静止しているように見えるが、
	//transform.Rotate(0,10,0)はUpdate関数が呼ばれる毎には回転しているように見える
	void Update () {
		transform.rotation = Quaternion.AngleAxis(10,new Vector3(0,1,0));
		transform.Rotate(0,10,0);
	}

Quaternionについて

http://docs-jp.unity3d.com/Documentation/ScriptReference/Quaternion.html

Unityのネットワークについて調べて勉強になったサイト

公式サイト

http://docs-jp.unity3d.com/Documentation/Manual/NetworkedMultiplayer.html

コミュニティーサイトなど

http://www.slideshare.net/koppepan/unity-16450853

サンプルソースコード

https://github.com/anchan828/unity-network-sample

ローカルネットワークのアドレスを確認する方法

http://www.akakagemaru.info/port/windows7.html

マスターサーバのソースコードのダウンロード場所

http://unity3d.com/master-server

上記サイトで分からなかった事を理解した事

RPCについて

by http://docs-jp.unity3d.com/Documentation/Components/net-RPCDetails.html

RPCはリモート(Remote)マシンの関数(Procedure)呼び出し(Calls)を可能にする。

全てのネットワーク通信はNetworkViewコンポーネントで行うためRPC関数を宣言したスクリプトに呼び出し前にアタッチする必要があります。無題

状態同期(State Synchronization)について

by http://docs-jp.unity3d.com/Documentation/Components/net-StateSynchronization.html

サンプルソースコードについて

サンプルコードの抜粋

foreach (GameObject go in FindObjectsOfType (typeof(GameObject))) go.SendMessage (“OnNetworkLoadedLevel”, SendMessageOptions.DontRequireReceiver);

SendMessage関数について

by http://docs-jp.unity3d.com/Documentation/ScriptReference/GameObject.SendMessage.html

FindObjectsOfType関数について

http://docs-jp.unity3d.com/Documentation/ScriptReference/Object.FindObjectsOfType.html

OnNetworkLoadedLevel関数について

マスターサーバへの接続確立とホストサーバの立ち上げというネットワークの事はAssets→PrefabファルダにあるConnectionGUIプレハブがやってくれるのでネットワークの実装とゲームの実装を切り離してプログラム出来る。ゲームの実装はConnectionGUIプレハブのNetworkLevelLoad.csのgo.SendMessage(“OnNetworkLoadedLevel”,//・・・略から呼び出される、各オブジェクトのOnNetworkLoadedLevel関数に書き込む事だけを考えればいい。

オリジナルのプレイヤーオブジェクトの作り方

新規作成したオブジェクトにNetwork Interpolated Transformスクリプトを追加する。Network Interpolated Transformスクリプトの内容は良く分からないが機能的に同期を取るための設定のよう。これを新規追加したNetwork ViewコンポーネントのObservedにドラッグアンドドロップして適応させる。無題

ネットワーク上でNetwork.Instantiate関数を用いてインスタンス化されたオブジェクトに対して呼び出される関数OnNetworkInstantiateの作成をするために適当なクラスを作成(例えば上記の画像のようにThird Person Network Init 2)して、この中に以下のようなスクリプトを書き込む。

using UnityEngine;
using System.Collections;

public class ThirdPersonNetworkInit2 : MonoBehaviour {

void OnNetworkInstantiate (NetworkMessageInfo msg)
	{
		// This is our own player
		//自身のプレイヤーオブジェクトかどうかをnetworkView.isMineで判別し
		//そうであればNetworkInterpolatedTransformスクリプトをオフにし
		//リモート側のプレイヤーオブジェクトであればNetworkInterpolatedTransformスクリプトをオンにする
		if (networkView.isMine) {
			GetComponent ().enabled = false;
			// This is just some remote controlled player
		} else {
			name += "Remote";
			GetComponent ().enabled = false;
			GetComponent ().enabled = true;
		}
	}
}

ネットワーク レベルロード

by http://docs-jp.unity3d.com/Documentation/Components/net-NetworkLevelLoad.html

UnityでのプロジェクトView内のAssets内のファイル名やフォルダ名の変更の仕方

名前を変更したいファイルやフォルダを右クリックしても表示された一覧の中に名前の変更ボタンがなかったためどうすればいいのか分からなかった。適当にファイル名を連打していたら奇跡的にファイル名を変更出来たwwwので、検証しているとどうやら右クリックと左クリックを同時押しと長押しすれば変更出来る事が分かった。あとF2キーでも変更出来るらしい。

Leap motion専用ゲームをUnityで作ってみた

ダウンロードリンク

Donottouchobstacles_LM_[1.0.0]_Windows

遊び方

zipファイルを解凍してexeファイルをダブルクリックすると起動し、画面サイズと画質を設定してゲームスタート。工事現場によくある白黒のオブジェクトに触れるとダメージを受けて残機が減ります。全3つの残機がなくなるとゲームオーバーです。操作方法はマップに置かれている青い球体をLeapが認識した人差し指がマップ場に黄色い球体となって現れるので、遠く離すほど引力が強くなり加速し、逆に近づけるほど減速していきます。

Blenderでテクスチャーを貼り付けたチューブオブジェクトの作り方・その2

前のやり方だとUnityにちゃんとテクスチャが期待通りにマッピングされたオブジェクトをインポート出来なかったので違う方法で早く簡単に作れる方法を見つけた。

過程

まずhttp://na59.jp/blog/2011/04/blender-256-2.htmlのサイトの通りにしてパスのBevelオブジェクトからNurbsCircleを選択して肉付けをする。その際Alt+Cキーでパスをメッシュにする事を忘れない事。パスを伸ばすには先端部分を右クリックしてEキーを押す、延長したいところまでカーソルを持って行き左クリックで確定する。テンキーの7か1か3を押して2D画面すると作業がしやすくなる。

次にhttp://www.youtube.com/watch?v=IXXN3p8aCIMを参考にしてDefaultからUVEditingにして、EditModeにすると表示されるUVMappingのUnwarapのCylinderProjectionなどを選択する。展開された物に画像をマッピングするために左下のImage→openImageから画像を選択。Gキーでマップを移動させたりして調整したらUVEditingからDefaultに戻ってマテリアルが作成されていなければ作成し、テクスチャを作成する。テクスチャのType:NoneをType:Image or movieにしてImageの中にさっきの画像があるはずなので選択してMappingをUVにする。レンダリングしてみてテクスチャが張り付いているか確認する。

エクスポートの仕方は、blendファイルだと何故かうまくいかないのでfbxでエクスポートする。その際カメラやパスやライトがあるとエラーが発生してうまくエクスポート出来ないのですべて消去する。

Unityにインポートするにはhttp://blog.livedoor.jp/nanashisoft/archives/52552622.htmlを参考にしてAseetファルダ以下に適当なファイルを作成し、そこにさっきのテクスチャ元になった画像を先に入れる。同様にして次にfbxファイルをその作成したフォルダにドラッグアンドドロップをすると、テクスチャがオブジェクトにうまく反映されているはず。

両面にテクスチャを反映させるにはEditModeにして左メニューのMeshToolsからDuplicateをクリックして、そのままマウスを動かさずにエンターキーを押す。複製した物だけが選択状態になっているはずなので、さらにそのまま左メニューのNormalsからFlipDirectionをクリック。