[unity3d]2D游戏中鼠标拖动rigidbody2d

来源:互联网 发布:Dijkstra算法求 编辑:程序博客网 时间:2024/05/12 15:33

新买了台MBP,离开电源线用电脑的感觉真不错嘿大笑

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

学生狗玩游戏开发用unity就相当合适,没那么多乱七八糟的东西要考虑,特别是2d游戏,只是自己学习兼娱乐的话,成本低得半夜能笑醒。。

下面是今天做的一个demo,实现一个鼠标拖拽rigidbody2d的效果:


(不要吐槽图片资源,不知道从哪随便拉来的,finder把所有乱七八糟的图片都显示出来了。。。)

网上找的几个脚本都没起作用,分析了一下,自己又写了一个:

#pragma strictprivate 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休眠掉或者是别的什么,应该能解决上面说的情况。

0 0
原创粉丝点击