54、游戏环境与玩法设置全解析

游戏环境与玩法设置详解

游戏环境与玩法设置全解析

一、游戏环境相关操作

1.1 使用掉落点运输物体

在游戏中,若要将外部物体运输到迷宫中的随机位置,可按以下步骤操作:
1. 修改 FindDropPoint 函数

function FindDropPoint (obj : GameObject, yPos : float) {
  1. FindDropPoint 函数顶部赋值
dropObject = obj; // assign the new drop object
  1. 修改 FindDropPoint 函数中的 y 位置赋值
dropObject.transform.position.y = yPos; // in case it is a different y location
  1. 修改 Start 函数中对 FindDropPoint 的调用
FindDropPoint (dropObject,dropObject.transform.position.y); // find a random location for the drop point
  1. 保存脚本

接着,修改 Transporter 脚本:
1. 打开 Transporter 脚本
2. 添加变量

var object : GameObject; // object to be transported
  1. 修改 FindDropPoint 调用行
mazeManager.FindDropPoint(object, object.transform.position.y); // find a drop point for the object
  1. 保存脚本并将 Drop Point 对象拖到新参数上
  2. 点击 Play 进行测试
  3. 更改 Drop Point 对象的高度并继续测试

1.2 调整 Transporter 脚本以适应游戏其他部分

  1. 打开 Transporter 脚本
  2. 创建存储 y 位置的变量
var yPos : float; // the y position destination in the maze
  1. 添加判断是否立即运输的变量
internal var transportAtStart : boolean = false;
  1. Start 函数中添加代码
if (transportAtStart == true) BeamMeUpScotty();
  1. 创建新函数
function BeamMeUpScotty () {
   if (yPos == 0) yPos = this.transform.position.y; // use the object's current y if none assigned
   // send this object off to be moved to a random position in the maze
   mazeManager.FindDropPoint(this.gameObject,yPos);
}
  1. 注释掉 OnMouseDown 函数和 var object
  2. 保存脚本
  3. 删除 UnityWaterMark - small 对象
  4. 点击 Play 查看 Sphere 出现的位置
  5. 禁用 Sphere Mesh Renderer Sphere Collider

1.3 处理迷宫陷阱情况

迷宫配置可能会产生封闭的方块,使得掉落点被困其中。此时有以下几种处理选项:
|选项|描述|
| ---- | ---- |
|更复杂的陷阱检查|执行更复杂的陷阱检查逻辑|
|特定距离重置|按单、单、双距离进行重置|
|增加最小被困距离|将最小被困距离增加到 20|
|允许玩家重置|允许玩家自行重置迷宫|

1.4 允许玩家重置迷宫

为了避免玩家在迷宫入口处恶意点击重置按钮,可将重置按钮放置在离迷宫一定距离的地方。同时,需要为玩家提供重置迷宫机制的线索,例如:
1. 创建迷宫入口碰撞器
- 将场景视图切换为顶视图,聚焦到离寺庙最近的入口。
- 创建一个名为 MazeFX 的立方体。
- 设置其大小为 6×6×6。
- 将碰撞器设置为 Is Trigger
- 移除 Mesh Renderer Mesh Filter 组件。
- 将视图切换为透视视图,调整 Y 位置,确保碰撞器高度能被第一人称控制器触发。
2. 添加音效
- 从组件菜单添加 Audio Source
- 选择 MazeChord 作为音频剪辑。
- 勾选 Loop
- 点击 Play 进入迷宫。
- 取消勾选 Play on Awake
3. 创建 MazeFX 脚本

function OnTriggerEnter () {
   audio.Play(); // start the sound
}
function OnTriggerExit() {
   audio.Stop(); // stop the sound
}
  1. 保存脚本并将其拖到 MazeFX 对象上
  2. 点击 Play 进出迷宫进行测试
  3. 添加混响区域
    • 选择 MazeFX 对象,从组件菜单的音频部分添加 Audio Reverb Zone 组件。
    • 点击 Play 测试预设,选择 Auditorium
    • 停止播放模式并使更改永久生效。
    • 复制 MazeFX 对象并放置在另一个迷宫入口处。

1.5 激活抽屉

将抽屉设置为动作对象,操作步骤如下:
1. 选择 DrawerMusic 对象 :从 Structures 预制体的 Group Music 中选择。
2. 创建 TriggerMusicDrawer 脚本

function OnMouseDown () {
   CloseDrawer();
}
function CloseDrawer() {
   animation.Play();
   yield new WaitForSeconds(1.75);
   audio.Play();
}
  1. 保存脚本并添加到 DrawerMusic 对象
  2. 移动第一人称控制器到音乐神社
  3. 点击 Play 并点击抽屉
  4. 必要时调整音量。
  5. 添加音频混响并选择合适的预设。
  6. 添加点光源增强效果
    • 选择 Point Light FX 对象,复制并命名为 Point Light FX2
    • 设置其强度为 3,调整位置。
    • 将其移动到 Shrine Music 对象前面,再将强度调回 0。
    • 打开 TriggerMusicDrawer 脚本,在 yield 行下方添加:
GameObject.Find("Point Light FX2").animation.Play();
- 保存脚本并测试抽屉。
  1. 将光源关联到迷宫入口
    • 打开 MazeFX 脚本,在 OnTriggerEnter 函数中添加:
GameObject.Find("Point Light FX2").animation.Play();
- 保存脚本。
- 聚焦到第一人称控制器,将新光源移动到它上面。
- 在层级视图中将光源拖到第一人称控制器上。
- 将其放置在胶囊网格中间。
- 点击 `Play` 进入迷宫测试。
  1. 使抽屉操作重置迷宫配置
    • 再次打开 TriggerMusicDrawer 脚本,在 audio.Play() 行后添加:
GameObject.Find("MazeWalls").SendMessage("ResetMaze");// reset the maze
- 保存脚本。
- 将顶视图端口聚焦到迷宫。
- 点击 `Play` 测试抽屉,观察迷宫变化。

1.6 创建“复活节彩蛋”(迷宫小地图)

创建一个迷宫小地图,当玩家按下秘密键盘键时显示,步骤如下:
1. 创建相机
- 创建一个新相机,命名为 Camera MazeView ,删除其 Audio Listener
- 将其放置在迷宫上方居中位置。
- 设置旋转为 90,300,300。
- 设置 Culling Mask 先为 Nothing ,再为 Default
- 在检查器中向上移动相机,直到在相机预览窗口中看到整个迷宫。
- 设置 Clear Flags Depth Only
- 设置投影为 Orthographic
- 设置近裁剪平面为 10,远裁剪平面为 25。
- 调整相机的 Y 位置,使迷宫和地形都显示在预览中。
- 设置(正交)大小约为 34,直到迷宫填满预览。
2. 设置相机视图端口
- 将游戏窗口设置为 Standalone
- 设置相机的 X Y 归一化矩形视口值为 0.82 和 0.72。
- 设置 W H 值为 0.15 和 0.24。
3. 点击 Play 测试 :小地图会消失,点击相机组件开关可重新显示。
4. 调整相机深度并创建脚本
- 设置相机深度为 5。
- 创建 ToggleMiniMap 脚本:

function Start () {
   //add adjustments to compensate for aspect ratio here
}
function Update () {
   if (Input.GetKeyDown("m")) { // check for m keyboard key press
      if(camera.enabled == false) camera.enabled = true;
      else camera.enabled = false;
   }
}
- 保存脚本并添加到 `Camera MazeView`,关闭相机组件。
- 点击 `Play`,通过切换 “M” 键进行测试。
- 在地图显示时,使用音乐抽屉重置迷宫。
- 保存场景和项目。

二、游戏玩法设置

2.1 完成主关卡

玩家的游戏流程大致如下:

graph LR
    A[从宝箱获取消息] --> B[阅读消息并放入库存]
    B --> C[在迷宫中寻找金色袖子]
    C --> D[乘坐木筏获取生命之水小瓶]
    D --> E[检查地球神社触发落石获取水晶]
    E --> F[用水晶和金色袖子建造激光打开寺庙]
    F --> G[在寺庙发现金色托皮果]
    G --> H[尝试拿取果实被送进迷宫与角色交谈]
    H --> I[带着线索和大石头返回寺庙拿取果实]
    I --> J[遇到第二个角色获取完成任务的知识和隧道提示]

2.2 处理阅读材料

为了让玩家能够获取、阅读和管理消息,需要进行以下操作:
1. 设置消息图标
- 选择 Message Icon
- 修改 Lookup State 1 为:

default,0,MessageView,1
- 修改 `Reply State 1` 为:
You take the Message out for a closer look.
  1. 设置原始消息
    • ActionObjects 组中选择 Message
    • 添加 Interactor 脚本(会自动添加 ObjectLookup 脚本)。
    • 按照 StateManagement PDF 填写脚本。
    • Message 标记为 ActionObject
    • 设置 Lookup State 1 为:
default,0,Message Icon,1
- 设置 `Reply State 1` 为:
You tuck the Message carefully into your pack.
  1. 创建消息视图和相机
    • 复制 Message 对象并命名为 MessageView
    • 定位 MapView 对象并聚焦,将 MessageView 移动到它那里。
    • 旋转 MessageView 匹配位置。
    • Layer 中添加用户层 10,命名为 In View
    • 创建名为 Camera View 的新相机,删除其 Audio Listener 组件。
    • 设置其 Clear Flags Depth Only Culling Mask In View ,深度为 2。
    • 使用 Align to View 调整位置,以便在游戏视图中良好显示消息。
    • Camera Inventory Camera View 的渲染路径设置为 Forward ,避免深度相关问题。
    • 选择 MessageView 对象并将其分配到新的 In View 层。
    • 点击 Play 测试在地面和库存中拾取消息。
  2. 解决关闭消息放回库存的问题
    • 停止播放模式。
    • 选择 Message Icon 对象,修改其 Lookup State 1 的元素 0 为:
default,0,MessageView,1,s1_Camera Inventory,0
- 打开 `InventoryManager` 脚本,添加函数:
function DoTheJob () {
   if(iMode) ToggleMode ();
   // activate Camera View if it wasn't already
   gameObject.Find("Camera View").camera.enabled= true;
}
- 保存脚本并禁用 `Camera View` 的相机组件。
  1. 解决消息视图拾取问题
    • 打开 Interactor 脚本,在 DistanceFromCamera() 函数顶部添加:
//fake the distance for Camera View objects
if(gameObject.layer == 10) return 1.0;
- 保存脚本并点击 `Play` 测试。
  1. 解决消息视图覆盖问题
    • 选择 MessageView 对象,启用 Camera View 的相机组件。
    • 在游戏窗口中打开 Gizmos
    • 增加 MessageView 碰撞器的大小,使其在合适的宽高比下覆盖屏幕(如 8×5×0.05)。
    • 关闭 Gizmos 并禁用相机组件。
    • 设置碰撞器为 Is Trigger
    • 点击 Play 测试点击消息视图以外的地方关闭消息。
  2. 解决打开库存时的问题
    • 打开 InventoryManager 脚本,添加函数:
function StashViewObjects () {
   //load the actionObject array from the GameManager script
   var actionObjects : GameObject[] = controlCenter.GetComponent(GameManager).actionObjects;
   for (var y : int = 0; y < actionObjects.length; y++) { // iterate through the array
      if (actionObjects[y].gameObject.layer == 10 &&      //if it is in the In View layer
         actionObjects[y].gameObject.activeInHierarchy) { // and it is active in the scene
         // process it out of scene with ObjectLookup, currently state 1, default cursor
         actionObjects[y].gameObject.GetComponent(ObjectLookup).
            LookUpState(actionObjects[y].gameObject,1,"default");
      } // close the if
   } // close the for loop
}

通过以上一系列操作,可以完善游戏的环境设置和玩法机制,为玩家提供更丰富的游戏体验。

2.3 优化阅读体验细节

为了确保玩家在阅读消息时能有更流畅和完善的体验,还需要进一步优化一些细节。以下是具体的操作步骤和相应的代码调整:

2.3.1 调整消息图标交互逻辑

在之前设置消息图标相关状态和回复的基础上,要确保消息图标与消息视图之间的交互逻辑正确。具体来说,当玩家从库存中选择消息图标时,消息视图应该正确显示,并且在关闭消息视图时,能顺利将其放回库存。

// 消息图标 Lookup State 1 设置
default,0,MessageView,1,s1_Camera Inventory,0

通过这样的设置,在选择消息图标时,不仅会激活消息视图,还会处理库存相机的状态,避免出现冲突。

2.3.2 完善库存管理脚本

InventoryManager 脚本中,已经添加了 DoTheJob 函数来处理消息视图的激活和库存模式的切换。为了进一步优化,还需要确保在不同情况下,库存和消息视图的状态能正确管理。

function DoTheJob () {
   if(iMode) ToggleMode ();
   // activate Camera View if it wasn't already
   gameObject.Find("Camera View").camera.enabled= true;
}

这个函数会在玩家查看消息时,关闭库存模式,避免干扰,同时激活相机视图来显示消息。

2.3.3 处理消息视图的距离判断

Interactor 脚本中,为了解决消息视图在特定情况下无法被拾取的问题,添加了距离判断的优化代码。

//fake the distance for Camera View objects
if(gameObject.layer == 10) return 1.0;

通过这个条件判断,对于处于 In View 层(层 10)的消息视图对象,会直接返回一个合适的距离值,确保其能被正常拾取。

2.3.4 调整消息视图碰撞器

为了让玩家在消息视图显示时,点击其他地方能正确关闭消息视图,需要调整消息视图的碰撞器。

// 调整碰撞器大小
// 选择 MessageView 对象,启用 Camera View 的相机组件
// 在游戏窗口中打开 Gizmos
// 增加 MessageView 碰撞器的大小,使其在合适的宽高比下覆盖屏幕(如 8×5×0.05)
// 关闭 Gizmos 并禁用相机组件
// 设置碰撞器为 Is Trigger

这样设置后,当玩家点击消息视图以外的区域时,碰撞器会捕获这个操作,从而关闭消息视图。

2.3.5 自动处理相机视图对象的库存管理

InventoryManager 脚本中添加 StashViewObjects 函数,用于在玩家打开库存时,自动将相机视图中的活动对象放回库存。

function StashViewObjects () {
   //load the actionObject array from the GameManager script
   var actionObjects : GameObject[] = controlCenter.GetComponent(GameManager).actionObjects;
   for (var y : int = 0; y < actionObjects.length; y++) { // iterate through the array
      if (actionObjects[y].gameObject.layer == 10 &&      //if it is in the In View layer
         actionObjects[y].gameObject.activeInHierarchy) { // and it is active in the scene
         // process it out of scene with ObjectLookup, currently state 1, default cursor
         actionObjects[y].gameObject.GetComponent(ObjectLookup).
            LookUpState(actionObjects[y].gameObject,1,"default");
      } // close the if
   } // close the for loop
}

这个函数会遍历所有活动对象,将处于 In View 层且当前活动的对象通过 ObjectLookup 脚本处理,放回库存。

2.4 总结游戏玩法设置要点

在游戏玩法设置中,玩家的主要任务流程明确,从获取初始线索到完成一系列任务,最终达成游戏目标。以下是对整个游戏玩法设置要点的总结:
|设置内容|关键操作|
| ---- | ---- |
|完成主关卡|按照特定顺序完成从宝箱获取消息、在迷宫找物品、建造激光打开寺庙等任务|
|处理阅读材料|设置消息图标、原始消息和消息视图,解决阅读和库存管理的各种问题|
|优化阅读体验|调整消息图标交互、完善库存管理、处理距离判断、调整碰撞器和自动管理库存等|

通过这些设置和优化,玩家在游戏中能够有更清晰的目标和更流畅的体验,各个环节之间的逻辑紧密相连,确保了游戏的可玩性和趣味性。

三、综合优化与最终测试

3.1 整体功能检查

在完成游戏环境和玩法的各项设置后,需要对整个游戏的功能进行全面检查。以下是检查的主要方面:
1. 物体运输功能 :检查使用掉落点运输物体是否正常,包括 FindDropPoint 函数的修改和 Transporter 脚本的调整是否生效。确保物体能正确运输到迷宫中的随机位置,且 y 位置不受影响。
2. 迷宫相关功能 :测试迷宫的陷阱处理机制,如复杂陷阱检查、重置距离设置等是否按预期工作。同时,检查玩家重置迷宫的功能,包括音乐抽屉触发迷宫重置和相关的音频、视觉线索是否正常显示。
3. 游戏玩法流程 :按照玩家的任务流程,从获取消息到完成最终目标,逐步测试每个环节是否能顺利进行。检查阅读材料的处理、物品的获取和使用等是否符合预期。
4. “复活节彩蛋”功能 :测试迷宫小地图的显示和隐藏功能,通过按下 “M” 键是否能正确切换小地图的显示状态,以及在地图显示时重置迷宫是否正常。

3.2 性能优化建议

为了提高游戏的性能和稳定性,可考虑以下优化建议:
|优化方面|建议内容|
| ---- | ---- |
|资源管理|合理管理游戏中的资源,如模型、纹理和音频文件,避免资源过度占用内存。可以采用资源压缩和按需加载的方式。|
|碰撞检测|优化碰撞检测机制,减少不必要的碰撞检测,特别是对于一些不会发生碰撞的物体,可以关闭碰撞检测功能。|
|相机设置|调整相机的参数,如裁剪平面和视野范围,避免渲染不必要的场景内容,提高渲染效率。|
|脚本优化|检查脚本代码,避免出现性能瓶颈,如循环嵌套过深、频繁的内存分配等问题。可以对代码进行性能分析和优化。|

3.3 最终测试与发布

在完成整体功能检查和性能优化后,进行最终的测试。邀请一些玩家进行试玩,收集他们的反馈意见,对发现的问题及时进行修复。在确保游戏稳定、功能正常且玩家体验良好后,就可以将游戏发布给更多的玩家。

通过以上的游戏环境设置、玩法设置、综合优化和最终测试等一系列步骤,能够打造出一个功能丰富、体验良好的游戏。各个环节的操作和代码调整都紧密围绕游戏的核心需求,为玩家提供了一个充满挑战和乐趣的游戏世界。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值