游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

首页   >   博客   >   Sunry

Unity3D 拖拉物体效果

个人分类: Unity 学习 | 2018-10-23 20:39
标签:拖拽移动
   今天看到好多人都在纠结 物体拖拉,  然后自己本身今天在做项目的时候也实现了拖拉效果,所以在这里再复习一下!!! 废话不多说 上源码
   首先第一种 通过选择拖拽物体 另外 添加了上一节博客的移动位置 通过V3 实现


 private Transform selectedObjcet; 
//选择的物体 
 private Transform slectedShowPart;
 float zValue; //物体的Z值 
 private Vector3 offset; // 偏移量
  private void DragMove() 
 {
 if (Input.GetMouseButtonDown(0))
 { // 屏幕位置转射线 
 Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
 //用来获取从raycast函数中得到的信息反馈的结构。
 RaycastHit hit;
          int _layerMask = 1 << 9; //此处代表第十层 只选定_layerMask层内的碰撞器,其他层内忽略 _layerMask = ~_layerMask;//取反 代表除了第十层忽略 其他都可以检测到 if (Physics.Raycast(r,out hit,_layerMask))// 光线投射
 {
 // 射线检测到的物体赋值为选择的物体
 selectedObjcet = hit.transform; 
 // 偏移量 等于 射线点的位置 和 选择的物体的三维中心的偏移量 
 offset = hit.point - selectedObjcet.position;
 } 
 //编辑器内绘制一条线 已射线r的起始点 到hit点到的位置为终点 颜色为红色 
 Debug.DrawLine(r.origin, hit.point, Color.red); 
 if (selectedObjcet!=null) 
 { 
 //屏幕空间坐标三维坐标为 世界三维射线的点转为 屏幕空间坐标 
 Vector3 screenPoint = Camera.main.WorldToScreenPoint(hit.point);
 zValue = screenPoint.z; //Z值使用目标物体的屏幕空间坐标 
 } 
 } 
 if (Input.GetMouseButton(0))
 {
 if (selectedObjcet == null) 
 { 
 return; 
 } 
 else if (selectedObjcet != null) 
 { //屏幕空间坐标为鼠标位置
 Vector3 screenPoint = Input.mousePosition;
 //屏幕空间坐标的Z值等于选中目标物体的屏幕空间坐标的Z值;
 screenPoint.z = zValue;
 //屏幕空间坐标转换为 世界空间坐标 
 Vector3 worldPoint = Camera.main.ScreenToWorldPoint(screenPoint); 
 //选中物体的位置等于世界空间坐标 减去偏移量的位置 
 selectedObjcet.position = worldPoint - offset; 

 ////if (Vector3.Distance(selectedObjcet.position,slectedShowPart.position)<1)//返回a和b之间的距离 
 //// { /// 选中的物体如果距离显示的物体距离小于1,则重合 适合于背包系统 
 //// selectedObjcet.position = slectedShowPart.position; //// } } }


 if (Input.GetMouseButtonUp(0)) 
 {
 // 对于选中物体的释放 方便下一次选中物体 selectedObjcet = null; 
 }
 }


下面是上一节博客
关于物体的一些简单移动方法的补充


[code]csharpcode:

///对于上一篇博客的一点点补充 当控制移动的时候还可以通过Vector3来改变位置.. ///当前的地点移向目标。确保我们的速度不会超过maxDistanceDelta(0.5f) // tansform.position = Vector3.MoveTowards(parts[i].position, partPositions[i].position, 0.5f);
第二种方式 是需要将脚本拖到需要进行拖拽的物体 可在移动端和PC端进行操作 , 另注明 该脚本是通过看一位大佬的代码所实现 !!! 供大家思考

private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标 
private Vector3 _vec3TargetWorldSpace;// 目标物体的世界空间坐标 
private Transform _trans;// 目标物体的空间变换组件
private Vector3 _vec3MouseScreenSpace;// 鼠标的屏幕空间坐标
 private Vector3 _vec3Offset;// 偏移

 void Awake()
 {
 _trans = transform; 
}
 IEnumerator OnMouseDown()
 {
 // 把目标物体的世界空间坐标转换到它自身的屏幕空间坐标 
 _vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);
 // 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标) 
 _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
 // 计算目标物体与鼠标物体在世界空间中的偏移量 
 _vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);
 // 鼠标左键按下 
 while (Input.GetMouseButton(0)) 
 {
 // 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标) 
 _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
 // 把鼠标的屏幕空间坐标转换到世界空间坐标(Z值使用目标物体的屏幕空间坐标),加上偏移量,以此作为目标物体的世界空间坐标 _vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset; 
 // 更新目标物体的世界空间坐标 
 _trans.position = _vec3TargetWorldSpace;
 // 等待固定更新 
 yield return new WaitForFixedUpdate();
 }
 }


0 0

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号

个人分类

标签

阅读排行

评论排行

推荐博客

最新博客

关闭

站长推荐 上一条 /1 下一条

返回顶部