你知道LOL中点地面移动是怎么实现的吗?

在这里插入图片描述

引言

Cocos中点地面移动的实例。

在游戏开发中,我们经常会遇到通过点击地面控制玩家移动到指定点的需求。

本文将介绍一下如何在Cocos中实现类似LOL点地面移动效果。

本文源工程在文末获取,小伙伴们自行前往。

点地面移动知识点

在这里插入图片描述

要在Cocos中实现类似LOL点地面移动效果,有以下2个知识点:

1.屏幕空间坐标转换为射线

在游戏中,当玩家点击屏幕上的某个点时,你可能希望知道从相机发射出的射线穿过屏幕上的那个,以便进行进一步的交互或检测

因此我们需要将一个屏幕空间(左上角为原点)坐标转换为射线

Cocos中我们需要用到的APICamera.screenPointToRay

查API文档能解决80%的问题

2.通过射线检测所有的碰撞盒

射线检测是一种常用的技术,用于判断一条射线与游戏场景中的物体是否相交,从而实现例如点击检测、射线投射等功能。

因此我们需要检测所有的碰撞盒,并记录所有被检测到的结果

Cocos中我们通过PhysicsSystem.instance.raycast(ray)进行检测和PhysicsSystem.instance.raycastResults 访问结果。

如果你查不到请告诉Cocos官方

话不多说,一起来做个实例。

点地面移动实例

接下来我们一步一步来实现类似LOL点地面移动效果。

1.环境

引擎版本:Cocos Creator 3.8.1

编程语言:TypeScript

2.资源准备

我们还是直接借用一下Cocos商城麒麟子的免费资源“KylinsEasyController”创建项目。

再次站在巨人的肩膀上

然后自己创建一个圆锥体用于指示点击地点(节目组还是一如既往地)。

一个字扣

通过动画编辑器做个简单的上下移动的效果。

上下上下左右左右BABA

3.编写代码

新建一个TouchMove组件,并且Canvas上。

@ccclass('TouchMove')
export class TouchMove extends Component {@property(Node)pointerNode: Node;
}

start()方法中通过this.node.on监听NodeEventType.MOUSE_DOWN事件。

start() {this.node.on(NodeEventType.MOUSE_DOWN, (event: EventMouse) => {}, this);
}

然后通过下面的方法得到点击的物体

  • event.getLocation() 获取点击的屏幕坐标。
  • camera.screenPointToRay(uiPos.x, uiPos.y, ray) 通过屏幕坐标产生射线。
  • PhysicsSystem.instance.raycast(ray) 进行射线碰撞检测并记录结果。
  • PhysicsSystem.instance.raycastResults 获取射线检测结果,通过名字或者其他信息得到想要的物体。
var uiPos = event.getLocation();
var ray = new geometry.Ray();
camera.screenPointToRay(uiPos.x, uiPos.y, ray);
if (PhysicsSystem.instance.raycast(ray)) {const raycastResults = PhysicsSystem.instance.raycastResults;for (let i = 0; i < raycastResults.length; i++) {const item = raycastResults[i];if (item.collider.node.name == "Plane") {}}
} else {console.log('raycast does not hit the target node !');
}

最后通过下面的方法指标出现角色移动

  • item.hitPoint 获取点击的坐标。
  • .active = true.setWorldPosition(item.hitPoint)显示并设置指针坐标。
  • player.lookAt 设置角色朝向。
  • skeletalAnimation.crossFade("anim_rig_run", 0.1) 通过skeletalAnimation组件播放动画。
  • tween(player) 通过tween动画实现角色移动。
this.pointerNode.active = true;
this.pointerNode.setWorldPosition(item.hitPoint);
player.lookAt(new Vec3(player.worldPosition.x * 2 - item.hitPoint.x, player.position.y, player.worldPosition.z * 2 - item.hitPoint.z));
skeletalAnimation.crossFade("anim_rig_run", 0.1);
let duration = Vec3.distance(player.worldPosition, item.hitPoint) * speed;
if (playerTween) {playerTween.stop();
}
playerTween = tween(player);
playerTween.to(duration, { worldPosition: item.hitPoint }).call(() => {skeletalAnimation.crossFade("anim_rig_idle_1", 0.1);this.pointerNode.active = false;
}).start();

4.效果演示

在这里插入图片描述

今天的节目到此为止。帮忙转发一下文章哦,下课!

结语

本文源工程可通过私信发送TouchMove获取。

更多实用源码可以扫码或者阅读原文看看,付费不仅是知识的获取,更是对笔者的支持和认可,感谢!

