強火で進め

このブログではプログラム関連の記事を中心に書いてます。

マウスでオブジェクトをドラッグする

HierarchyにSphere(球)を作成して以下のプログラムをに貼り付けるとドラッグが可能になります。

【DragTransform.js】

var mouseOverColor = Color.blue;
private var originalColor : Color;
private var nowMouseDown : boolean = false;
function Start () {
	// オリジナルの色を保存
	originalColor = renderer.sharedMaterial.color;
}
function OnMouseEnter () {
	// マウスカーソルが乗った時に色を変更
	renderer.material.color = mouseOverColor;
}

function OnMouseExit () {
	if (!nowMouseDown) {
		// マウスカーソルが外れた時にオリジナルの色に戻す
		renderer.material.color = originalColor;
	}
}

function OnMouseDown () {
	// 球の位置をメインカメラから見た時のスクリーン空間の座標に変換して取得
	var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
	// 球の中心位置からカーソル位置の差(offset)を取得
	var offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
	
	// マウスの左ボタンが押されてる間はカーソル位置に球の位置を追随させる
	while (Input.GetMouseButton(0))
	{
		nowMouseDown = true;
		// 現在のマウスカーソルの位置+offsetの位置で更新する。これによりカーソル位置に球が追随する
		var curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
		var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
		transform.position = curPosition;
		yield;
	}
	nowMouseDown = false;
}

参考にしたサンプル

UNITY: Procedural Examples
http://unity3d.com/support/resources/example-projects/procedural-examples.html