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游戏-鼠标使角色移动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • WinForm项目开发中NPOI用法实例解析

    WinForm项目开发中NPOI用法实例解析

    这篇文章主要介绍了WinForm项目开发中NPOI用法,有一定的实用价值,需要的朋友可以参考下
    2014-08-08
  • C#采用OpenXml实现给word文档添加文字

    C#采用OpenXml实现给word文档添加文字

    这篇文章主要介绍了C#采用OpenXml实现给word文档添加文字的方法,包括了用法的实例分析,是非常实用的技巧,需要的朋友可以参考下
    2014-09-09
  • C#将DataGridView中的数据保存到CSV和Excel中

    C#将DataGridView中的数据保存到CSV和Excel中

    这篇文章介绍了C#将DataGridView中的数据保存到CSV和Excel中的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#控制台实现飞行棋小游戏

    C#控制台实现飞行棋小游戏

    这篇文章主要为大家详细介绍了C#控制台实现飞行棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C#查找字符串所有排列组合的方法

    C#查找字符串所有排列组合的方法

    这篇文章主要介绍了C#查找字符串所有排列组合的方法,涉及C#字符串操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#中string.format用法详解

    C#中string.format用法详解

    这篇文章主要介绍了C#中string.format用法,以实例形式较为详细的讲述了string.format格式化的各种用法,非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • C# WPF 建立无边框(标题栏)的登录窗口的示例

    C# WPF 建立无边框(标题栏)的登录窗口的示例

    这篇文章主要介绍了C# WPF 建立无边框(标题栏)的登录窗口的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#编写发送邮件组件

    C#编写发送邮件组件

    本文给大家分享的是使用C#编写的发送邮件的组件,非常的简单实用,有需要的小伙伴可以参考下。
    2015-06-06
  • C#调用python脚本的方法步骤(2种)

    C#调用python脚本的方法步骤(2种)

    这篇文章主要介绍了C#调用python脚本的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C#如何用ThoughtWorks生成二维码

    C#如何用ThoughtWorks生成二维码

    这篇文章主要介绍了C#如何用ThoughtWorks生成二维码,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08

最新评论