功能描述
当玩家移动鼠标时,场景中的物体只能在指定的地面物体上跟随鼠标移动。如果鼠标移动到其他物体或物体自身上,物体不会跟随移动。
实现步骤
添加3D物体:在场景中创建一个3D物体,比如一个球体(Sphere),作为跟随鼠标移动的物体。
创建地面物体:在场景中创建一个平面(Plane),作为指定的地面物体,并为其设置一个Tag(例如Ground
)。
脚本代码:
using UnityEngine;
public class FollowMouse: MonoBehaviour
{
// 移动速度,可以在Inspector面板中调整
public float moveSpeed = 10f;
// 物体与地面的高度差
public float heightOffset = 1f;
// 指定的地面物体的Tag
public string groundTag = "Ground";
void Update()
{
// 获取鼠标在屏幕上的位置
Vector3 mousePosition = Input.mousePosition;
// 将鼠标位置转换为世界坐标
Ray ray = Camera.main.ScreenPointToRay(mousePosition);
RaycastHit hit;
// 如果射线击中某个物体
if (Physics.Raycast(ray, out hit))
{
// 检查击中的物体是否是指定的地面物体
if (hit.collider.CompareTag(groundTag))
{
// 计算目标位置
Vector3 targetPosition = new Vector3(hit.point.x, hit.point.y + heightOffset, hit.point.z);
// 平滑移动物体到目标位置
transform.position = Vector3.Lerp(transform.position, targetPosition, moveSpeed * Time.deltaTime);
}
}
}
}
挂载脚本:将FollowMouse
脚本拖拽到场景中的需要跟随移动的物体上,使其成为需要西东物体的组件。
脚本函数:
-
ScreenPointToRay()
:Unity中的内置函数,用于将屏幕上的点转换为一条射线。 -
Physics.Raycast()
:Unity中的内置函数,用于检测射线是否击中某个物体。 -
CompareTag()
:Unity中的内置函数,用于比较物体的Tag是否与指定的Tag一致。 -
Vector3.Lerp()
:Unity中的内置函数,用于在两个向量之间进行线性插值,实现平滑移动。