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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值