已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 6 实例化与刚体实例化与刚体 在这章中 我们将探讨三维游戏设计中的两个基本概念 首先 我们研究 实例化 的概念 利用 它可以实现在运行时建立物体 然后通过实现一个 实例化 的实例来学习刚体的物理特性 当在我们制作游戏场景之初 一般我们不会将所有的物体全部展现在场景中 利用一些拼图类游戏 中 不可能将全部小物体全部放到场景中 那将占用大量的资源 屏幕也摆放不下 本章将在我们的小岛上实现实例 利用刚体的物理特性 实现简单的 投椰子 游戏 其中椰子在 游戏开始时并不存在 这时将用到 实例化 通过指定一个资源 如预制件 的位置和方向 可以创 建一个游戏对象 通过这个功能我们可以在玩家按键时来创建椰子 为了将这个小游戏与前面的开门整合在一起 我们删除一个开门用的电池 打玩家通过打椰子游戏 后将会得到一个电池 本书素材中已经提供了一个打椰子用的平台模型 我们将自己建立椰子预制件 并编写代码控制目标靶被打中的效果 目标靶素材已经提供了 翻倒 和 复位 两个动画 我们将编 写代码实现在目标靶被打中一定时间后自动复位的功能 这就要求玩家要玩赢得游戏必须在指定时间内 同时打倒三个目标靶才行 这加大了游戏的难度 要求玩家掌握一定的投掷技巧 使游戏具有更好的可 玩性 在本章中 具体将实现以下内容 准备用于实例化的预制件 使用命令来完成实现化 检测玩家按键状态 给刚体添加物理性能 给玩家提供反馈 6 1 实例化介绍实例化介绍 在这节中 我们将学习在如何在程序运行时大量制作和复制物体 许多游戏中利用这个原理可以制 作发射物体 可收集物体 甚至用于生成角色和敌人等 6 1 1 设计原理设计原理 实例化是利用一个模板 如预制件 在游戏运行时大量制作物体的简单方法 它也可用于复制场景 中已经存在的物体 实例化方法通常包含以下几步 建立要在场景中实例化的物体对象 为其添加必要的组件属性 为这个物体建立一个预制件 将这个物体拖放到这个预制件上 删除原来的物体 只保预制件资源 编写脚本使用Instantiate 命令引用制作的预制件完成实例化 将脚本附加到一个场景物体上 6 1 2 脚本实现脚本实现 实例化脚本中的主要命令是 Instantiate 它有三个参数 具体其格式如下 Instantiate 要建立的物体 建立物体的位置 建立物体的方向 仔细理解三个参数的作用是使用该命令的关键 2 1 传递物体 传递物体 为了传递一个物体参数 可以使用公共成员变量作为 Instantiate 函数的第一个参数 在顶部代码中建立一个 GameObject 类型的公共成员变量 可以在 Inspector 窗口中拖放一个预制件到 该变量作为实参 变量定义及引用如下 var myPrefab GameObject Instantiate myPrefab position to create it rotation to give it 我们也可以限制只允许拖放指定的类型的预制件到 myPrefab 变量 例如可以写 var myPrefab Rigidbody Instantiate myPrefab position to create it rotation to give it 这将限制只有具有 Rigidbody 组件属性的预制件可以被引用 2 2 位置和方向 位置和方向 被建立的物体的位置和方向要求指定们一个 Vector3 向量值 例如 Instantiate myPrefab Vector3 0 12 30 Vector3 0 0 90 它们也可以从其它物体继承位置和方向的值 当指定要实例化的物体的位置时 首先要确定物体是 建立在局部空间还是世界空间 例如 当建立椰子预制件时 我们将它建立在世界空间的一个点上 该 点由一个空的游戏对象来定义 这个空对象是玩家对象的一个子物体 这样 椰子建立在局部空间上 由于玩家位置的移动 所以每次建立的位置可能不同 这咱方案要求我们将脚本附加到上面的空物体上 建立的位置由这个空物体而定 可以用点语法来 取得 transform position 作为 Instantiate 命令的参数 这样椰子取得空物体的位置 方向的取得同上 代码实现如下 var myPrefab GameObject Instantiate myPrefab transform position transform rotation 后面我们将实现这个程序 但首先要学习下刚体的物体属性及它在游戏中的重要性 6 2 刚体介绍刚体介绍 物理引擎为游戏程序提供了真实环境仿真的方法 几乎所有游戏中都提供了内置或插件形式的物理 引擎 Unity 使用 Nvidia PhysX 物理引擎 它在目前游戏产业中比较流行 应用物理引擎不仅可以实现物 理作用力 如重量和重力 同时可以实现摩擦力 扭矩 质点运动等仿真效果 6 2 1 力力 物理引擎通过力来对物体产生作用 通过脚本和组件可以实现力的不同形式 要使力对物体产生作用 要求物体必须具有刚体组件属性 6 2 2 刚体组件 刚体组件 在 Unity 中 一个物体只有具有了刚体组件才能激活物体引擎 而场景中的其它物体则不需要 物理 引擎工作在后台 可能地 Inspector 窗口给物体添加 Rigidbody 组件 如下图 3 Rigidbody 组件一些参数 可以在 Inspector 中编辑 也可以在程序代码中使用 具体如下 Mass 物体的重量 单位是千克 不同重量的物体将产生不同的运行效果 例如 一个重的物体 撞击一个轻的物体时 轻的物体将被撞的比较远 Drag 拖力 物体运动时受到的空气阻力 值越大 物体减速越快 Angular Drag 角拖力 物体旋转时受到的阻力 值越大 物体转速减小越快 Use Gravity 物体是否具有重力 当取消时 物体受其它力影响 但重力为 0 Is Kinematic 动力学选项 只有选择上 物体才有刚体效果 Interpolate 插值选项 为了使物体在物理引擎下看起来平滑一些 可以选择 Interpolation 而 不是选择 extrapolation Freeze Rotation 冻结旋转 物体运动时不发生旋转 这有时对玩家运动有用 6 3 制作小游戏制作小游戏 为了将实践前面的分析 我们建立一个椰子投掷游戏与访问小木屋游戏结合起来 在游戏中 玩家 将得到打开小木屋所要求的最后一个电池 由于我们已经建立了开门用到的电池 所以我们删除一个电池 Delete 键 6 3 1 建立椰子预制件建立椰子预制件 现在开始学习实例化 开始建立游戏中被投掷的椰子物体 点击菜单 Game Object Create Other Sphere 在场景中建立一个简单球物体 它将显示在编辑窗口中 在 Hierarchy 窗口中选中 当鼠标在编辑窗口上时按 F 键最大化显示球 通过微调缩放参数操作来使其更接近于椰子的形状 设置 Transform 组件的组件的 Scale 值值 X 和 Z 为为 0 5 Y 为 0 6 下面我们导入本书所带的第 6 章的资源文件 CoconutGame unitypackage 它包含以下素材 一张椰子贴图 一个 十 字形贴图 四个声音片断 两个三维模型 小游戏平台和目标耙 与三维模型相关的Materials 文件夹 1 建立椰子贴图 建立椰子贴图 为了实现椰子纹理 我们需要建立一个新的材质 在 Project 面板上右击 Create 按钮 选择 Material 改名为 Coconut Skin F2 键 选中这个材质 从 Project 面板中拖放 coconut 贴图到右方的空 白方框中 如图 4 从 Project 面板中拖放 Coconut Skin 材质到场景中的球物体上 这个物体将显示贴图效果 2 2 添加物理特性 添加物理特性 由于椰子在游戏中具有真实的运动效果 我们为其添加刚体组件属性 选择椰子物体单击菜单 Component Physics Rigidbody 在组件设置中选择重力 这样椰子具有下落的效果 其它选项默认 可以在运行游戏查看椰子运动效果 3 保存为预制件 保存为预制件 椰子物体已经完成 我们将它保存为预制件以备以后多次复制 在 Project 面板选择 Prefabs 文件夹右击 Create 按钮 选择 Prefab 命名为 Coconut Prefab 拖放椰子 物体到新建的 Prefab 上 保存 删除原来的椰子物体 6 3 2 建立发射物体建立发射物体 为了让玩家能够投掷我们刚建立的椰子预制件 需要编程控制实例化物体 同时建立一个空物体来 为实例化物体提供一个空间参考点坐标 实际生活中 我们投掷一个物体是利用手臂在我们身体前方掷出物体 所以 我们应当将这个空物 体定位在身体视野外 同时这个物体能够随玩家移动 由于在 FPC 对象下有一个 Main Camera 子物体 我们可以将这个空物体定位在这个相机下面 这样它会满足我们的要求 单击菜单 GameObject Create Empty 选择新物体改名为 Launcher 在 Hierarchy 面板中展开 First Person Controller 物体 将 Launcher 物体拖放到 Main Camera 下 如图所示 5 作为 Main Camera 的子物体 Launcher 将随其移动和旋转 这时需要重新定位它与 Main Camera 的 相对位置 选择 Launcher 物体 在 Inspector 面板中选择 Transform 组件右边的小齿轮按钮 单击 Reset Position 菜单 如图所示 这时 Position 的三个值被重置为 0 设置 Launcher 子物体的位置为 0 意味着它与父物体中心对齐 当然这不是我们想要的 但这使后面 的设置更加容易 我们要改变 Launcher 的位置有两个原因 当投掷椰子时 椰子会从玩家的头部发射出去 这起来不符合实际 当我们实例化物体时 我们要确保新建立的物体不能与原来已有的物体发生碰撞 否则由于物理 引擎的作用 将影响椰子投掷的效果 为避免这种情况 我们将 Launcher 物体向右前移动一点 设置其 Positon 的 X 和 Z 值为 1 这样看起 来正是玩家右臂的位置 椰子掷出去更加自然一些 如下图 最后 为使投掷方向是向正前方 调整发射器的方向 Rotation 属性的 Y 值设置为 352 8 度 译者注 这样做会使发射方向与正前方有一个夹角 当距离较远会使玩家不好描准目标耙 增加游译者注 这样做会使发射方向与正前方有一个夹角 当距离较远会使玩家不好描准目标耙 增加游 戏难度 戏难度 6 3 3 编程实现椰子投掷编程实现椰子投掷 小游戏中我们设置当玩家按下开火键时发射椰子 为了检测用户是否按键需要每帧进行检测 可以 通过 Input Manager 来进行管理 单菜单 Edit Project Settings Input 进行输入管理器 展开找到 6 Fire1 为了玩家投掷椰子打中目标耙 我们稍后建立 必须编程实现下面两步 当按下开火键时实例化椰子物体 当椰子建立时 设置椰子刚体组件属性向前推进的初始速度 建立新的脚本文件 命名为 CoconutThrow js 1 检测玩家输入 检测玩家输入 为了实现每帧都检测玩家按键 我们要在发射器的 Update 函数中编写代码监听 Fire1 键 if Input GetButtonUp Fire1 这将监听左 Ctrl 和鼠标左键 当按键被释放时执行代码 2 播放反馈声音 播放反馈声音 射击类游戏要建立一个发射声音 在这里我们建立一个哨音代表椰子发出的声音 在程序开头建立 一个音效类型的公共变量来接受声音 在后面可以为这个变量传递声音文件 var throwSound AudioClip 然后在 if 语句后面添加播放声音的代码 audio PlayOneShot throwSound 3 实例化椰子 实例化椰子 下面我们建立真正的椰子物体 为了接受椰子预制件 我们增加公共变量代码在声音变量之后 var coconutObject Rigidbody 这个变量的类型是 Rigidbody 刚体类型 当椰子以预制件资源传递参数时 必须确保其具有刚体组件 属性 在播放声音代码下面添加如下代码 var newCoconut Rigidbody Instantiate coconutObject transform position transform rotation 这里建立一个局部变量 newCoconut 生成一个游戏对象 其中 Instantiate 的三个参数分别为 椰子 预制件 发射器的位置 发射器的角度 4 命名实例物体 命名实例物体 在运行时建立的物体自动命名为 clone 为了以后打击目标耙时判断方便 我们给椰子重新命名 7 newCoconut name coconut 5 设置速度 设置速度 游戏中我们必须实现椰子的初始速度 否则它行掉落到地上 在前面增加控制速度的公共实型变量 var throwForce float 在实例化代码后增加代码 newCoconut rigidbody velocity transform TransformDirection Vector3 0 0 throwForce 设置刚体的初始速度 其中 TransformDirection 函数功能是将局部坐标转换为世界坐标 这里将发 射器的局部坐标方向转换为世界坐标方向 实现了在世界空间运动的效果 为了确保椰子具有刚体属性 可以使类似的代码来提高程序健壮性 if newCoconut rigidbody newCoconut AddComponent Rigidbody 由于前面已经用公共变量进行了刚体限制 在此省略 6 防止碰撞 防止碰撞 为了防止刚建立的椰子与 FPC 发和碰撞 增加代码 Physics IgnoreCollision transform root collider newCoconut collider true 其中前两个参数分别为发射器的根物体 即 FPC 的碰撞盒与椰子的碰撞盒 第三个参数表示忽略 碰撞 7 包含声音组件 包含声音组件 由于发射椰子时使用了声音效果 所以增加下面的代码保证当前物体具有 AudioSource 组件 script RequireComponent AudioSource 6 3 4 脚本附加及参数赋值脚本附加及参数赋值 选中在 Hierarchy 面板中选择 Launcher 物体 单击菜单 Component Scripts Coconut Throw 增加脚 本到发射器物体 拖放投掷声音和椰子预制件给公共变量赋值 8 CoconutThrow js 程序完整程序脚本如下 var throwSound AudioClip var coconutObject Rigidbody var throwForce float function Update if Input GetButtonUp Fire1 audio PlayOneShot throwSound var newCoconut Rigidbody Instantiate coconutObject transform position transform rotation newCoconut name coconut newCoconut rigidbody velocity transform TransformDirection Vector3 0 0 throwForce Physics IgnoreCollision transform root collider newCoconut collider true script RequireComponent AudioSource 6 3 5 实例化约束及物体回收实例化约束及物体回收 在 Unity 系统中 使用预制件来实例化物体可以很方便地实现在运行时构造物体 然而 建立许多具 有刚体组件属性的物体将消耗大量的计算机资源来判断刚体与周围物体之间的碰撞 无限制地创建刚体 物体将使游戏变得越来越慢 为了不让玩家投掷过多的椰子而使游戏死掉我们做两件事 只允许玩家在指定的场景条件下才能够投掷椰子 编写脚本从场景中删除已经创建一定时间后的椰子 要通过游戏规则限制同时创建大量的实例化物体 例如开枪 可以延时上子弹来拉开创建物体时间 在上面的椰子游戏中我们要求玩家在释放按键的时候才投掷椰子 可以防止玩家按住键不放而导致大量 椰子产生 1 激活椰子投掷功能 激活椰子投掷功能 允许玩家在任何地方都可以投掷椰子是没有意义的 这里我们通过一个布尔类型的开关变量来控制 椰子的投掷 只有当玩家登上竞技台 稍后导入 时才打开开关 在脚本程序 CoconutThrow js 的开头增加代码 static var canThrow boolean false 这是一个静态变量 其它代码可以进行访问对其进行设置 为了使变量起作用 在 Update 中将代码 if Input GetButtonUp Fire1 改为 if Input GetButtonUp Fire1 else CoconutThrow canThrow false 这里我们使用碰撞盒来判断 与前面通过 tag 标记略有不同 其实用 tag 或其它方法功能也一样 2 删除椰子 删除椰子 正如前面我们讨论的那样 如果场景中的刚体物体太多 将严重影响场景的速度 在游戏中 当椰 子建立一段时间之后 我们要利用代码来删除它 建立脚本文件 CoconutTidy JS 删除默认的 删除默认的 Update 函数 函数 建立函数 Start function Start Destroy gameObject 5 这个函数在程序开始时自动运行一次 Destroy 函数要求两个参数 第一个是要删除的物体 第二个参数 表示延迟 5 秒 可以缺省 这个脚本我们将附加给椰子物体 由于场景中已经没有椰子物体 我们可以通过椰子预制件来完成 选择 Project 面板中的 Coconut 预制件 单击菜单 Component Scripts CoconutTidy 添加删除椰子 代码 用户也可以通过将预制件拖放到场景中建立物体 然后添加脚本 再重新更新预制件 但这样做比 较麻烦 建立使用前面的方式 6 3 6 添加椰子投掷平台添加椰子投掷平台 现在我们准备实现小游戏 在场景中布置平台和三个目标耙 检测目标耙与椰子之间的碰撞 判断 三个目标耙是否被同时击倒 1 1 导入设置 导入设置 在将平台和目标耙放入场景前 首先检查模型的尺寸是否合适及碰撞是否生成 平台 平台 设置缩放因子 Scale Factor 为 1 25 选中 Generate Colliders 生成碰撞 接受修改 将平台拖入场景 放在小木屋附近 如图所示 10 目标耙和椰子碰撞目标耙和椰子碰撞 目标耙模型 target 在 Project 面板和 Coconut Game 文件夹下 选择生成碰撞 Generate Colliders 缩放因子 Scale Factor 为 1 由于目标耙在被击中后会产生动作 模型动画已经在模型中制作好 我们在动画组件 Animations 中设置动画如下 接受设置 2 布局 布局 放置目标耙时 为了方便定位 我们将它作为平台的子物体 将目标耙模型从 Project 面板中 Coconut Game 文件夹中拖放到 Hierarchy 面板的 platform 模型上 当 提示选择 Prefab 连接时确定 在 Inspector 窗口设置目标耙模型的位置为 0 1 7 1 7 可以发现目标耙位置适当位置 3 椰子检测脚本 椰子检测脚本 我们编程实现椰子与目标耙之间的碰撞 建立脚本文件 CoconutCollision JS 这个文件将被附加到目 标耙盘上 建立变量 建立变量 var targetRoot GameObject private var beenHit boolean false 11 private var timer float 0 0 var hitSound AudioClip var resetSound AudioClip 说明 targetRoot 用于存储目标耙对象 beenHit存储目标耙是否被打倒 timer 存储被打倒后的时间 hitSound打击声音 resetSound复位声音 碰撞检测碰撞检测 这里我们将用到一个新的事件函数 OnCollisionEnter theObject Collision 当脚本所在的物体被碰撞 时被激活 与OnControllerColliderHit 和OnTriggerEnter 不同 这个事件是用于至少一方是刚体的碰撞中 碰撞时不会 产生 撞破 效果 参数类型是Collision 而不是 Collider Collision 包含了速度 刚体 碰撞类 碰撞对 象 碰撞点等信息 代码如下 function OnCollisionEnter theObject Collision if beenHit false targetRoot animation Play down beenHit true 程序判断只有当前物体 目标耙盘 被椰子 名称为 coconut 的物体 碰撞时 并且当前目标耙没 有被击倒时才执行相应的翻倒动作 当脚本被附加到目标耙盘时 targetRoot 和hitSound 两个公共变量要被赋值 其中 targetRoot 要赋与目 标耙根对象 这样才能找到面前设置的翻倒动画 这与小木屋开门动作类似 目标耙复位目标耙复位 按照游戏规则 当目标耙被击倒一段时间后 这里默认为 3S 自动复位 利用 Update 函数实现如下 function Update if beenHit timer Time deltaTime if timer 3 audio PlayOneShot resetSound targetRoot animation Play up beenHit false timer 0 0 其中Time deltaTime 是为了实现真实时间效果 这与小木屋关门代码类似 不再赘述 添加声音播放组件添加声音播放组件 12 script RequireComponent AudioSource 4 脚本附加 脚本附加 脚本 CoconutCollision JS 是要为目标耙盘设计的 选择目标耙盘目标耙盘 如图 单击菜单 Component Scripts CoconutCollision 添加脚本 为脚本添加参数 特别注意特别注意 Target Root 选择目标耙根物体 运行程序 测试目标耙 5 生成更多目标耙 生成更多目标耙 游戏中有三个目标耙 我们首先建立预制件 Target Prefab 将目标耙拖放到上面 利用预制件 复制两个目标耙 快捷键 Ctrl D 同样作为平台的子物体 将位置的 X 值分别设置 为 1 8 和 1 8 6 3 6 判定游戏胜利判定游戏胜利 游戏中打椰子的目的是为了得到开门用的最后一个电池 现在我们编写程序判断是否将三个目标耙 同时打倒 建立脚本文件 CoconutWin JS 这个脚本我们将赋给平台对象 变量定义 变量定义 static var targets int 0 private var haveWon boolean false var win AudioClip var battery GameObject 13 其中公共静态变量 targets 是一个计数器 记录倒下的目标耙数量 稍后我们会在脚本文件 CoconutCollision JS 中修改它的值 变量 haveWon 的值是为了判断是否已经胜利 用来防止玩家反复得利电池 另外两个变量分别用来存储胜利时播放的声音和生成奖品电池用的预制件 检测胜利 检测胜利 在Update 函数中添加如下代码 function Update if targets 3 audio PlayOneShot win Instantiate battery Vector3 transform position x transform position y 2 transform position z transform rotation haveWon true 以上程序中 首先判断记数器 targets 是否为 3 而且是否还没有胜利 成立则完成任务操作 记数器清 0 重新记数 播放胜利声音 建立奖品电池 建立位置在平台中间上方 设置 haveWon 为真 这样就不会重新进行胜利 防止玩家作弊 添加声音组件添加声音组件 script RequireComponent AudioSource 附加脚本附加脚本 将脚本添加到平台对象 添加公共变量参数胜利声音和电池预制件 加减记数器加减记数器 现在回到 CoconutCollision 脚本 增加记数 在OnCollisionEnter 函数中找到 if 结构中的语句 beenHit true 在后面添加代码 CoconutWin targets 减少记数 在 Update 中 if 结构中找到 beenHit false 在后面添加代码 CoconutWin targets 14 保存程序 运行测试游戏 在胜利后 按空格跨过栏杆 吃到电池 6 3 7 收尾工作收尾工作 为了使游戏更加美观 可以进一步润色 我们增加一个十字准星来方便投掷椰子 并增加文字提示 使其界面更加友好 1 添加十字准星 添加十字准星 为添加准星 可以完成以下操作 打开 Project 项目中的 Coconut Game 文件夹 选择 Crosshair 贴图文件 单击菜单 GameObject Create Other GUI Texture 生成一个新的 GUI Texture 命名为 Crosshair 2 开关十字准星 开关十字准星 打开 PlayerCollisions 脚本 在 OnControllerColliderHit 函数中找到如下代码 if hit collider GameObject Find mat collider CoconutThrow canThrow true 在 if 语句前添加代码 var crosshairObj GameObject GameObject Find Crosshair var crosshair GUITexture crosshairObj GetCompone
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电视购物节目制片人的策划技巧
- 法务专员合同审核与法律风险防范计划
- 初级AI新闻舆情预警师培训计划
- 宠物晶石产品工艺改进效果评估与总结
- 某地稻飞虱无人机防治作业总结报告
- 中级动物疫病防治员继续教育学习计划
- 市场营销专员工作计划及绩效考核指标
- 媒介助理协助部门项目复盘报告
- 机械工程师高级技能鉴定与实战部署安排
- 健身房新会员基础营养评估与指导计划-Basic-Nutrition-Assessment-and-Guidance-Plan-for-New-Gym-Members
- 山东省济南市历下区2024-2025学年三年级上学期期中英语试卷
- 江苏省苏州市2024-2025学年高三上学期11月期中调研数学试题(含答案)
- 绿色食品检测收费表(上海中维检测技术有限公司)
- 2024-2025学年八年级化学沪科版(五四学制)全一册上学期期末复习卷①
- 高中英语3500词(乱序版)
- DL∕T 1798-2018 换流变压器交接及预防性试验规程
- 屋顶分布式光伏发电技术交底
- 2024年海南万宁市招聘事业单位人员(第6号)历年高频考题难、易错点模拟试题(共500题)附带答案详解
- 宁波大学经济学专业培养方案及教学计划(09.9)
- 《光伏发电工程安全预评价规程》(NBT 32039-2017)
- 入厂安全告知书
评论
0/150
提交评论