Unity3d-路径巡逻

news2024/11/28 14:54:14

使用U3D实现的简单巡逻方法

  • 游戏对象逐个向组成路径的节点进行直线移动
  • 两种巡逻方案
    1. 根据列表顺序移动,到达最后一个后,直接返回第一个,重新开始循环
    2. 根据列表顺序移动,到达最后一个后,根据顺序反向移动到第一个,重新开始循环

巡逻方案1

巡逻方案1

实现代码

    public Transform pathNodes;
    public float moveSpeed = 5f; //移动速度

    private int currentNodeIndex = 0;//当前节点位置的索引

    void Start()
    {
        //初始位置
        transform.position = pathNodes.GetChild(0).position;
    }

    void Update()
    {
        //检查是否到达
        if (Vector3.Distance(transform.position, pathNodes.GetChild(currentNodeIndex).position) < 0.1f)
        {
            currentNodeIndex = (currentNodeIndex + 1) % pathNodes.childCount;
        }

        //方向
        Vector3 targetDirection = pathNodes.GetChild(currentNodeIndex).position - transform.position;
        targetDirection.Normalize();

        //移动
        transform.position += targetDirection * moveSpeed * Time.deltaTime;
        transform.rotation = Quaternion.LookRotation(targetDirection);
    }

实现思路

  1. 首先将对象初始化在起始位置
  2. 每帧检查对象是否到达节点,当对象与节点距离小于0.1则判断为到达
  3. 到达后将索引号+1,使用%运算让索引号在节点列表中循环
  4. 计算方向
  5. 旋转对象,朝节点移动

巡逻方案2

巡逻方案2

