用鼠标实现在场景中拖动物体

2015年01月28日 13:56 0 点赞 0 评论 更新于 2025-11-21 15:39

本文将详细介绍如何使用鼠标在场景中拖动物体,简单来说,就是通过鼠标点击操作,将场景中的物体移动到指定位置。下面将分享具体的实现方法,并给出相应的代码。

实现代码

using System.Collections;

public class clickmove : MonoBehaviour {
// Use this for initialization
void Start () {
}

// Update is called once per frame
void Update () {
}

// 下面的函数是当鼠标触碰到碰撞体或者刚体时调用,我的碰撞体设置是 mesh collider,
// 然后别忘了,给这个 collider 添加物理材质
// 值得注意的是世界坐标系转化为屏幕坐标系,Z 轴是不变的
IEnumerator OnMouseDown()
{
// 将物体由世界坐标系转化为屏幕坐标系 ,由 vector3 结构体变量 ScreenSpace 存储,以用来明确屏幕坐标系 Z 轴的位置
Vector3 ScreenSpace = Camera.main.WorldToScreenPoint(transform.position);
// 完成了两个步骤:
// 1. 由于鼠标的坐标系是 2 维的,需要转化成 3 维的世界坐标系;
// 2. 只有在三维的情况下才能来计算鼠标位置与物体的距离,offset 即是距离
Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z));

Debug.Log("down");

// 当鼠标左键按下时
while (Input.GetMouseButton(0))
{
// 得到现在鼠标的 2 维坐标系位置
Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z);
// 将当前鼠标的 2 维位置转化成三维的位置,再加上鼠标的移动量
Vector3 CurPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
// CurPosition 就是物体应该的移动向量,赋给 transform 的 position 属性
transform.position = CurPosition;
// 这个很重要
yield return new WaitForFixedUpdate();
}
}
}

代码解释

  1. 类定义:定义了一个名为 clickmove 的类,继承自 MonoBehaviour,这是 Unity 中用于创建脚本的基类。
  2. Start 方法:这是一个初始化方法,在脚本实例被启用时调用,当前代码中该方法为空。
  3. Update 方法:每帧都会调用该方法,用于处理游戏中的更新逻辑,当前代码中该方法为空。
  4. OnMouseDown 方法:这是一个协程方法,当鼠标按下并触碰到该物体的碰撞体时会被调用。
    • 坐标系转换
    • 使用 Camera.main.WorldToScreenPoint(transform.position) 将物体的世界坐标转换为屏幕坐标,存储在 ScreenSpace 中,以便后续使用。
    • 通过 transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z)) 计算鼠标位置与物体的偏移量 offset
    • 鼠标拖动处理
    • 在鼠标左键按下的状态下(Input.GetMouseButton(0)),不断更新物体的位置。
    • 将当前鼠标的二维屏幕坐标转换为三维世界坐标,并加上之前计算的偏移量 offset,得到物体应该移动到的位置 CurPosition
    • CurPosition 赋值给 transform.position,实现物体的移动。
    • 使用 yield return new WaitForFixedUpdate() 等待固定更新,确保物体的移动与物理模拟同步。

通过以上步骤,就可以实现使用鼠标在场景中拖动物体的功能。