实现效果如下图

项目设置

unity版本:2020.3.24f1c2(不要太旧的版本应该也可以)

渲染管线: URP

一、环境

Ground的标签需要被设置为Ground,并勾选静态

并在导航面板的对象菜单下设置NavigiationArea为Walkale

切换到烘焙菜单点击烘焙,烘焙成功后出现蓝色标记


选中场景中的所有树木,勾选静态,并设置NavigitionArea为NotWalkable,点击烘焙。这样角色在寻路时就不会穿过树木。

二、角色

添加Nav Mesh Agent 组件,创建并挂载PayerController组件

PlayerController脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;public class PlayerController : MonoBehaviour
{private NavMeshAgent agent;private Animator anim;private void Awake(){agent = GetComponent<NavMeshAgent>();anim = GetComponent<Animator>();}private void Start(){mouseManager.Instance.OnMouseClicked += MoveToTarget;}private void Update(){SwitchAnimation();   }private void SwitchAnimation(){anim.SetFloat("Speed", agent.velocity.sqrMagnitude);}public void MoveToTarget(Vector3 target){agent.destination = target;}
}

在场景中添加一个空物体,创建并挂载mouseManager脚本

mouseManager脚本

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;public class mouseManager : MonoBehaviour
{public static mouseManager Instance;public Texture2D point, doorway, attack, target, arrow;private RaycastHit hitInfo;public event Action<Vector3> OnMouseClicked;private void Awake(){if (Instance != null)Destroy(gameObject);Instance = this;}private void Update(){setCursorTexture();MouseControl();}void setCursorTexture(){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out hitInfo)){//切换鼠标贴图switch (hitInfo.collider.gameObject.tag){case "Ground":Cursor.SetCursor(target, new Vector2(16, 16), CursorMode.Auto);break;}}}void MouseControl(){if (Input.GetMouseButtonDown(0) && hitInfo.collider != null){if (hitInfo.collider.gameObject.CompareTag("Ground")){OnMouseClicked?.Invoke(hitInfo.point);}}}
}

三、相机

首先在packgeManager中添加Cinemachine

然后添加一个VirtualCamera

选中新建的CM vcam1在Scene面板中调整好视角点击对齐视图,将相机调整到合适的位置

选中CM vcam1
设置Follow为Player下的一个空物体(也可以就设置为Player)
设置Body为FramingTransposer
设置Aim为Do nothing

重要代码解释

首先在mouseManager.cs中定义了一个OnMouseClicked的事件。然后还定义了一个MouseControl方法。并在Update中调用了MouseControl方法。即在每帧中都会判断是否按下了鼠标左键且鼠标点击的物体的碰撞体的tag为Ground,如果是就触发OnMouseClied事件。

    void MouseControl(){if (Input.GetMouseButtonDown(0) && hitInfo.collider != null){if (hitInfo.collider.gameObject.CompareTag("Ground")){OnMouseClicked?.Invoke(hitInfo.point);}}}

在PlayerController.cs中注册了OnMouseClicked事件的方法为MoveToTarget,即在触发OnMouseClicked事件时就会调用MoveToTarget方法。

    private void Start(){mouseManager.Instance.OnMouseClicked += MoveToTarget;}

在MoveToTarget方法中将Player的寻路组件的目标设置为了鼠标点的位置,于是角色就朝着鼠标点击的位置移动了

    public void MoveToTarget(Vector3 target){agent.destination = target;}

主要的步骤到这里就结束啦,其他的还有动画的设置就不细说了。

之后会分享项目链接

