Unity3D Study vol.4 Collision

2010.01.20 | unity3d

引き続きUnity3Dです。
Unity for Flash Developers – Tutorial 5
Unity for Flash Developers – Tutorial 6 (Basic Physics)
Unity for Flash Developers – Tutorial 7 (Basic Collision Detection)
この動画を一通りみてつくってみます。

左上の”Create Cube”でシーン上にオブジェクトを追加され、それぞれのオブジェクトが衝突判定を持っています。他のCubeと接触しているものは赤になります。
※Dragしたときの床面とCubeとのあたり判定の処理がまずいので、よい方法を調べないといけません。

以前の scene1.unity を改変し、新しく scene2.unity をつくっています。
改変内容についていくつか注意点などを。
Unity3Dでインスタンスを作成する場合は、
var vec:Vector3 = Vector3(0,0,0);
のように記述することも、’new’をつけて、
var vec:Vector3 = new Vector3(0,0,0);
と記述することもできます。今回はFlashっぽくするためにnewをつけて記述しています。
ひょっとすると最適化などで、newの有無で処理速度の差などがあるかもしれませんので要検証です。
また、Unityでは基本的には関数は最初の一文字が大文字となっています。
(ただこれは自作の関数の場合は、小文字にしてもビルドされるようです。)

その他の基本的な書き方などについては、英語ですがScripting Overviewをみるのが良いです。
特に、Accessing Other ComponentsAccessing Other Game ObjectsはかなりFashと違いUnity独自なところなので注意が必要です。

Debug用の関数でDebug.LogやDebug.DrawRayなどがあります。
Debug.Logはflashでのtraceと同じく、コンソールにメッセージを表示します。
左下にメッセージが表示されていて、クリックでConsoleウィンドウが開きます。
Debug.DrawRayはstartとdirectionを指定して、Gameビューにラインを表示します。
Gameビュー右上の”Gizmos”がオンの場合にのみ表示され、ビルドしたときには表示されません。
その他にもデバッグ用に関数があるので、状況に応じて使用してください。

GUIを作成する場合には、OnGUIを使用します。ボタンの位置はRect(posX,posY,width,height)で指定します。
今回使用していませんが、GUITextといって画面上にtextを表示できるのですが、これをスクリプトで動的に生成する方法が今ひとつ分かりません。メニューからつくる場合は、[GameObject]->[Create Other]->[GUIText]で作成します。

MainApp.js

#pragma strict
/**
* Gui作成
* Main_emptyに指定
* 
* OnGUIは毎回よばれています
*/

public var obj:GameObject;
private var btnRect:Rect = Rect(10,10,90,20);//privateを指定した場合はInspectorには表示されない

function OnGUI () {
	if (GUI.Button(btnRect, "Create Cube")) {
		//クリックされた時に処理を行う
		var pos:Vector3 = new Vector3(Random.Range(-10,10) * 0.1, 6, Random.Range(-10,10) * 0.1);
		var newObj:GameObject = Instantiate( obj, pos, Quaternion.identity);
	}
}

CubeScript.js

#pragma strict
/**
* CubePrefabに指定
*/

private var screenSpace:Vector3;
private var offset:Vector3;

private var curScreenSpace:Vector3;
private var preScreenSpace:Vector3;

function OnMouseDown(){
	Debug.Log('OnMouseUp');
	
	screenSpace = Camera.main.WorldToScreenPoint(transform.position);
	offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
	
}

function OnMouseDrag () {
	curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
	var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
	transform.position = curPosition;
    
	preScreenSpace = curScreenSpace;
} 

function OnMouseUp(){
	Debug.Log('OnMouseUp');
	curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);   
	
	var vec:Vector3 = preScreenSpace - curScreenSpace;
	//vec.Normalize();
	this.rigidbody.AddForce(-vec * 10);
}

/**
* 衝突時
*  <a href="http://unity3d.com/support/documentation/ScriptReference/MonoBehaviour.OnCollisionEnter.html" target="_blank" class="advmk">http://unity3d.com/support/doc......Enter.html</a>
* */
function OnCollisionEnter(collision:Collision){
	Debug.Log(&quot;OnCollisionEnter&quot;);
	for (var contact:ContactPoint in collision.contacts) {
		/*
		if(collision.gameObject.name != &quot;Plane&quot;){
			collision.gameObject.rigidbody.AddForce(Vector3(0,1,0)*100);
		}
		*/
        Debug.DrawRay(contact.point, contact.normal, Color.red);
    }
}

function OnCollisionExit(collision:Collision){
	if(collision.gameObject.name != &quot;Plane&quot;){
		collision.gameObject.renderer.material.color = Color.white;
	}
}

function OnCollisionStay(collision:Collision){
	
	for (var contact:ContactPoint in collision.contacts) {
        Debug.DrawRay(contact.point, contact.normal, Color.white);
    }
	if(collision.gameObject.name != &quot;Plane&quot;){
		collision.gameObject.renderer.material.color = Color.red;
	}
}

collision source code

MouseDragのときのスクリプトをもっと上手く書きたいところ。

comment

Please Leave a Reply

TrackBack URL :

pagetop