亿元源码杂货铺

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

你知道王者荣耀是怎么实现技能范围指示器的吗?

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/264963.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Hadoop_03】HDFS概述与Shell操作

1、集群配置&#xff08;1&#xff09;集群启动/停止方式总结&#xff08;2&#xff09;编写Hadoop集群常用脚本&#xff08;3&#xff09;常考面试题【1】常用端口号【2】常用配置-文件 2、HDFS概述&#xff08;1&#xff09;HDFS产出背景及定义&#xff08;2&#xff09;HDFS…

数字化转型怎么才能做成功?_光点科技

数字化转型对于现代企业来说是一场必要的革命。它不仅仅是技术的更迭&#xff0c;更是企业战略、文化和运营方式全面升级的体现。一个成功的数字化转型能够使企业更具竞争力、更灵活应对市场变化&#xff0c;并最终实现业务增长和效率提升。那么&#xff0c;数字化转型怎么才能…

【开源】基于Vue+SpringBoot的免税店商城管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 069 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S069。} 文末获取源码&#xff0c;项目编号&#xff1a;S069。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统…

GridBagLayout GridBagConstraints 笔记231130

实例化使用模板 GridBagLayout gbl new GridBagLayout(); // gbl.columnWidths new int[]{200,200,200}; // 用数组设置列 // gbl.rowHeights new int[]{100,100,100,100,100}; // 用数组设置行GridBagConstraints gbc new GridBagConstraints();/*** gridBagConstrain…

【Spring】Spring统一功能处理

Spring统一功能处理 拦截器拦截器什么是拦截器拦截器的基本使用定义拦截器注册配置拦截器 拦截器详解拦截器的拦截路径配置拦截器实现原理初始化处理请求 适配器模式 统一数据返回格式统一数据返回格式快速入门 统一异常处理 拦截器 场景: 我们要对一个网站实现强制登陆的功能…

TailwindCSS 如何处理RTL布局模式

背景 TikTok作为目前全世界最受欢迎的APP&#xff0c;需要考虑兼容全世界各个地区的本地化语言和阅读习惯。其中对于阿拉伯语、波斯语等语言的阅读书写习惯是从右向左的&#xff0c;在前端有一个专有名字RTL模式&#xff0c;即Right-to-Left。 其中以阿拉伯语作为第一语言的人…

MySQL数据库,创建和管理表

创建数据库&#xff1a; 方式一&#xff1a;创建数据库 CREATE DATABASE 数据库名&#xff1b;&#xff08;使用的是默认的字符集&#xff09; 方式二&#xff1a;创建数据库并指定字符集 CREATE DATABASE 数据库名 CHARACTER SET 字符集&#xff1b; 方式三&#xff1a;判断数…

成都工业学院Web技术基础(WEB)实验三:CSS字体等属性使用

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

磁学单位SI制和CGS制的转换

电磁学领域中除了使用一般的SI国际制单位外&#xff0c;还会使用CGS高斯制单位&#xff0c;这对于接触磁性材料的朋友们来说&#xff0c;有时就需要做单位的转换&#xff0c;而这两种单位制的转换计算非常复杂。为了方便大家使用&#xff0c;我们系统地总结了一下电磁学中的单位…

Linux Docker 安装Nginx

1.21、查看可用的Nginx版本 访问Nginx镜像库地址&#xff1a;https://hub.docker.com/_/nginx 2、拉取指定版本的Nginx镜像 docker pull nginx:latest #安装最新版 docker pull nginx:1.25.3 #安装指定版本的Nginx 3、查看本地镜像 docker images 4、根据镜像创建并运行…

KubeSphere应用【二】Docker安装

一、Docker安装 1.下载Docker安装包 【地址】Index of linux/static/stable/x86_64/ 2.上传至服务器 # 解压文件 tar -xvf docker-20.10.10.tgz# 将docker 目录中的所有文件复制至/usr/bin/目录下 cp docker/* /usr/bin 3.配置docker.service文件 vim /usr/lib/systemd/sy…

人工智能_机器学习061_KKT条件公式理解_原理深度解析_松弛变量_不等式约束---人工智能工作笔记0101

然后我们再来看,前面我们,拉格朗日乘子法,把带有条件的,问题,优化成了等式问题,从而, 构建拉格朗日乘子公式,进行实现了求解,但是在现实生活中,往往也有,很多不等式问题. 比如上面的这个,就是要求是h(x)<=0的情况下,函数f(x)的最小值. 可以看到,这个带有一个不等式的条件,…