Unity实现鼠标拖动3D物体

这篇博客实现一个小功能,通过鼠标拖动3D物体。我们知道,如果是拖动 UIUG 的控件的话,它是有接口可以使用的。但是3D物体就没有可直接使用的接口(或者说我没找到?),就需要我们自己写代码。既然如此,那我们就来实现以下这个功能。

首先先创建一个这样的场景

创建两个 cube 只是为了看清效果。然后给 摄像机添加一个 DragObject 脚本

using UnityEngine;
using System.Collections;

public class DragObject : MonoBehaviour {
  /// <summary>
  /// 将要拖动的物体
  /// </summary>
  private Transform dragGameObject;
  /// <summary>
  /// 获取射线需要碰撞的层
  /// </summary>
  private LayerMask canDrag;
  /// <summary>
  /// 直接从外部定义好层,简单理解
  /// </summary>
  public LayerMask canDrag2;
  /// <summary>
  /// 获得鼠标的位置和cube位置差
  /// </summary>
  private Vector3 offset;
  /// <summary>
  /// 是否点击到cube
  /// </summary>
  private bool isClickCube;
  /// <summary>
  /// 目标对象的屏幕坐标
  /// </summary>
  private Vector3 targetScreenPoint;

  // Use this for initialization
  void Start () {
    // LayerMask.GetMask("Cube"); 得到 名字为 Cube 的层的 2 进制
    // LayerMask.LayerToName(9); 得到一个 10 进制表示的层 的名字 这里既第十层
    // LayerMask.NameToLayer("Cube"); 得到 名字为 Cube 的层的 10 进制

    //使用位运算,因为 LayerMask (好像)是以2进制存储的 Layer 的层是以0开始
    canDrag = 1 << LayerMask.NameToLayer("Cube");
  }

  // Update is called once per frame
  void Update () {
    if (Input.GetMouseButtonDown(0))
    {
      if (CheckGameObject())
      {
        offset = dragGameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPoint.z));
      }
    }

    if (isClickCube)
    {
      //当前鼠标所在的屏幕坐标
      Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPoint.z);
      //把当前鼠标的屏幕坐标转换成世界坐标
      Vector3 curWorldPoint = Camera.main.ScreenToWorldPoint(curScreenPoint);
      dragGameObject.position = curWorldPoint + offset;
    }

    if (Input.GetMouseButtonUp(0))
    {
      isClickCube = false;
    }
  }

  /// <summary>
  /// 检查是否点击到cbue
  /// </summary>
  /// <returns></returns>
  bool CheckGameObject ()
  {
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hitInfo;
    if (Physics.Raycast(ray, out hitInfo, 100f, canDrag))
    {
      isClickCube = true;
      //得到射线碰撞到的物体
      dragGameObject = hitInfo.collider.gameObject.transform;
      targetScreenPoint = Camera.main.WorldToScreenPoint(dragGameObject.position);
      return true;
    }
    return false;
  }

}

