一、实现功能分析
1.完成鼠标点击,物体随之移动位置的响应。
2.完成地图边界的限定。
3.完成物体在移动中自动调转自身朝向的高仿真移动。
二、实现步骤
1.在场景中创建一个panel(当做地图)、创建一个Cube(当做你滴角色)、创建一个空物体用来挂脚本,结构和场景如下图所示:
2、创建一个名字叫“MoveObject”的脚本文件!
初学者看这段话:滴滴滴!在创建脚本文件时,会有一个让你自动取脚本名字的步骤,千万不要忽略了,不要让系统自动创建默认名字的脚本,然后在资源文件夹内去rename改脚本名字,那样的话脚本里面的名字没改,会报错滴!!!
3.把以下代码放进刚刚创建的脚本里面去,全文替代掉。
using UnityEngine;
public class MoveObject : MonoBehaviour
{
public GameObject squareObject; // 正方形物体
public float moveSpeed = 5f; // 移动速度
public float rotationSpeed = 720f; // 旋转速度(度/秒)
public Collider planeCollider; // 平面的碰撞体,用于边界检测
private Vector3 targetPosition; // 目标位置
private bool isMoving = false; // 是否正在移动
void Start()
{
// 初始化目标位置为物体的当前位置
targetPosition = squareObject.transform.position;
}
void Update()
{
// 检测鼠标点击
if (Input.GetMouseButtonDown(0))
{
// 创建一条从摄像机到鼠标点击位置的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
// 检测射线是否与平面碰撞
if (Physics.Raycast(ray, out hit))
{
// 获取碰撞点的平面位置
Vector3 hitPoint = hit.point;
// 计算方块的半径(假设方块是正方形)
float halfSize = squareObject.transform.localScale.x / 2f;
// 获取平面边界
Bounds bounds = planeCollider.bounds;
// 限制目标位置在平面边界内
float clampedX = Mathf.Clamp(hitPoint.x, bounds.min.x + halfSize, bounds.max.x - halfSize);
float clampedZ = Mathf.Clamp(hitPoint.z, bounds.min.z + halfSize, bounds.max.z - halfSize);
// 设置目标位置,保持高度不变
targetPosition = new Vector3(clampedX, squareObject.transform.position.y, clampedZ);
// 开始移动
isMoving = true;
}
}
// 移动物体到目标位置
if (isMoving)
{
// 计算当前位置到目标位置的距离
float step = moveSpeed * Time.deltaTime;
squareObject.transform.position = Vector3.MoveTowards(squareObject.transform.position, targetPosition, step);
// 计算目标方向
Vector3 direction = (targetPosition - squareObject.transform.position).normalized;
// 计算目标旋转
Quaternion targetRotation = Quaternion.LookRotation(direction);
// 旋转物体朝向目标方向
squareObject.transform.rotation = Quaternion.RotateTowards(squareObject.transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
// 检查是否到达目标位置
if (Vector3.Distance(squareObject.transform.position, targetPosition) < 0.001f)
{
// 停止移动
isMoving = false;
}
}
}
}
4.先将脚本挂载到空物体上,然后把方块(Cube)和地图(panel)拖动到脚本的公开变量定义的位置(当然,如果想要更好的封装起来,直接定义私有变量,然后定向找场景中的物体即可),接着调节一个适当的移动速度和转向速度,我这是5和720。
5.运行场景,鼠标点击即可看到结果。
三、代码思路
1.检测鼠标点击:
- 在 Update 方法中,检测鼠标左键点击,并创建一条从摄像机到鼠标点击位置的射线。
2.计算目标位置
- 如果射线与平面碰撞,获取碰撞点的平面位置,并在计算目标位置时进行边界检查,确保方块边缘最大只能到平面边缘。
3. 移动物体:
- 在 Update 方法中,使用 Vector3.MoveTowards 方法将物体移动到目标位置,并检查是否到达目标位置。
4. 旋转物体:
- 在 Update 方法中,计算目标方向和目标旋转,使用 Quaternion.RotateTowards 方法将物体旋转到目标方向,使其在移动过程中逐渐朝向目标位置。