最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
用鼠标实现在场景中拖动物体
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();
}
}
}
代码解释
- 类定义:定义了一个名为
clickmove的类,继承自MonoBehaviour,这是 Unity 中用于创建脚本的基类。 Start方法:这是一个初始化方法,在脚本实例被启用时调用,当前代码中该方法为空。Update方法:每帧都会调用该方法,用于处理游戏中的更新逻辑,当前代码中该方法为空。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()等待固定更新,确保物体的移动与物理模拟同步。
通过以上步骤,就可以实现使用鼠标在场景中拖动物体的功能。