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

Godot2D角色导航教程(角色随鼠标移动)

文章目录

  • 运行结果
  • 2D导航概述
  • 开始前的准备
  • 2D导航
    • 创建导航网格
    • 创建角色
  • 其他文章

运行结果

在这里插入图片描述

2D导航概述

Godot为2D和3D游戏提供了多个对象、类和服务器,以便于基于网格或基于网格的导航和路径查找。

说到导航,就得说一下导航网格,导航网格定义了角色可以站立和移动的区域,以其中心为基准。

本文章内容主要以官方文档为主,链接如下:官方文档导航部分

开始前的准备

为你的项目设置合适的窗口大小,如下图所示,宽度和高度自定义。
在这里插入图片描述

2D导航

创建导航网格

接下来,我们就创建一个导航网格。
首先为你的场景添加一个地图,也就是玩家可以走的路,这里随便弄,如下图所示。
在这里插入图片描述
接下来添加一个NavigationRegion2D组件。
在这里插入图片描述
单击该组件,在检查器窗口中,新建一个Navigation Polygon。
在这里插入图片描述
接着,点击该属性,在场景中绘制你的导航网格,如下图所致。连接第一个点和最后一个点可以完成导航网格的绘制。
在这里插入图片描述

注意在导航多边形的边缘和碰撞对象之间留出足够的间距,以避免路径跟随的角色在碰撞中反复被卡住。

创建角色

创建一个CharacterBody2D节点。为其添加Sprite2D子节点,为Sprite2D的Texture属性赋值,给他弄一个角色图片,任意即可。为CharacterBody2D添加CollisionShape2D子节点,为其Shape属性添加一个形状。调整大小以契合Sprite2D。
在这里插入图片描述
然后为CharacterBody2D添加NavigationAgent2D节点,最后结果如下图所示:
在这里插入图片描述
为CharacterBody2D节点添加一个MyCharacterBody2D脚本,并为其编写如下内容:

using Godot;public partial class MyCharacterBody2D : CharacterBody2D
{private NavigationAgent2D _navigationAgent;private float _movementSpeed = 200.0f;private Vector2 _movementTargetPosition = new Vector2(500.0f, 200.0f);public Vector2 MovementTarget{get { return _navigationAgent.TargetPosition; }set { _navigationAgent.TargetPosition = value; }}public override void _Ready(){base._Ready();_navigationAgent = GetNode<NavigationAgent2D>("NavigationAgent2D");// These values need to be adjusted for the actor's speed// and the navigation layout._navigationAgent.PathDesiredDistance = 4.0f;_navigationAgent.TargetDesiredDistance = 4.0f;// Make sure to not await during _Ready.Callable.From(ActorSetup).CallDeferred();}public override void _Process(double delta){base._Process(delta);_movementTargetPosition=GetMouseClickPosition();Callable.From(ActorSetup).CallDeferred();}public override void _PhysicsProcess(double delta){base._PhysicsProcess(delta);if (_navigationAgent.IsNavigationFinished()){return;}Vector2 currentAgentPosition = GlobalTransform.Origin;Vector2 nextPathPosition = _navigationAgent.GetNextPathPosition();Velocity = currentAgentPosition.DirectionTo(nextPathPosition) * _movementSpeed;MoveAndSlide();}private async void ActorSetup(){// Wait for the first physics frame so the NavigationServer can sync.await ToSignal(GetTree(), SceneTree.SignalName.PhysicsFrame);// Now that the navigation map is no longer empty, set the movement target.MovementTarget = _movementTargetPosition;}public Vector2 GetMouseClickPosition(){Vector2 mousePosition = GetGlobalMousePosition();return mousePosition;}
}

最终运行结果如下图所示:
在这里插入图片描述

其他文章

Godot实现闪烁效果
Godot信号教程

http://www.lryc.cn/news/186958.html

相关文章:

  • 论文阅读--Cell-free massive MIMO versus small cells
  • 【深度学习】UniControl 一个统一的扩散模型用于可控的野外视觉生成
  • 使用ChatGPT和MindShow一分钟生成PPT模板
  • C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化或反序列化报错解决方法
  • 【Linux】Linux 之用户管理
  • NLP:Attention和self-attention的区别
  • Gap Year Plan
  • 厌烦了iPhone默认的热点名称?如何更改iPhone上的热点名称
  • 【数据库审计】2023年数据库审计厂家汇总
  • C#WPF StackPanel布局及Border边框应用实例
  • RabbitMQ-第四种交换机类型
  • Redis AOF重写原原理
  • es6.x和es7.x如何创建索引?
  • 《DevOps 精要:业务视角》- 读书笔记(三)
  • C语言——文件操作_学习笔记
  • cap分布式理论
  • asp.net core 如何统一json序列化格式
  • DALL·E 3 ChatGPT-4的梦幻联动
  • linux,write:xxx has messages disabled 与 Ubuntu多用户同时登录的问题 ubuntu 20.04
  • ffmpeg批量转换ape/wav为mp3 (linux, mac适用)
  • 自动生成JPA bean及repository生成简陋工具
  • vue3+vite+uniapp 封装一个省市区组件
  • OpenCV报错:AttributeError: module ‘cv2.cv2‘ has no attribute ‘SIFT_create‘
  • 通用监控视频web播放方案
  • C++基础知识3
  • 【配置vscode编写python代码并输出到外部控制台】
  • RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试
  • DVWA -xss
  • C语言编程实现只有一个未知数的两个多项式合并的程序
  • C# .net创建一个MVC框架工程