[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休眠掉或者是別的什麼,應該能解決上面說的情況。