Unity让你的对象如何丝滑移动起来?

一、实现功能分析

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 方法将物体旋转到目标方向,使其在移动过程中逐渐朝向目标位置。

四、需要注意的地方

1.最简单的脚本挂载 、相关字段拖拽。
2.确保平面对象有一个 Collider 组件(例如 BoxCollider),以便射线检测到平面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值