Unity鼠标拖拽物体

本文介绍如何在Unity中实现使用鼠标拖拽场景内的Cube对象,并解释了相关的鼠标事件处理函数,包括按下、拖拽、释放等操作。通过简单的代码示例,展示了如何将屏幕坐标转换为世界坐标,从而实现精准的拖拽效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<pre name="code" class="csharp">using UnityEngine;
using System;
using System.Collections;


// 创建一个Cube 将该代码拖拽给Cube然后运行,点击Cube然后拖拽Cube,
//Cube会被鼠标拖拽移动
// 注意 : 创建的 Cube 默认带有一个 Box Collider 碰撞盒, 
//如果拖拽对象上没有 碰撞盒, 则不能被检测到拖拽 
public class Test : MonoBehaviour
{
    Transform myTransform;
    Vector3 selfScenePosition;

    void Start()
    {
        myTransform = transform;
        //将自身坐标转换为屏幕坐标
        selfScenePosition = Camera.main.WorldToScreenPoint(myTransform.position); 
        print("scenePosition   :  " + selfScenePosition);
    }

    void OnMouseDrag() //鼠标拖拽时系统自动调用该方法
    {
        //获取拖拽点鼠标坐标
        print(Input.mousePosition.x + "     y  " + Input.mousePosition.y + "     z  " + Input.mousePosition.z);
        //新的屏幕点坐标
        Vector3 currentScenePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, selfScenePosition.z);
        //将屏幕坐标转换为世界坐标
        Vector3 crrrentWorldPosition = Camera.main.ScreenToWorldPoint(currentScenePosition); 
        //设置对象位置为鼠标的世界位置
        myTransform.position = crrrentWorldPosition;
    }

    void OnMouseDrag()
    {
        print("鼠标拖动该模型区域时");
    }

    void OnMouseDown()
    {
        print("鼠标按下时");
    }

    void OnMouseUp()
    {
        print("鼠标抬起时");
    }

    void OnMouseEnter()
    {
        print("鼠标进入该对象区域时");
    }

    void OnMouseExit()
    {
        print("鼠标离开该模型区域时");
    }
}




                
### Unity 中实现鼠标拖拽物体Unity 中通过 UGUI 和事件系统可以方便地实现物品的拖拽功能。为了完成这一目标,需要创建一个脚本来处理拖拽逻辑并实现特定接口。 #### 接口实现 对于拖拽操作而言,主要涉及到三个重要阶段:开始拖拽、正在进行中的拖拽以及结束拖拽。因此,在编写用于控制对象拖拽行为的 C# 脚本时,应当让其继承 `MonoBehaviour` 类的同时也去实现 `IDragHandler`, `IBeginDragHandler` 及 `IEndDragHandler` 这几个来自 UnityEngine.EventSystems 命名空间下的接口[^1]。 ```csharp using UnityEngine; using UnityEngine.EventSystems; public class ItemDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { private RectTransform rectTransform; void Start() { rectTransform = GetComponent<RectTransform>(); } public void OnBeginDrag(PointerEventData eventData) { // 开始拖拽时的操作 Debug.Log("Start Dragging"); } public void OnDrag(PointerEventData eventData) { // 正在拖拽期间执行的动作 rectTransform.anchoredPosition += eventData.delta / Canvas.scaleFactor; } public void OnEndDrag(PointerEventData eventData) { // 结束拖拽后的清理工作或其他动作 Debug.Log("Stop Dragging"); } } ``` 此段代码展示了如何利用上述提到的接口方法来响应不同状态下的用户交互,并且还包含了实际移动 UI 元素位置的具体做法——即根据鼠标的位移调整被选中组件的位置属性。 另外一种情况是当希望直接操控场景内的三维模型而非仅限于二维界面元素时,则可借鉴另一种方式来进行旋转或平移变换。例如下面这段用来基于鼠标输入改变游戏对象姿态的小片段: ```csharp void Update () { if (Input.GetMouseButton(0)) { float rotationX = Input.GetAxis("Mouse X") * speed; float rotationY = Input.GetAxis("Mouse Y") * speed; transform.Rotate(Vector3.up, -rotationX); transform.Rotate(Vector3.right, rotationY); } } ``` 这里采用的是监听持续按住左键的状态下获取水平方向 (`Mouse X`) 与垂直方向(`Mouse Y`) 的增量值作为绕指定轴线转动的角度参数[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值