论文解析-基于 Unity3D 游戏人工智能的研究与应用
1.重写 AgentAction 方法
1.1 重写 AgentAction 方法

这段代码是一个重写了 AgentAction 方法的方法。以下是对每行代码解释:
①public override void AgentAction(float[] vectorAction)
这行代码声明了一个公共的、重写了父类的 AgentAction 方法的方法。它接受一个 float 类型的数组作为参数。
②float newAction0 = Mathf.Clamp(vectorAction[0], -1, 1);
这行代码将 vectorAction 数组的第一个元素限制在 -1 到 1 的范围内,并将结果赋值给 newAction0 变量。
③newAction0 = (newAction0 + 1) / 2;
这行代码将 newAction0 的值加1后除以2,相当于将其从范围 -1 到 1 映射到范围 0 到 1。
④float newForce = Mathf.Lerp(MinForce, MaxForce, newAction0);
这行代码使用线性插值函数 Mathf.Lerp,根据 newAction0 的值在最小力量值 MinForce 和最大力量值 MaxForce 之间插值,将插值结果赋值给 newForce 变量。
⑤ShootBall(newForce);这行代码调用名为 ShootBall 的方法,并将 newForce 作为参数传递给它。它的作用是使用指定的力量值来发射一个球。
1.2 重写了 AgentAction 方法 是什么意思?
重写(override)是面向对象编程中的一个概念,它指的是在子类中重新实现(覆盖)父类中已存在的方法。
在这段代码中,AgentAction 方法是一个父类中的方法,通过使用 override 关键字,该方法在当前类中进行了重新实现。也就是说,当前类是一个子类,继承了某个父类,而 AgentAction 方法是在父类中定义的。通过重写该方法,子类可以根据自己的需求对方法的行为进行修改或扩展。
在代码中的第一行,public override void AgentAction(float[] vectorAction) 表示当前类重写了父类中的 AgentAction 方法,而不是使用父类中原有的实现。重写方法可以提供自定义的功能或行为,以满足子类的特定需求。
2.重写 CollectObservations 方法
2.1 重写 CollectObservations 方法

这段代码也是重写了一个方法,具体来说是重写了 CollectObservations 方法。
以下是对每行代码的解释:
①public override void CollectObservations()这行代码声明了一个公共的、重写了父类的 CollectObservations 方法的方法。
②float distance = Vector2.Distance(mBallVector2, mNetVector2);这行代码计算了一个向量 mBallVector2 和 mNetVector2 之间的距离,并将结果赋值给 distance 变量。
③distance = (distance - MinDis) / (MaxDis - MinDis);这行代码将 distance 的值从范围 MinDis 到 MaxDis 映射到范围 0 到 1。它通过减去 MinDis,然后除以 MaxDis - MinDis 来进行映射。
④AddVectorObs(distance);这行代码将 distance 添加到观察向量中。这个观察向量用于提供给机器学习模型关于环境状态的信息。
⑤float height = NetTrans.position.y - HeightBaseTrans.position.y;
这行代码计算了一个高度值,即 NetTrans 对象的 y 坐标减去 HeightBaseTrans 对象的 y 坐标,并将结果赋值给 height 变量。
⑥height = (height - MinHeight) / (MaxHeight - MinHeight);这行代码将 height 的值从范围 MinHeight 到 MaxHeight 映射到范围 0 到 1。它通过减去 MinHeight,然后除以 MaxHeight - MinHeight 来进行映射。
⑦AddVectorObs(height);这行代码将 height 添加到观察向量中,用于提供给机器学习模型关于环境状态的更多信息。
这段代码重写了 CollectObservations 方法,以生成两个观察向量:一个是关于机器人与目标的距离,另一个是关于目标距离地面的高度。这些观察向量会在机器学习过程中提供环境状态的信息,以辅助决策和学习。
3.重写 CollectObservations 方法

