1. 程式人生 > >[unity3d]2D遊戲中滑鼠拖動rigidbody2d

[unity3d]2D遊戲中滑鼠拖動rigidbody2d

新買了臺MBP,離開電源線用電腦的感覺真不錯嘿大笑

============================

學生狗玩遊戲開發用unity就相當合適,沒那麼多亂七八糟的東西要考慮,特別是2d遊戲,只是自己學習兼娛樂的話,成本低得半夜能笑醒。。

下面是今天做的一個demo,實現一個滑鼠拖拽rigidbody2d的效果:


(不要吐槽圖片資源,不知道從哪隨便拉來的,finder把所有亂七八糟的圖片都顯示出來了。。。)

網上找的幾個指令碼都沒起作用,分析了一下,自己又寫了一個:

#pragma strict

private var object : Transform;
private var body   : Rigidbody2D;

function Update () {
	if (Input.GetButtonDown("Fire1")) {
		var hit : RaycastHit2D = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, Mathf.Infinity);
		if (hit.collider != null) {
			object = hit.transform;
			body = object.GetComponent(Rigidbody2D);
			body.gravityScale = 0;
			body.drag = 1;
		}
	}
	else if (Input.GetButtonUp("Fire1")) {
		object = null;
		body.gravityScale = 1;
		body.drag = 0;
		body = null;
	}
	if (object) {
		var pos : Vector3 = Camera.main.ScreenToWorldPoint(Input.mousePosition);
		body.AddForce(Vector3(pos.x - object.position.x, pos.y - object.position.y, 0));
	}
}

把它加到camera(或者隨便什麼地方。。。)裡,場景裡所有的rigidbody2d就都可以拖拽了。

=============對苦逼過程沒興趣的到這就可以打住了。。==============

**網上流傳最多的一個版本是用raycast,這個辦法對unity3d新加入的2d元件沒用了。

個人猜測這時unity3d的2d支援尚不完善的時候的辦法了。當時做2d的方式可能是忽略一個軸做2d遊戲,但還是用3d的那一套東西,所以可以用raycast來撞rigidbody,但現在用了rigidbody2d,raycast是撞不到它的。

我這裡的辦法其實是一樣的原理,只是換成了raycast2d。射線發射方向設定成Vector2.zero,只看起點(游標當前指著的)一點有沒有碰撞就可以了。

**還有另一個版本是用onMouseDrag,非常悲劇。。這個也不行,它的要求是要把指令碼新增到有collider或者guiElement的物件上(好像是。。反正用不了,拼錯勿怪。。)才能用。而這裡的collider2d並不是繼承自collider的,所以呵呵了。

我這裡移動的時候沒有直接修改transform,而是用addForce。原因是嘗試直接改transform時發現這樣會導致物理引擎出現很詭異的表現(放手之後降落速度爆高)。。。而且這樣一來即使在拖動中的物體也繼續受物理影響,被牆壁擋住等等。還可以把它“甩”出去,正是我想要的效果。

如果需要改動成跟的非常緊,不需要晃晃悠悠的跟著的話,也許需要在開始拖拽的時候把rigidbody休眠掉或者是別的什麼,應該能解決上面說的情況。