当前位置: 首页 > news >正文

Unity小功能实现:鼠标点击移动物体

1、功能描述

    当玩家点击鼠标时,场景中的物体会移动到鼠标点击的位置。这个功能可以用于控制角色移动、放置物体等场景。

2、实现步骤

    创建Unity项目:首先,打开Unity并创建一个新的3D项目。

    添加3D物体:在场景中创建一个3D物体,比如一个球体(Sphere)。

    创建脚本:在Assets文件夹中创建一个新的C#脚本,命名为ClickToMove。

    编写代码:打开ClickToMove脚本,编写以下代码:

using UnityEngine;

public class ClickToMove : MonoBehaviour
{
    // 移动速度,可以在Inspector面板中调整
    public float moveSpeed = 10f;

    // 目标位置
    private Vector3 targetPosition;

    // 是否正在移动
    private bool isMoving = false;

    void Update()
    {
        // 检测鼠标左键点击
        if (Input.GetMouseButtonDown(0))
        {
            // 获取鼠标点击的位置
            SetTargetPosition();
        }

        // 如果正在移动,向目标位置移动
        if (isMoving)
        {
            Move();
        }
    }

    void SetTargetPosition()
    {
        // 从鼠标点击的位置发射一条射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        // 如果射线击中某个物体
        if (Physics.Raycast(ray, out hit))
        {
            // 设置目标位置为击中点的位置
            targetPosition = hit.point;
            isMoving = true;
        }
    }

    void Move()
    {
        // 计算移动方向
        Vector3 direction = targetPosition - transform.position;

        // 如果物体还没有到达目标位置
        if (direction.magnitude > 0.1f)
        {
            // 移动物体
            transform.Translate(direction.normalized * moveSpeed * Time.deltaTime);
        }
        else
        {
            // 到达目标位置,停止移动
            isMoving = false;
        }
    }
}

挂载脚本:将ClickToMove脚本拖拽到场景中的球体上,使其成为球体的组件。

添加地面:在场景中创建一个平面(Plane)作为地面,确保鼠标点击时可以检测到地面的碰撞。

3、代码解释
  • moveSpeed:公共变量,用于控制物体移动的速度。你可以在Unity的Inspector面板中直接调整这个值。

  • targetPosition:私有变量,用于存储鼠标点击的目标位置。

  • isMoving:布尔变量,用于判断物体是否正在移动。

  • SetTargetPosition():这个方法通过射线检测获取鼠标点击的位置,并设置为目标位置。

  • Move():这个方法用于移动物体到目标位置。使用transform.Translate()方法来实现物体的移动。

  • Physics.Raycast():这是Unity中的一个内置函数,用于检测射线是否击中某个物体。

    通过这个简单的功能,可以轻松实现Unity中物体的鼠标点击移动。

相关文章:

  • 5G学习笔记之BWP
  • 用DeepSeeker + AI app工具自动生成 APP代码
  • 【深度学习】输入长度大于训练时输入长度会发生什么?LSTM 和 Transformer对比。
  • 深入浅出 Go 语言:协程(Goroutine)详解
  • Flutter - 布局Widget
  • Java的流表达式使用
  • ClickHouse深度解析:OLAP领域的性能怪兽
  • 爬虫系列之【数据解析之JSON】《三》
  • leetcode日记(74)合并两个有序数组
  • 蓝耘元生代智算云:解锁百亿级产业变革的算力密码
  • 【STM32安全性研究】STM32F103RCT6固件读取
  • 计算机毕业设计SpringBoot+Vue.js常规应急物资管理系统(源码+文档+PPT+讲解)
  • c++中explicit的作用
  • UI组件库及antd
  • Java 泛型(Generics)详解与使用
  • python多线程之ThreadLocal 笔记
  • 编程题 - 明明的随机数【JavaScript/Node.js解法】
  • 【知识】torchrun 与 torch.multiprocessing.spawn 的对比
  • python爬虫系列课程5:JavaScript语法介绍
  • 【Java】多线程篇 —— 线程池
  • 人民日报和音:相信中国就是相信明天
  • 广药集团原董事长李楚源被“双开”:去年8月被查,曾多次发表争议言论
  • 出走的苏敏阿姨一路走到了戛纳,这块红毯因她而多元
  • 下辖各区密集“联手”,南京在下一盘什么样的棋?
  • 湖南4个县市区被确定为野生蘑菇中毒高风险区:中毒尚无特效解毒药
  • 全国林业院校校长论坛举行,聚焦林业教育的创新与突破