添加此脚本后运行,就能成功看见效果。
今天这个工程比较简单,就不发工程了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity实现鼠标点2D转3D进行旋转

    本文实例为大家分享了Unity实现鼠标点2D转3D进行旋转的具体代码,供大家参考,具体内容如下 代码如下: using UnityEngine; public class GunFollowMouse : MonoBehaviour { public RectTransform UGUICanvas; public Camera mainCamera; //摄像机旋转的缓动速率 private float rotateSpeed = 5; void Start () { } void Updat

  • unity 鼠标悬停事件操作

    笔者在网上发现了,很多种方法 ,当然咱们找最好用的,也简单的 下面废话不多说直接上代码 我在啰嗦几句 第一这个脚本挂在需要相应的游戏体上 第二被挂游戏体必须带有collider, 第三仅仅制作完上面的两步 本应该没有问题, 笔者又发现一个问题 就是只有鼠标在物体的右上方才会很灵敏的相应到 在在左下方反而没什么反应 ,为此笔者在脚本上加上了一句 this.GetComponent<BoxCollider> ().size = new Vector3 (1.5f, 1.5f, 1.5f); 原来物

  • unity 如何判断鼠标是否在哪个UI上(两种方法)

    第一种 可以得到UI,再根据名字判断是不是自己自己要点击的UI 其中参数canvas拖入此UI的canvas /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { Poin

  • unity实现鼠标经过时ui及物体的变色操作

    1.实现UI的变色 设置Highlighted Color为鼠标经过时变的颜色(Normal为常态,Pressed为按下时的颜色,Disabled为禁止的颜色) 2.通过代码实现物体的颜色改变 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Cube_change : MonoBehaviour { private Color CubeColor; privat

  • unity实现鼠标跟随(ITween)

    本文实例为大家分享了unity实现鼠标跟随的具体代码,供大家参考,具体内容如下 需求:当鼠标放到cube上,然后移开鼠标cube会跟随鼠标移动. 实现过程: 首先在场景里新建一个plane(白色)和cube(黑色) ,这个cube就是用来跟随鼠标的物体,并且给cube添加标签tile. 然后把下面移动代码拖到相机上. 代码如下: using UnityEngine; using System.Collections; //鼠标跟随 public class linearmove : MonoBe

  • unity 鼠标移入弹出UI的操作

    外部调用 show 和Hide方法 using DG.Tweening; using UnityEngine; using UnityEngine.UI; public class ShowInfo : MonoBehaviour { private bool _isshowing = false; public Canvas Canvas; // Use this for initialization void Start() { Hide(); } // Update is called o

  • Unity 实现鼠标滑过UI时触发动画的操作

    在有些需求中会遇到,当鼠标滑过某个UI物体上方时,为了提醒用户该物体是可以交互时,我们需要添加一个动效和提示音.这样可以提高产品的体验感. 解决方案 1.给需要有动画的物体制作相应的Animation动画.(相同动效可以使用同一动画复用) 2.给需要有动画的物体添加脚本.脚本如下: using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngi

  • Unity实现移动物体到鼠标点击位置

    本文实例为大家分享了Unity实现移动物体到鼠标点击位置的具体代码,供大家参考,具体内容如下 目的: 移动物体到鼠标点击处屏幕所对应的空间位置,并使物体正对着点击的对象,不能倾斜. 首先,需要获取点击屏幕所对应的空间位置,这可以通过先获取屏幕坐标,然后转成空间坐标:也可以通过射线直接获取到空间位置. 其次 ,移动物体到目的地,可直接通过差值进行移动,使物体看向目标点,不能直接使用LookAt(),因为,该函数是使物体的前方面向目标点(即物体的forward指向 由物体到目标点的向量,这可能使物体

  • Unity实现鼠标拖动3D物体

    这篇博客实现一个小功能,通过鼠标拖动3D物体.我们知道,如果是拖动 UIUG 的控件的话,它是有接口可以使用的.但是3D物体就没有可直接使用的接口(或者说我没找到?),就需要我们自己写代码.既然如此,那我们就来实现以下这个功能. 首先先创建一个这样的场景 创建两个 cube 只是为了看清效果.然后给 摄像机添加一个 DragObject 脚本 using UnityEngine; using System.Collections; public class DragObject : MonoBe

  • unity实现鼠标拖住3D物体

    本文实例为大家分享了unity实现鼠标拖住3D物体的具体代码,供大家参考,具体内容如下 把该脚本直接挂在要拖拽的物体上即可 using System.Collections; using System.Collections.Generic; using UnityEngine; public class ModelDrages : MonoBehaviour { //发射射线的摄像机 private Camera cam; //射线碰撞的物体 private GameObject go; //

  • 基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转

    通过原生JS,点击事件,鼠标按下.鼠标抬起和鼠标移动事件,实现3d立方体的拖动旋转,并将旋转角度实时的反应至界面上显示. 实现原理:通过获取鼠标点击屏幕时的坐标和鼠标移动时的坐标,来获得鼠标在X轴.Y轴移动的距离,将距离实时赋值给transform属性 从而通过改变transform:rotate属性值来达到3d立方体旋转的效果 HTML代码块: <body> <input type="button" class="open" value=&quo

  • Unity使用鼠标旋转物体效果

    本文实例为大家分享了Unity使用鼠标旋转物体效果的具体代码,供大家参考,具体内容如下 了解完基础知识后,然我们来做个小程序练习一下 1.在Main Camera下新建一个Cube 然后调整一下Cube的位置,把他放置在相机前方 2.给Cube挂载脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeControlScript : MonoBehavio

  • unity实现UI元素跟随3D物体

    本文实例为大家分享了unity实现UI元素跟随3D物体的具体代码,供大家参考,具体内容如下 在Canvas不同的渲染模式(RenderMode)下实现UI跟随3D物体 当Canvas.RenderMode为Screen Space-Overlay时 利用WorldToScreenPoint(worldPos)将物体的世界坐标转换成屏幕坐标,实时更新UI的坐标: using UnityEngine; using System.Collections; public class FollowWorl

  • Angular4实现鼠标悬停3d倾斜效果

    Angular 是什么 Angular 是由谷歌开发与维护一个开发跨平台应用程序的框架,同时适用于手机与桌面. Angular 有什么特点 基于 Angular 我们可以构建适用于所有平台的应用.比如:Web 应用.移动 Web 应用.移动应用和桌面应用等. 通过 Web Worker和服务端渲染 (SSR),达到在如今Web平台上所能达到的最高渲染速度. Angular 让你能够有效掌控可伸缩性.基于 RxJS.Immutable.js 和其它推送模型,能适应海量数据需求. Angular 提

  • jquery实现的鼠标拖动排序Li或Table

    1.前端页面 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="拖动排序Li或Table.aspx.cs" Inherits="拖动排序Li或Table" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http

随机推荐