以下是对提供的代码的逐行解释:
①public override void CollectObservations()这行代码声明了一个公共的、重写了父类的 CollectObservations 方法的方法。
②AddVectorObs(HasMedicineState);这行代码将名为 HasMedicineState 的变量添加到观察向量中。HasMedicineState 可能是一个布尔值,用于表示是否持有药物。观察向量在机器学习过程中用于提供环境状态的信息。
③AddVectorObs(transform.InverseTransformDirection(mAgentRig.velocity));这行代码将 mAgentRig 物体(代理体)的速度转换为局部坐标系中的方向,并将其添加到观察向量中。transform.InverseTransformDirection 用于将世界坐标系中的方向转换为相对于物体的局部坐标系中的方向。
通过以上代码,CollectObservations 方法重写了父类中的方法,生成了两个观察向量。第一个观察向量包含了一个代表是否持有药物的状态信息。第二个观察向量包含了物体运动的速度信息,该速度信息已转换为局部坐标系中的方向。这些观察向量将为机器学习模型提供有关环境状态的信息。
3.1 我们常用的 PPO 算法,其输出动作向量值域在-1 到 1 之间 ?
常用的 PPO(Proximal Policy Optimization)算法的输出动作向量通常被限制在-1到1的值域范围内。这种限制是为了确保输出的动作在合理的范围内,以避免过大或过小的动作值。将输出动作值域限制在-1到1之间有助于稳定训练过程,并使得学习到的策略更容易在实际环境中执行。
在代码中,你可能会看到一些对输出动作向量进行范围映射的操作,例如使用 Mathf.Clamp 函数将动作向量的元素限制在-1到1之间。这样的映射操作可以确保输出动作在合理范围内,并符合使用 PPO 算法的通常约定。
注意:从官方的使用说明文档中可以了解到,不适合过度设计奖励方式,代理可能会在训练过程中找到奖励的“漏洞”,最终导致训练失败。
参考文献:
[1]朱杰. 基于Unity3D游戏人工智能的研究与应用[D].广东工业大学,2020.
相关文章:
论文解析-基于 Unity3D 游戏人工智能的研究与应用
1.重写 AgentAction 方法 1.1 重写 AgentAction 方法 这段代码是一个重写了 AgentAction 方法的方法。以下是对每行代码解释: ①public override void AgentAction(float[] vectorAction) 这行代码声明了一个公共的、重写了父类的 AgentAction 方法的方法。它接受…...
6、Flutterr聊天界面网络请求
一、准备网络数据 1.1 数据准备工作 来到网络数据制造的网址,注册登录后,新建仓库,名为WeChat_flutter;点击进入该仓库,删掉左侧的示例接口,新建接口. 3. 接着点击右上角‘编辑’按钮,新建响应内容,类型为Array,一次生成50条 4. 点击chat_list左侧添加按钮,新建chat_list中的…...
Java 8 腰斩!Java 17 暴涨 430%!!(文末福利)
New Relic 最新发布了一份 “2023 年 Java 生态系统状况报告”,旨在提供有关当今 Java 生态系统状态的背景和见解。该报告基于从数百万个提供性能数据的应用程序中收集的数据,对生产中使用最多的版本、最受欢迎的 JDK 供应商、容器的兴起等多方面进行了调…...
如何手写一个支持H.265的高清播放器
概述 音视频编解码技术在当前的互联网行业中十分热门,特别是高清视频播放器的开发,其中包括4K、8K等超高清分辨率的播放器,具有极高的市场需求和广泛的应用场景。H265编码技术更是实现高清视频压缩的重要手段之一。如果想要掌握音视频编解码…...
Day 1 认识软件测试——(软件测试定义、目的、原则)
Day 1 认识软件测试——(软件测试定义、目的、原则) 文章目录 Day 1 认识软件测试——(软件测试定义、目的、原则)软件测试的定义软件测试的目的软件测试的经济学问题黑盒测试白盒测试软件测试原则小结所谓软件测试,就是一个过程或一系列过程,用来确定计算机代码完成了其…...
Docker Harbor
目录 一、Docker Harbor概述 1、Harbor的优势 2、Harbor知识点 3、Docker私有仓库架构 二、Harbor构建Docker私有仓库 1、环境配置 2、案例需求 3、部署docker-compose服务 4、部署harbor服务 5、启动harbor ① 访问 ② 添加项目并填写项目名称 ③ 通过127.0.0.1来…...
第三十四章 Unity人形动画(上)
在我们DirectX课程中,我们讲过一个模型最少拥有网格和材质,可以没有动画。游戏场景中的静态物体就可以是这样的模型,例如花草树木,建筑物等等,他们通过MeshRenderer就可以渲染。对于一个带有动画的FBX文件,…...
计算机图形学-GAMES101-7
引言 场景中有很多的三角形,如果实现可见性和遮挡呢? 一个简单的想法是,从远到近画,近处的物体自然会覆盖掉远处的物体,这种画法也叫画家算法。 但是实际绘制中物体的顺序是不容易确定的,比如如下图绘制…...
AndroidAuto 解决PCTS NF7
直接上代码 public void handleNavigationFocusRequest(int focusType) {// Always grant requested focus in this example.-mGal.galReceiver.sendNavigationFocusState(focusType);+mGal.galReceiver.sendNavigationFocusState...
GPT:你知道这五年我怎么过的么?
时间轴 GPT 首先最初版的GPT,来源于论文Improving Language Understanding by Generative Pre-Training(翻译过来就是:使用通用的预训练来提升语言的理解能力)。GPT这个名字其实并没有在论文中提到过,后人将论文名最后…...
Python一行命令搭建HTTP服务器并外网访问 - 内网穿透
文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章:【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…...
TypeScript5-泛型
泛型是 TS 中一个重要的概念,它可以创建可复用的组件,同时保持对类型信息的一致性。 泛型提供了一种方式使得类型可以被参数化,这样就可以创建可以适用于各种数据类型的函数或类,而不仅仅限于一个数据类型。 一、泛型 先来看一…...
IMX6ULL裸机篇之DDR3的时钟配置
一. MMDC 控制器 对于 I.MX6U 来说,有 DDR 内存控制器,否则的话它怎么连接 DDR 呢?MMDC控制器 就是 I.MX6U 的 DDR内存控制器。 MMDC 外设包含一个内核(MMDC_CORE)和 PHY(MMDC_PHY),内核和 PHY 的功能如下: MMDC 内…...
PBDB Data Service:Specimens and measurements(标本和测量)
Specimens and measurements(标本和测量) 描述摘要1. [Single specimen(单个标本)](https://blog.csdn.net/whitedrogen/article/details/130685099)2. [Add specimen records or update existing records(添加标本记录…...
Zookeeper(一)
简介 设计模式角度 Zookeeper:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那…...
Maven(五):Maven的使用——依赖的测试
Maven(五):Maven的使用——依赖的测试 前言一、实验六:测试依赖的范围1、依赖范围1.1 compile 和 test 对比1.2 compile 和 provided 对比1.3 结论 二、实验七:测试依赖的传递性1、依赖的传递性1.1 概念1.2 传递的原则…...
超级独角兽 Databricks 的崛起之路
在数据扩张以及 AI 兴起的时代,数据存储和分析平台拥有巨大价值和能量。 随着互联网数据的爆炸性增长,数据已经成为企业的新型资源,犹如石油般重要。越来越多的企业希望利用各种结构化和非结构化数据来发挥自己的优势。 然而,他…...
python 3.8 + tensorflow 2.4.0 + cuda11.0 的问题
版本匹配 🔗从源代码构建 | TensorFlow 报错:Could not load dynamic library ‘cupti64_110.dll’; dlerror: cupti64_110.dll not found 是因为我电脑中的 cuda 版本以前是 10,现在是 11.4 ,所以需要安装对应版本的 cudatoolk…...
华为杯”研究生数学建模竞赛2021 年中国研究生数学建模竞赛 E 题: 信号干扰下的超宽带(UWB)精确定位问题-参考思路
一、背景 UWB ( Ultra-Wideband )技术也被称之为“超宽带”,又称之为脉冲无线电技术。这是一 种无需任何载波,通过发送纳秒级脉冲而完成数据传输的短距离范围内无线通信技术,并且信 号传输过程中的功耗仅仅有几十 W 。 UWB 因其独有的特点,使其在军事、物联网等各个领…...
Java 中的访问修饰符有什么区别?
Java 中的访问修饰符用于控制类、类的成员变量和方法的访问权限,主要有以下四种: public:公共访问修饰符,可以被任何类访问。public 修饰的类、成员变量和方法可以在任何地方被访问到。 protected:受保护的访问修饰符…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
