游戏环境与玩法设置全解析
一、游戏环境相关操作
1.1 使用掉落点运输物体
在游戏中,若要将外部物体运输到迷宫中的随机位置,可按以下步骤操作:
1.
修改
FindDropPoint
函数
:
function FindDropPoint (obj : GameObject, yPos : float) {
-
在
FindDropPoint函数顶部赋值 :
dropObject = obj; // assign the new drop object
-
修改
FindDropPoint函数中的y位置赋值 :
dropObject.transform.position.y = yPos; // in case it is a different y location
-
修改
Start函数中对FindDropPoint的调用 :
FindDropPoint (dropObject,dropObject.transform.position.y); // find a random location for the drop point
- 保存脚本 。
接着,修改
Transporter
脚本:
1.
打开
Transporter
脚本
。
2.
添加变量
:
var object : GameObject; // object to be transported
-
修改
FindDropPoint调用行 :
mazeManager.FindDropPoint(object, object.transform.position.y); // find a drop point for the object
-
保存脚本并将
Drop Point对象拖到新参数上 。 -
点击
Play进行测试 。 -
更改
Drop Point对象的高度并继续测试 。
1.2 调整
Transporter
脚本以适应游戏其他部分
-
打开
Transporter脚本 。 -
创建存储
y位置的变量 :
var yPos : float; // the y position destination in the maze
- 添加判断是否立即运输的变量 :
internal var transportAtStart : boolean = false;
-
在
Start函数中添加代码 :
if (transportAtStart == true) BeamMeUpScotty();
- 创建新函数 :
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);
}
-
注释掉
OnMouseDown函数和var object行 。 - 保存脚本 。
-
删除
UnityWaterMark - small对象 。 -
点击
Play查看Sphere出现的位置 。 -
禁用
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
}
-
保存脚本并将其拖到
MazeFX对象上 。 -
点击
Play进出迷宫进行测试 。 -
添加混响区域
:
-
选择
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();
}
-
保存脚本并添加到
DrawerMusic对象 。 - 移动第一人称控制器到音乐神社 。
-
点击
Play并点击抽屉 。 - 必要时调整音量。
- 添加音频混响并选择合适的预设。
-
添加点光源增强效果
:
-
选择
Point Light FX对象,复制并命名为Point Light FX2。 - 设置其强度为 3,调整位置。
-
将其移动到
Shrine Music对象前面,再将强度调回 0。 -
打开
TriggerMusicDrawer脚本,在yield行下方添加:
-
选择
GameObject.Find("Point Light FX2").animation.Play();
- 保存脚本并测试抽屉。
-
将光源关联到迷宫入口
:
-
打开
MazeFX脚本,在OnTriggerEnter函数中添加:
-
打开
GameObject.Find("Point Light FX2").animation.Play();
- 保存脚本。
- 聚焦到第一人称控制器,将新光源移动到它上面。
- 在层级视图中将光源拖到第一人称控制器上。
- 将其放置在胶囊网格中间。
- 点击 `Play` 进入迷宫测试。
-
使抽屉操作重置迷宫配置
:
-
再次打开
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.
-
设置原始消息
:
-
从
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.
-
创建消息视图和相机
:
-
复制
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测试在地面和库存中拾取消息。
-
复制
-
解决关闭消息放回库存的问题
:
- 停止播放模式。
-
选择
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` 的相机组件。
-
解决消息视图拾取问题
:
-
打开
Interactor脚本,在DistanceFromCamera()函数顶部添加:
-
打开
//fake the distance for Camera View objects
if(gameObject.layer == 10) return 1.0;
- 保存脚本并点击 `Play` 测试。
-
解决消息视图覆盖问题
:
-
选择
MessageView对象,启用Camera View的相机组件。 -
在游戏窗口中打开
Gizmos。 -
增加
MessageView碰撞器的大小,使其在合适的宽高比下覆盖屏幕(如 8×5×0.05)。 -
关闭
Gizmos并禁用相机组件。 -
设置碰撞器为
Is Trigger。 -
点击
Play测试点击消息视图以外的地方关闭消息。
-
选择
-
解决打开库存时的问题
:
-
打开
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 最终测试与发布
在完成整体功能检查和性能优化后,进行最终的测试。邀请一些玩家进行试玩,收集他们的反馈意见,对发现的问题及时进行修复。在确保游戏稳定、功能正常且玩家体验良好后,就可以将游戏发布给更多的玩家。
通过以上的游戏环境设置、玩法设置、综合优化和最终测试等一系列步骤,能够打造出一个功能丰富、体验良好的游戏。各个环节的操作和代码调整都紧密围绕游戏的核心需求,为玩家提供了一个充满挑战和乐趣的游戏世界。
游戏环境与玩法设置详解
超级会员免费看
2040

被折叠的 条评论
为什么被折叠?



