Unity3D游戏-鼠标点击使角色移动避开障碍物

 更新时间:2025年08月16日 09:58:18   作者:谷宇  
在Unity的世界里,当你轻点鼠标,角色仿佛被赋予了新的使命,沿着一条无形的轨迹,向着地图上的目标点进发,每一次移动,不仅是简单的位移,更是对未知的探索,这种交互,让玩家与游戏世界紧密相连,仿佛自己就是那个掌控命运的魔法师,用指尖绘制出角色的冒险之路......

在Unity的世界里,当你轻点鼠标,角色仿佛被赋予了新的使命,沿着一条无形的轨迹,向着地图上的目标点进发。每一次移动,不仅是简单的位移,更是对未知的探索。这种交互,让玩家与游戏世界紧密相连,仿佛自己就是那个掌控命运的魔法师,用指尖绘制出角色的冒险之路......

安装导航网格

1.打开package Manager包管理器,找到并选择Unity Registry。

2.在搜索框里输入“AI”,找到AI Navigation,然后点一下“安装”按钮。(像我这里,因为之前已经装过了,所以没有显示“安装”按钮。如果你是第一次装,就会看到一个“安装”按钮,点一下就能装上了)

为角色和地图设置和烘培导航网格

1.我们首先需要为角色添加一个导航组件,选中角色对象,然后在其上添加一个Nav Mesh Agent组件。

2.设置角色的碰撞框(角色身上绿色的圆柱型框框),让其尽量去贴近我们的角色。

3.接着我们为地形添加导航网格。选中地形Terrain,然后点击Add Component,添加Nav Mesh Surface组件。

4.设置Default Area的属性为Walkable(可行走的)。

5.点击“Bake”烘培。

6.(可选)如果需要额外添加“不可行走的”障碍物。选中该障碍物对象,点击Add Component,为其添加一个NavMeshModifier的组件。

7.(可选)勾选上Override Area,选择Not Walkable(不可行走的)。

8.(可选)重新烘培地形。

编写移动功能的脚本

1.在Assets文件夹下创建一个空文件夹,可命名为Scripts(名称可自定),用于存放脚本。接着,在Scripts文件夹中创建C#脚本。

2.实现鼠标点击的移动功能

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class PlayerController : MonoBehaviour
{
//获取到导航网格的代理
private NavMeshAgent agent;
//动画器
private Animator anime;
//声明射线检测结果的变量
RaycastHit hitByScreen;
void Start()
{
agent = transform.GetComponent();
anime = transform.GetComponent();
hitByScreen = new RaycastHit();
}

void Update()
{
//当鼠标左键按下时触发。0代表左键,1代表右键
if (Input.GetMouseButtonDown(0))
{
//创建一条从鼠标在屏幕上的位置射出到接触到场景物体的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//判断射线是否碰到场景的物体
if (Physics.Raycast(ray, out hitByScreen))
{
//判断射线碰撞到的是否为障碍物(这里的6就是我们的图层编号,第6是障碍物图层)
if (hitByScreen.collider.gameObject.layer == 6)
{
//获取到碰撞到的障碍物的位置,然后把位置加上大小,就可以获取到障碍物边缘的坐标点(也就是障碍物前面的地面上的点)
hitByScreen.point = hitByScreen.collider.gameObject.transform.position + hitByScreen.collider.gameObject.transform.localScale;
//把这个点设置为目的地,角色就会在障碍物前面停下
agent.SetDestination(hitByScreen.point);
}
else
{
//把射线碰到物体的点设置为目的地点,并且角色会向目的地移动
agent.SetDestination(hitByScreen.point);
}
//角色开启跑步动画
anime.SetBool("Run", true);
}
}

//如果角色到达指定地点就停止跑步动画
if (hitByScreen.point != null && transform.position.x == hitByScreen.point.x && transform.position.z == hitByScreen.point.z) {
//角色停止跑步动画
anime.SetBool("Run", false);
}
}
}

测试和运行

经过对案例的运行测试,成功实现在“无障碍物”地图上点击鼠标左键,角色朝鼠标位置移动。在“有障碍物”地图上点击障碍物,角色成功移动到障碍物前停下,并且停止跑步动画。

到此这篇关于Unity3D游戏-鼠标点击使角色移动避开障碍物的文章就介绍到这了,更多相关Unity3D游戏-鼠标使角色移动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#基于Linq和反射实现数据持久化框架Xml4DB详解

    C#基于Linq和反射实现数据持久化框架Xml4DB详解

    在本篇文章里小编给大家整理的是关于C#基于Linq和反射实现数据持久化框架Xml4DB相关知识点,有需要的朋友们学习下。
    2019-08-08
  • 使用C#实现数据自动化写入Excel文件

    使用C#实现数据自动化写入Excel文件

    在现代数据驱动的世界中,Excel文件作为一种通用的数据存储和交换格式,在企业运营和日常工作中扮演着举足轻重的作用,本文将深入探讨如何利用C#实现数据的程序化写入Excel文件,需要的可以了解下
    2025-11-11
  • C#中结构体和字节数组转换实现

    C#中结构体和字节数组转换实现

    这篇文章主要介绍了C#中结构体和字节数组转换实现,本文直接给出了字节数组与结构体的转换代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06
  • 深入C# winform清除由GDI绘制出来的所有线条或图形的解决方法

    深入C# winform清除由GDI绘制出来的所有线条或图形的解决方法

    本篇文章是对在C#中使用winform清除由GDI绘制出来的所有线条或图形的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Asp.Net中MVC缓存详解

    Asp.Net中MVC缓存详解

    这篇文章主要介绍了Asp.Net中MVC缓存的种类区别等内容,一下来学习下。
    2017-12-12
  • C# Onnx实现特征匹配DeDoDe检测

    C# Onnx实现特征匹配DeDoDe检测

    这篇文章主要为大家详细介绍了C# Onnx如何实现特征匹配DeDoDe检测,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • C#实现Excel表数据导入Sql Server数据库中的方法

    C#实现Excel表数据导入Sql Server数据库中的方法

    这篇文章主要介绍了C#实现Excel表数据导入Sql Server数据库中的方法,结合实例形式详细分析了C#读取Excel表数据及导入Sql Server数据库的具体操作步骤与相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C#并发编程入门教程之概述

    C#并发编程入门教程之概述

    这篇文章主要给大家介绍了关于C#并发编程之概述的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • C#如何调用MFC 窗口 DLL

    C#如何调用MFC 窗口 DLL

    这篇文章主要介绍了C#如何调用MFC 窗口 DLL,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • C#调用DeepSeek API的两种实现方案

    C#调用DeepSeek API的两种实现方案

    DeepSeek(深度求索) 最近可谓火爆的一塌糊涂,具体的介绍这里不再赘述,您可以各种搜索其信息,即使您不搜索,只要您拿起手机,各种关于 DeepSeek 的新闻、资讯也会扑面而来的推送到您面前,本文给大家介绍了C#调用DeepSeek API的两种实现方案,需要的朋友可以参考下
    2025-02-02

最新评论