unity3d 拖動物體代碼

2015年03月14日 13:12 0 点赞 0 评论 更新于 2025-11-21 17:04

在 Unity3D 中,实现物体拖动功能并在鼠标悬停时改变物体颜色是一个常见的需求。下面为你详细介绍实现该功能的代码及原理。

代码实现

// 定义鼠标悬停时物体的颜色
var mouseOverColor = Color.blue;
// 定义物体的原始颜色
private var originalColor : Color;

// 该函数在脚本实例被加载时调用
function Start () {
// 保存物体材质的原始颜色
originalColor = renderer.sharedMaterial.color;
}

// 当鼠标进入物体的碰撞体时调用
function OnMouseEnter () {
// 将物体材质的颜色设置为鼠标悬停颜色
renderer.material.color = mouseOverColor;
}

// 当鼠标离开物体的碰撞体时调用
function OnMouseExit () {
// 将物体材质的颜色恢复为原始颜色
renderer.material.color = originalColor;
}

// 当鼠标按下物体时调用
function OnMouseDown () {
// 将物体的世界坐标转换为屏幕坐标
var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
// 计算鼠标点击位置与物体实际位置的偏移量
var offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));

// 当鼠标左键持续按下时
while (Input.GetMouseButton(0)) {
// 获取当前鼠标的屏幕坐标
var curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
// 将当前鼠标的屏幕坐标转换为世界坐标,并加上之前计算的偏移量
var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
// 将物体的位置设置为当前计算得到的位置
transform.position = curPosition;
// 暂停当前协程,等待下一帧继续执行
yield;
}
}

代码解释

变量定义

  • mouseOverColor:存储鼠标悬停时物体的颜色,这里设置为蓝色。
  • originalColor:用于保存物体材质的原始颜色,在鼠标离开物体时将颜色恢复。

Start 函数

在脚本实例被加载时调用,将物体材质的原始颜色保存到 originalColor 变量中。

OnMouseEnter 函数

当鼠标进入物体的碰撞体时,将物体材质的颜色设置为 mouseOverColor

OnMouseExit 函数

当鼠标离开物体的碰撞体时,将物体材质的颜色恢复为 originalColor

OnMouseDown 函数

当鼠标按下物体时,执行以下操作:

  1. 将物体的世界坐标转换为屏幕坐标,存储在 screenSpace 中。
  2. 计算鼠标点击位置与物体实际位置的偏移量,存储在 offset 中。
  3. 使用 while 循环,当鼠标左键持续按下时,不断更新物体的位置。
    • 获取当前鼠标的屏幕坐标,存储在 curScreenSpace 中。
    • 将当前鼠标的屏幕坐标转换为世界坐标,并加上之前计算的偏移量,得到物体的新位置 curPosition
    • 将物体的位置设置为 curPosition
    • 使用 yield 暂停当前协程,等待下一帧继续执行。

通过以上代码,你可以在 Unity3D 中实现物体的拖动功能,并在鼠标悬停时改变物体的颜色。

作者信息

boke

boke

共发布了 3994 篇文章