UNITY·鼠标点击地面角色移动相关推荐

  1. Unity 鼠标点击地面移动

    目录 效果 分析 具体流程 效果 分析 在这里我们需要用到的知识点有 AI(地面烘焙,自动寻路) 射线检测 具体流程 首先我们需要创建一个地面Plane 创建好之后在右侧Inspector面板中把Na ...

  2. unity3d]鼠标点击地面人物自动走动(也包含按键wasdspace控制)

    目录(?)[-] 一效果图 二大概步骤 创建一个plane设置层为Terrain因为后面要判断是否点击的是这个层 准备好人物模型并且将三个脚本拖放到人物上并且将动画文件也拖放好记得看前面提醒哦 Thi ...

  3. 鼠标点击地面人物自动走动(也包含按键wasdspace控制)

    在漫游游戏中常用的功能就是人物在场景中行走,必要的功能就是鼠标点击地面人物就朝着那个方向行走,键盘方向键前后左右也能控制人物的行走和跳跃,在官方自带的第三人称视角中做了一点修改,官方自带的ThirdP ...

  4. Unity 鼠标点击控制玩家角色移动

    1.首先创建一个角色 如果有动画就添加上动画组件 设置刚体.碰撞体等一系列需要的组件(看自身需求) 2.然后创建一个plane做地板(记得地板也要添加碰撞体,不然人物会一直下落) 3.然后添加一个脚本 ...

  5. unity鼠标点击显示粒子特效

    参考链接:(51条消息) unity 两个相机叠加 - CSDN (51条消息) [Unity]鼠标点击在屏幕上产生特效_SuperWiwi的博客-CSDN博客_unity点击特效 (51条消息) U ...

  6. 鼠标点击地面,主角移动并切换动画状态

    1.给地形添加一个标签 2.烘焙地形 3.给主角绑定导航代理组件 public class PlayerMouseMove02 : MonoBehaviour {public GameObject a ...

  7. Unity鼠标点击射线的检测

    void Update(){transform.RotateAround(Vector3.zero, Vector3.up, Time.deltaTime * 20);if (Input.GetMou ...

  8. Unity城市虚拟搭建的时候,【房子】或【桥廊】跟随鼠标在【地面】或者【水面】移动

    一.需求 常见虚拟搭建的步骤: 1.在模型库中点击对应的模型图片 2.光标变成扳手 3.光标第一次进入地面后,对应3D物体出现在地面上,并跟随光标在地面上移动 4.鼠标单击物体的时候,物体停止移动并固 ...

  9. Unity使用单例模式已经NavMeshAgent实现鼠标点击移动导航

    为要添加移动的角色添加NavMeshAgent 然后绑定脚本 using System.Collections; using System.Collections.Generic; using Uni ...

最新文章

  1. SQL server(MSSQL)客户端工具登录数据库的两种命令行登录方式
  2. ERROR MESSAGE: Invalid command line: Malformed walker argument: Could not find walker with name
  3. 多波次导弹发射中的规划问题(二) 问题一解答
  4. oracle怎么小数中多余的零,关于小数中0的处理
  5. 关于类与对象操作的细节与注意事项(c++细节篇三)
  6. RMAN异机复制数据库(相同路径)
  7. Linux性能监控命令——sar
  8. python 读取文件_python读取docx文件,就是如此简单
  9. 用 git 同步 Colab 与 Gitlab、Github 之间的文件
  10. java解压中文乱码_java使用解压zip文件,文件名乱码解决方案
  11. Device eth0 does not seem to be present,delaying initialization的解决办法
  12. 高性能业务架构解决方案(LVS+Keepalived)
  13. android 设置超时时间,为android requestSingleUpdate设置超时
  14. 3-3 银行业务队列简单模拟 (25 分)
  15. 3580整数配对---20210527
  16. 图像处理空间域、变换域、时域和频域的含义理解:spatial VS transforms domain
  17. 笔记本电脑桌面不显示计算机,笔记本电脑屏幕不显示怎么回事
  18. 关于shell unix下,直接执行shell与sh 执行 或加 . 脚本 的区别及含义
  19. 星球日报|Conflux支持 阿里上线国内最大数字藏品交易撮合平台
  20. 软件:分享六款实用的软件,每一款值得收藏

热门文章

  1. labels.size(0) 是什么意思
  2. WireGuard 中文教程:使用 Netmaker 快速组建 WireGuard 全互联 (Full Mesh) 网络
  3. 创锐讯网卡 linux,高通创锐讯Atheros AR813X/AR815X/AR816X系列网卡驱动
  4. location.href不跳转、不执行的最有效的解决办法!
  5. windows server 2012 IIS + DCOM 启动office 设置
  6. mysql navicat 设计表_Navicat for MySQL 设计报表版面教程
  7. 气体动理论的定律及定理
  8. 大数据实验室作业总结
  9. 求职者必备!优质简历Word模板来袭
  10. AndroidStudio中使用Git发布与更新,同步到本地(github关联)