问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

unity3D中实现方块能被鼠标拖动的C#脚本

发布网友 发布时间:2022-04-09 13:01

我来回答

2个回答

热心网友 时间:2022-04-09 14:30

这是目前我看到的最精简的,仅一个事件完成拖拽.

/*
* 用到了unity3d非常好的协同机制实现这一点,OnMouseDown事件表示鼠标已作了射线判断得到了对象。
* 拖拽时保持z轴不变,因为屏幕是xy二维的,空间是三维的。
* */
IEnumerator OnMouseDown ()
{

var camera = Camera.mainCamera;
if (camera) {
//转换对象到当前屏幕位置
Vector3 screenPosition = camera.WorldToScreenPoint (transform.position);

//鼠标屏幕坐标
Vector3 mScreenPosition=new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
//获得鼠标和对象之间的偏移量,拖拽时相机应该保持不动
Vector3 offset = transform.position - camera.ScreenToWorldPoint( mScreenPosition);
print ("drag starting:"+transform.name);

//若鼠标左键一直按着则循环继续
while (Input.GetMouseButton (0)) {

//鼠标屏幕上新位置
mScreenPosition = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);

// 对象新坐标
transform.position=offset + camera.ScreenToWorldPoint (mScreenPosition);

//协同,等待下一帧继续
yield return new WaitForFixedUpdate ();
}

print ("drag compeleted");

}
}

---------------------------分割线

下面是unity自带的,在Scripts资源包里有拖拽代码,这个拖拽物体必须附加Rigidbody刚体组件。
DragRigidbody.js

var spring = 50.0;
var damper = 5.0;
var drag = 10.0;
var angularDrag = 5.0;
var distance = 0.2;
var attachToCenterOfMass = false;

private var springJoint : SpringJoint;

function Update ()
{
// Make sure the user pressed the mouse down
if (!Input.GetMouseButtonDown (0))
return;

var mainCamera = FindCamera();

// We need to actually hit an object
var hit : RaycastHit;
if (!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), hit, 100))
return;
// We need to hit a rigidbody that is not kinematic
if (!hit.rigidbody || hit.rigidbody.isKinematic)
return;

if (!springJoint)
{
var go = new GameObject("Rigidbody dragger");
var body : Rigidbody = go.AddComponent ("Rigidbody") as Rigidbody;
springJoint = go.AddComponent ("SpringJoint");
body.isKinematic = true;
}

springJoint.transform.position = hit.point;
if (attachToCenterOfMass)
{
var anchor = transform.TransformDirection(hit.rigidbody.centerOfMass) + hit.rigidbody.transform.position;
anchor = springJoint.transform.InverseTransformPoint(anchor);
springJoint.anchor = anchor;
}
else
{
springJoint.anchor = Vector3.zero;
}

springJoint.spring = spring;
springJoint.damper = damper;
springJoint.maxDistance = distance;
springJoint.connectedBody = hit.rigidbody;

StartCoroutine ("DragObject", hit.distance);
}

function DragObject (distance : float)
{
var oldDrag = springJoint.connectedBody.drag;
var oldAngularDrag = springJoint.connectedBody.angularDrag;
springJoint.connectedBody.drag = drag;
springJoint.connectedBody.angularDrag = angularDrag;
var mainCamera = FindCamera();
while (Input.GetMouseButton (0))
{
var ray = mainCamera.ScreenPointToRay (Input.mousePosition);
springJoint.transform.position = ray.GetPoint(distance);
yield;
}
if (springJoint.connectedBody)
{
springJoint.connectedBody.drag = oldDrag;
springJoint.connectedBody.angularDrag = oldAngularDrag;
springJoint.connectedBody = null;
}
}

function FindCamera ()
{
if (camera)
return camera;
else
return Camera.main;
}

热心网友 时间:2022-04-09 15:48

呃..以前做过..代码找不到了..
跟你说下思路吧..

鼠标拖动的操作是由三个时间组成的..

鼠标按住 鼠标移动 鼠标松开.

定义一个公用变量.
鼠标按住的时候,..变量为true
松开的时候..变量为false
而鼠标移动的时候,,必须为true才可以使对象移动..
移动时先计算鼠标到父窗口的相对位置,和对象的相对位置...然后得到相差值..之后鼠标移动的时候获取到的鼠标位置加上或者减去这个相对值...就是对象应该在的位置..
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
绩效工资从工资里扣合法吗 无人机电机轴的主要功能有哪些? 闽侯南通多久发展 南通哪个位置最有潜力 南通未来的机遇有哪些 江苏南通的发展前景怎么样 南通这座城市未来发展前景怎样 我女儿阳历08年01月08日出生,{农历07年腊月初一}请高人帮忙改个名字... 我女儿是2012年1月10日10:35分出生的五行缺什么,取什么名字好 这种图片效果怎么做出来的,不是纯白板,仔细看有一个个均匀分布的小圆点... 为什么我电信卡里明明有话费但是却打不了电话开不了流量? 办理了一张电信无限流量卡,怎么没有流量也打不了电话 手机安装的电信卡,为什么打不了电话? 手机同时装了移动卡和电信卡怎么用同时用电信卡和流量卡却不能打电话为什么? 生肉会变酸吗,酸了还能吃吗 肉切片拿酱油有淀粉拌过的肉放冰箱一个晚上酸了还能吃吗? 梦见亲人病危,联想已死的母亲,我放声大哭 在冰箱冷冻室冻了半个月的猪肉,还能吃吗? 前天包的猪肉馅饺子,放在冰箱里。今天煮来吃觉得肉有酸味,是不是变质了,还能不能吃 肉酸了还能吃吗 女25岁,梦见明年就要上十年坟的奶奶,在梦中奶奶是活着的,并且病危,我很伤心,一直在哭,是什么征兆? 肉发酸了还能吃么 梦见母亲病危我哭的很伤心 空手捉野鸡野兔违法吗? 冻鸭肉、鸭胸肉、解冻后放了一下午、闻着有点酸、醋那种酸、是怎么回事、还能食用吗? 抓野兔犯法吗? 冰箱里冻的肉有股酸味还能吃吗 套野兔,野鸡用多粗的铁丝和线,求解? 夹野鸡野兔用多大甲板合适 这两种野鸡野兔夹子哪个更好 季凤文的信仰到底如何? 季凤文牧师现2013年10月在哪个地方 季凤文的人物详解 头戴蓝牙耳机连接电脑后,麦没有声音!怎么办! 富士康面试时会让做的性格测试题 心理测试!不要有关爱情的! 有名的心理测试 请给我几道心理测试,可以测试关于感情问题的,什么样的都可以哦_百度知... 格式工厂转换视频为什么一开始就是转换失败 观世音菩萨真的能救苦救难吗? 女主叫摇光是只火凤凰,男主是天界的战神本体条墨龙的小说 2021年12月7日生的女孩起名姓李? 妖孽狂妃 邪君宠溺小妖妃男主玉邪的身份是什么 为什么叫受苦受难的观世音菩萨 2021年公历5月22日12点55分出生女孩,姓李,起啥名字? 求长篇玄幻小说宠文,完结的,女主角不要太二,谢谢!(如:纨绔仙医邪帝毒爱妃,妖孽狂妃邪君宠溺小妖妃 生产部管理评审报告案例 观世音菩萨为什么能够寻声救苦 妖孽狂妃邪君宠溺小妖妃男主是谁 关于TS/16949生产部的管理评审输入报告要怎么写