实现代码

    public Transform pathNodes;
    public float moveSpeed = 5f; //移动速度

    private int currentNodeIndex = 0;//当前节点位置的索引
    private bool isMovingForward = true; //是否正向移动

    void Start()
    {
        //初始位置
        transform.position = pathNodes.GetChild(0).position;
    }

    void Update()
    {
        //检查是否到达
        if (Vector3.Distance(transform.position, pathNodes.GetChild(currentNodeIndex).position) < 0.1f)
        {
            //方案1
            //currentNodeIndex = (currentNodeIndex + 1) % pathNodes.childCount;

            //方案2
            if (isMovingForward)
            {
                currentNodeIndex++;
                if (currentNodeIndex >= pathNodes.childCount)
                {
                    currentNodeIndex = pathNodes.childCount - 2;
                    isMovingForward = false;
                }
            }
            else
            {
                currentNodeIndex--;
                if (currentNodeIndex < 0)
                {
                    currentNodeIndex = 1;
                    isMovingForward = true;
                }
            }
        }

        //方向
        Vector3 targetDirection = pathNodes.GetChild(currentNodeIndex).position - transform.position;
        targetDirection.Normalize();

        //移动
        transform.position += targetDirection * moveSpeed * Time.deltaTime;
        transform.rotation = Quaternion.LookRotation(targetDirection);

实现思路

  1. 首先将对象初始化在起始位置
  2. 每帧检查对象是否到达节点,当对象与节点距离小于0.1则判断为到达
  3. 添加一个变量记录正向及反向移动,正向时到达节点后将索引号+1,反向时到达节点后索引号-1
  4. 计算方向
  5. 旋转对象,朝节点移动

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用 Pytest+Appium+Allure 做 UI 自动化的那些事~(有点干)

目录 前言&#xff1a; Appium 不常见却好用的方法 Appium 直接执行 adb shell 方法 Appium 直接截取元素图片的方法 Appium 直接获取手机端日志 Appium 直接与设备传输文件 Pytest 与 Unittest 初始化上的区别 1.Pytest 与 unitest 类似&#xff0c;有些许区别&#x…

【嘉立创EDA】客户端版本嘉立创专业版半离线版更新方法

文章路标👉 文章解决问题主题内容工程文件备份保护问题新版本更新通知文章解决问题 1️⃣ 嘉立创EDA专业版,是时下越发常用的PCBA设计软件之一。该环境除了在规划的设计开发过程中,为响应各用户的建议、需求,其迭代更新速度也是很快。为了使用最新的功能,用户需要使用最…

C++学习——类和对象(一)

C语言和C语言最大的区别在于在C当中引入了面向对象的编程思想&#xff0c;想要完全了解c当中的类和对象&#xff0c;就要从头开始一点一点的积累并学习。 一&#xff1a;什么是面向对象编程 我们之前学习的C语言属于面向过程的编程方法。举一个简单的例子来说&#xff1a;面向过…

Linux地盘上AMD处理器称王了

近日资讯&#xff0c;尽管从全局来看&#xff0c;Linux系统份额远不及Windows&#xff0c;但在程序员、开发者、硬核玩家圈子&#xff0c;Linux则备受推崇。 来自Steam的最新数据显示&#xff0c;在Linux游戏用户中&#xff0c;AMD处理器的份额占据绝对优势&#xff0c;达到了…

Spring Cloud—GateWay之限流

RequestRateLimiter RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许&#xff0c;就会返回 HTTP 429 - Too Many Requests&#xff08;默认&#xff09;的状态。 这个过滤器需要一个可选的 keyResolver 参数和特定于…

cpuset.cpus.effective: no such file or directory (修改 docker cgroup 版本的方法)

要切换使用 v1 版 cgroup&#xff0c;需要做如下配置&#xff1a; vim /etc/default/grubGRUB_CMDLINE_LINUX"systemd.unified_cgroup_hierarchy0"update-grubreboot完美解决

【条件与循环】——matlab入门

目录索引 if&#xff1a;else与elseif&#xff1a; for&#xff1a; if&#xff1a; if 条件语句块 endelse与elseif&#xff1a; if 条件代码块 elseif 条件代码块 else 代码块 endfor&#xff1a; for 条件循环体 end在matlab里面类似的引号操作都是包头又包尾的。上面的c…

TypeScript基础篇 - TS介绍

目录 Typescript的定义 type.ts 深入了解Typescript Typescript应该学到什么程度&#xff1f; Typescript学习方法 如何学好TS 小节&#xff1a;常见学习误区 一张ai生成图~ Typescript的定义 2012年微软发布的一门编程语言 Transcompiler【翻译编译器】Typescript——…

操作符详解(2)

文章目录 8. 条件操作符9. 逗号表达式10. 下标引用、函数调用和结构成员11. 表达式求值11.1 隐式类型转换11.2 算术转换11.3 操作符的属性 附&#xff1a; 8. 条件操作符 exp1 ? exp2 : exp3 int main() {int a 0;int b 0;if (a > 5){b 3;}else{b -3;}//(a > 5) ? …

【Elasticsearch】黑马旅游案例

目录 4.黑马旅游案例 4.1.酒店搜索和分页 4.1.1.需求分析 4.1.2.定义实体类 4.1.3.定义controller 4.1.4.实现搜索业务 4.2.酒店结果过滤 4.2.1.需求分析 4.2.2.修改实体类 4.2.3.修改搜索业务 4.3.我周边的酒店 4.3.1.需求分析 4.3.2.修改实体类 4.3.3.距离排序…

linux学习笔记(1)----基础知识

1.linux用户 ubuntu有三种用户&#xff1a; 1&#xff09;初次创建的用户 2&#xff09;root用户 3&#xff09;普通用户 linux用户记录在etc/passwd这个文件内 linux用户密码在etc/shadow这个文件内 2.linux用户组 为了方便管理&#xff0c;将用户进行分组&#xff0c…

.NET Native AOT的静态库与动态库

.NET不仅可以使用 C静态库与动态库&#xff0c;也可以将.NET实现的函数导出为C静态库与动态库。在没有Native Aot之前&#xff0c;.NET只能通过P/Invoke享受C/C生态&#xff0c;而在Native Aot之后&#xff0c;不仅可以享受这些生态&#xff0c;还可以开发SDK供其他语言调用。 …

多层、六边形、洋葱和clean架构简介

想想回到过去的美好时光&#xff0c;根本没有所谓架构&#xff0c;那些日子是多么幸福啊&#xff0c;只有了解 GoF 模式&#xff0c;你就能称自己为架构师。 然而&#xff0c;计算机变得更加强大&#xff0c;用户的需求增加&#xff0c;导致应用程序的复杂性增加。 开发人员解决…

一场内容生产的革命 :从PGC、UGC到AIGC

1 概念解读 1.1 什么是PGC&#xff1f; PGC 是指专业生成内容&#xff08;Professional Generated Content&#xff09;&#xff0c;是由专业的内容创作者或团队进行创作、编辑和发布的内容。PGC创作方式起源于传统媒体时代&#xff0c;如报纸、杂志、电视和电影等&#xff0…

低代码技术在各大行业中的应用探讨

随着低代码开发平台的兴起&#xff0c;越来越多的企业开始探索和采用这一技术&#xff0c;以加速应用程序的开发和数字化转型。低代码开发平台的优势在于简化和加速开发过程&#xff0c;降低了技术门槛&#xff0c;使得非专业开发人员也能参与应用程序的创建。在本篇文章中&…

Linux下挂载NFS服务

描述&#xff1a;在Linux下把文件挂在到Linux开发板中实现文件共享 准备步骤&#xff1a;Ubuntu和一块Linux开发板 网络环境&#xff1a;确保在同一个网段&#xff1a;例如192.168.1.226 和192.168.3.226 是不同的网段 NFS介绍 网络文件系统&#xff0c;英文 Network File …

Linux上安装和使用SSH工具

文章目录 前言一、安装SSH Server1. 安装ssh安装包2. 启动ssh3. 设置ssh开机启动 二、 检查SSH状态三、备注 前言 SSH&#xff08;Secure Shell&#xff0c;安全外壳&#xff09;是一种网络安全协议&#xff0c;通过加密和认证机制实现安全的访问和文件传输等业务&#xff0c;…

MySQL 的全局锁、表锁和行锁

在前一篇文章我讲了下 MySQL 的全局锁、表记锁和行级别锁&#xff0c;其中行级锁只提了概念&#xff0c;并没有具体说。 因为行级锁加锁规则比较复杂&#xff0c;不同的场景&#xff0c;加锁的形式还不同&#xff0c;所以这次就来好好介绍下行级锁。 对记录加锁时&#xff0c;加…

PyTorch模型安卓部署流程(NCNN)

上一篇介绍了PyTorch模型部署流程&#xff08;Onnx Runtime&#xff09;的相关部署流程,再来简单的回顾一下~ 深度学习模型部署介绍 模型部署指让训练好的深度学习模型在特定环境中运行的过程。模型部署会面临的难题&#xff1a; 运行模型所需的环境难以配置。深度学习模型通…

驱动设备的IOCTL

一、ioctl操作实现 已知成员的地址获得所在结构体变量的地址&#xff1a; container_of(成员地址,结构体类型名&#xff0c;成员在结构体中的名称) long xxx_ioctl (struct file *filp, unsigned int cmd, unsigned long arg); 功能&#xff1a;对相应设备做指定的控制操作&…