游戏设置全攻略:从遇见Kahmi到探索隧道
在游戏中,玩家将经历一系列丰富的挑战和任务,从与Kahmi相遇,到获取光源、探索黑暗隧道等。下面将详细介绍每个阶段的具体操作和要点。
1. 遇见Kahmi
当玩家将岩石安全放入背包后,就可以用它交换金色托皮果。但要完成游戏,玩家还需与第二个NPC Kahmi交谈,她不仅能提供线索,还会为玩家打通进入隧道的道路。
在玩家获得金色托皮果之前,Kahmi不会出现,她会位于通往阳台通道对面的过道。当玩家带着托皮果下来经过门口时,会触发她向玩家移动。
具体操作步骤如下:
1. 在下层门添加Interactor(和ObjectLookup)脚本。
2. 按照StateManagement PDF填写两者的设置。
3. 在其动画组件中,勾选自动播放。
4. 聚焦下层门并点击播放,确保动画正常工作。
5. 停止播放模式,取消勾选自动播放。
6. 放置Kahmi时,将门的Z旋转设置为 -80。
7. 将Kahmi预制体拖到门内,但要确保不会被开门撞到。
8. 也将Collider Start预制体拖到场景中。
9. 将第一人称控制器和起始碰撞器分配给Kahmi的简单AI组件。
10. 在对话管理器中将Kahmi指定为元素2角色。
为防止Kahmi跟随玩家转弯并卡住,需制作一个路障:
1. 创建一个立方体并缩放至约30×1.5×0.3。
2. 将其命名为NPC_Barricade。
3. 放置它以阻挡通往出口的两条通道和进入内室的门口。
4. 从NPC Assets的Scripts文件夹中,将NPC_Barrier脚本拖到新对象上。
5. 禁用其网格渲染器组件。
6. 将Kahmi指定为目标。
7. 将门的Z旋转设置回0。
为解决路障也会阻挡第一人称控制器的问题,在NPC_Barrier脚本中添加以下Awake函数:
function Awake () {
var fpc : GameObject = GameObject.Find("First Person Controller");
// 确保第一人称控制器能穿过路障
Physics.IgnoreCollision(this.collider, fpc.collider);
}
保存脚本。
2. 激活Kahmi
Kahmi和门通过常规脚本激活:
1. 检查托皮果的ObjectLookup,将Lookup State2,Element 0更改如下:
TopiRock Icon,1,TopiRock Icon,0,TopiRock Ledge,1,Topi Fruit,0,Topi Fruit Icon,1,Kahmi,1,Door Lower,1
当金色托皮果被托皮岩石光标拾取时,托皮果和托皮岩石图标移出场景(0),托皮果图标进入背包(1),岩石留在碗中,下层门打开(1),Kahmi激活(1)。
2. 选择托皮岩石,复制它并将其从Gimbok组中移除。
3. 将其重命名为TopiRock Ledge,并将其放置在托皮果所在的碗中。
4. 缩放它使其与托皮果大小大致相同。
5. 移除刚体和托皮岩石处理组件。
6. 按照StateManagement PDF更改其数据。
7. 将托皮岩石图标的初始状态设置为1进行测试。
8. 点击播放并测试序列。
9. 尝试通过无形路障逃离Kahmi,第一人称控制器可以通过,但Kahmi经过一段时间的无用努力后会回到起始位置。
3. Kahmi的魔法
玩家与Kahmi交谈后,她会提供完成任务所需的信息,包括隧道位置和光源提示,还会清除隧道入口的障碍并为玩家创建一条通往隧道的路径。
对于被堵住的入口,需按以下步骤操作:
1. 选择岩石塞对象。
2. 添加Interactor(和ObjectLookup)脚本。
3. 将其标记为动作对象。
4. 按照StateManagement PDF调整两者的设置。
Kahmi还会照亮通往入口的路径,使用投影仪来实现:
1. 聚焦圆顶对象。
2. 从标准资产文件夹的投影仪文件夹中,将Blob Light Projector拖到场景中并覆盖圆顶。
3. 上下移动它,直到能看到投射在圆顶上的光图案。
4. 将衰减纹理替换为白色纹理,上下移动Blob Light Projector,观察光的变化。
5. 选择Cookie的光纹理,在检查器中将其环绕模式更改为重复并应用。
6. 调整投影仪查看结果。
7. 将环绕类型改回钳制并应用。
8. 将白色纹理替换为原始衰减纹理。
9. 删除Blob Light Projector。
选择通往隧道的对象并启用投影仪组件,为其添加Interactor(和ObjectLookup)脚本,标记为动作对象,并按StateManagement PDF调整设置。
在DialogueManager脚本中进行以下更改:
var rock : GameObject = GameObject.Find("Rock Plug");
rock.SetActive(false);
rock.GetComponent(Interactor). currentState= 0;
path.SetActive(true);
path.GetComponent(Interactor). currentState= 1;
添加变量:
internal var path : GameObject; // 投影仪灯光
在Awake函数中查找路径:
function Awake () {
path = GameObject.Find("Path to Tunnels");// 在路径被停用前找到它
}
保存脚本,点击播放并与Kahmi完成序列和对话,检查场景视图确保路径已开启且岩石塞已移除。
4. 隧道地图设置
在寺庙中测试时,设置最后一个线索——隧道地图:
1. 设置地图时停用地形。
2. 选择地图对象并聚焦。
3. 打开布料渲染器。
4. 点击播放并打开交互式布料组件,观察布料的状态。
5. 再次点击播放,多次打开和关闭该组件,了解其工作原理。
创建一个新脚本ToggleCloth:
var delay : float = 3; // 允许布料进入悬垂配置的时间
function Start () {
yield new WaitForSeconds(delay); // 让布料落下
GetComponent(InteractiveCloth).enabled = false; // 冻结它
}
function DoTheJob () { // 将布料降至皱折状态
GetComponent(InteractiveCloth).enabled = true;
yield new WaitForSeconds(5);
GetComponent(InteractiveCloth).enabled = false;
}
保存脚本并添加到地图对象。
地图需要三种状态:不在场景中、悬垂和皱折。为其添加Interactor(和LookupState)脚本,标记为动作对象。复制消息图标并重命名为地图图标,更改其元数据。
为地图视图添加盒子碰撞器,设置为触发器,调整其中心和缩放大小。添加Interactor(和ObjectLookup)脚本,复制消息视图对象的设置并调整元数据,确保关闭使用Alpha选项,点击播放测试地图功能。
5. 获取光源
当枯萎的植物复活时会露出一个奇怪的花粉球,它可以作为光源。在植物神龛中设置植物序列时添加以下操作:
1. 选择花朵对象并将其移动到植物神龛对象中。
2. 将其放置在中心基座顶部。
3. 选择花朵层级中的发光球,从渲染子菜单中添加灯光组件并将类型设置为点光源。
4. 设置范围为2.4,颜色为漂亮的黄色,强度为0。
5. 将光照映射设置为仅实时。
复制原始动画剪辑并进行修改:
1. 选择花朵对象,点击其lg flower revive剪辑,复制并将其重命名为flower revive new。
2. 将新剪辑移动到动画剪辑文件夹。
3. 选择花朵并将其动画剪辑元素1更改为flower revive new剪辑。
4. 也在Interactor中进行相同更改。
5. 选择花粉球对象并打开动画编辑器。
6. 选择flower revive new剪辑,打开灯光组件列表并选择强度轨道。
7. 开启记录,将时间指示器移动到2:20,点击添加关键帧。
8. 将时间指示器移动到4:00,将强度值设置为7.33。
9. 拖动时间线查看完整动画。
10. 选择花朵并将新剪辑加载到Interactor中。
关闭动画编辑器,点击播放测试花朵复活序列,将第一人称控制器向后移动以获得花朵新位置的良好视图,调整目标花朵和目标花朵观察的位置和旋转。将Light Ball Icon添加到花朵的Lookup State 1,Element 1。
聚焦第一人称控制器,创建一个新的点光源并命名为TorchLight,将其放置在主摄像机内,设置范围为20,颜色为淡黄色,强度为2,禁用灯光组件。
调整花朵的查找状态和回复状态:
1. 选择花朵,将Lookup State 1,Element 0更改为:default,1
2. 将Reply State 1,Element 0更改为:The wilted flower doesn’t respond to your prodding
3. 将Lookup State 1,Element 1更改为:Vial of Elixir Icon,2,c0_Flower,0,p0_Flower,0,Vial of Elixir Icon,0
4. 将Reply State 1,Element 1更改为:You pour the life - giving elixir over the wilted plant and watch the plant revive
5. 将Vial Animated预制体拖到场景中,位于花朵和神龛天花板中间位置,点击应用更新预制体,然后从场景中删除它。
6. 隧道探索
隧道应该足够黑暗,需要玩家获取光源才能导航。由于隧道是圆顶的一部分,查看它们比较困难:
1. 将场景视图显示模式更改为线框模式。
2. 选择地形并禁用它,使视图不那么杂乱。
3. 选择隧道并聚焦。
4. 结合地图检查隧道系统。
5. 关闭覆盖按钮以关闭灯光和天空。
6. 选择触发组以定位两个雾触发对象。
玩家从圆顶顶部的洞掉入一个小房间,然后向下穿过一个短竖井进入隧道。完成游戏时,玩家将被传送到最终关卡。
具体操作如下:
1. 将场景视图设置回纹理模式,打开地形。
2. 聚焦岩石塞并停用它。
3. 将第一人称控制器移动到圆顶顶部靠近洞的位置,点击播放。
4. 花几分钟从玩家的角度熟悉隧道布局。
隧道有两种情况:
- 玩家没有光源进入隧道,落到主层后,会有短暂时间看到开口,然后黑屏。
- 玩家有光源,则可以探索隧道,但一旦从下一个洞掉下去,将被传送到最终关卡。
为控制隧道的光照效果,创建FogManager脚本:
// 此脚本位于控制中心
var lightSource : Light; // 可打开和关闭
var lightIcon : GameObject; // 检查背包中是否有光源
var hasLight : boolean = false; // 玩家光源标志
internal var originalState : boolean; // 渲染设置中雾的状态
internal var originalColor : Color; // 保存这些以恢复
internal var originalDensity : float;
internal var darkColor : Color = Color.black;
internal var darkDensity : float = 0.06; // 如果玩家有光源
internal var darkerDensity : float = 0.2; // 如果玩家没有,使其更暗
internal var currentState : boolean = false; // 黑暗关闭
function Start () {
originalState = RenderSettings.fog; // 它是开还是关?
originalColor = RenderSettings.fogColor;
originalDensity = RenderSettings.fogDensity;
}
function InTheDark (state : boolean) { // 传入所需的雾状态,true/开,false/关
// 检查背包中是否有光源
if(lightIcon.GetComponent(Interactor).currentState > 0) hasLight = true;
else hasLight = false;
if(state && !currentState){ // 它关闭且你想打开
RenderSettings.fog = true; // 打开雾
RenderSettings.fogColor = darkColor;
RenderSettings.fogDensity = darkerDensity;
currentState = true; // 黑暗雾现在打开
if (hasLight) {
RenderSettings.fogDensity = darkDensity;// 调整光源的密度
lightSource.enabled = true; // 打开灯光
}
}
else {
if(!state && currentState){ // 它打开且你想关闭
RenderSettings.fog = originalState;
RenderSettings.fogColor = originalColor;
RenderSettings.fogDensity = originalDensity;
currentState = false; // 黑暗雾现在关闭
lightSource.enabled = false; // 关闭灯光
}
}
}
保存脚本,将其添加到控制中心对象,将TorchLight分配给光源参数,Light Ball Icon分配为光源图标。
创建ToggleFog脚本:
var darkState : boolean; // 要调用的状态
internal var controlCenter : GameObject; // 雾状态的保存者
function Start () {
controlCenter = GameObject.Find("Control Center");
}
function OnTriggerEnter() {
controlCenter.SendMessage("InTheDark", darkState);
}
保存脚本,将其添加到两个雾触发对象,在检查器中,为Fog Trigger On勾选黑暗状态,为Fog Trigger Off取消勾选。
在场景视图中切换覆盖按钮查看雾,点击播放通过隧道,注意雾状态触发时的变化。选择控制中心并将Has Light设置为true,再次通过隧道测试。
在ToggleFog脚本中添加以下变量:
var fpc : GameObject; // 第一人称控制器
var location : Transform; // 传送位置
var blackout : GameObject; // 黑屏渐变预制体
var lightIcon : GameObject; // 光源图标
var newLevel : boolean; // 标志,将玩家发送到下一级
在OnTriggerEnter函数中添加以下代码:
// 如果玩家没有光源,黑屏并重新定位
if(lightIcon.GetComponent(Interactor).currentState == 0) { // 检查背包中是否有光源
yield new WaitForSeconds(5); // 给他几秒钟时间环顾四周
Instantiate(blackout); // 开始黑屏
yield new WaitForSeconds(1); // 确保在更改任何内容之前完全黑暗
controlCenter.SendMessage("InTheDark", false); // 更新雾状态
fpc.transform.position = location.position; // 重新定位玩家
// 激活关于隧道灯光的话题,因为他现在已经去过那里
var dm : DialogueManager = gameObject.Find("Dialogue Manager").GetComponent(DialogueManager);
dm.topics_2[7] = "107" + dm.topics_2[7].Substring(4);
}
else {
// 关闭灯光并将玩家发送到最终关卡
if(newLevel) { // 在检查器中设置的标志
Instantiate(blackout);
yield new WaitForSeconds(1);
//Application.LoadLevel ("FinalLevel"); // 加载新关卡
controlCenter.SendMessage("InTheDark", false); // 临时测试用
}
}
保存脚本。选择Target Pollen Ball,复制它并命名为Target Tunnel Wakeup,将新位置点移动到隧道出口边缘附近,为雾触发对象的Toggle Fog组件分配新参数。
通过以上步骤,玩家可以逐步完成游戏中的各项任务,从与Kahmi的互动,到获取光源、探索黑暗隧道,最终体验完整的游戏流程。每个步骤都有其特定的目的和操作方法,希望这些详细的介绍能帮助玩家顺利通关游戏。
游戏设置全攻略:从遇见Kahmi到探索隧道(下半部分)
7. 隧道功能总结与优化
为了更清晰地理解隧道部分的功能和操作,我们可以通过一个表格来总结隧道的两种情况以及对应的处理逻辑:
| 玩家状态 | 进入隧道后的表现 | 处理逻辑 |
| — | — | — |
| 无光源 | 落到主层后,有短暂时间看到开口,然后黑屏,被传送到指定位置,激活隧道灯光话题 | 等待5秒,启动黑屏,更新雾状态,重新定位玩家,激活话题 |
| 有光源 | 可以探索隧道,从下一个洞掉下去后被传送到最终关卡 | 满足条件时,启动黑屏,更新雾状态 |
同时,我们可以用mermaid流程图来展示隧道功能的整体流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始进入隧道]):::startend --> B{是否有光源}:::decision
B -->|是| C(探索隧道):::process
C --> D{是否掉落第二个洞}:::decision
D -->|是| E(传送到最终关卡):::process
D -->|否| C
B -->|否| F(短暂可见后黑屏):::process
F --> G(传送到指定位置):::process
G --> H(激活隧道灯光话题):::process
8. 游戏流程回顾与注意事项
在整个游戏流程中,从遇见Kahmi到探索隧道,每个环节都紧密相连,需要玩家按照一定的顺序完成任务。以下是一些关键步骤的回顾和注意事项:
-
遇见Kahmi
:
- 确保完成获取金色托皮果的任务,Kahmi才会出现。
- 制作路障时,要正确设置脚本和参数,避免影响第一人称控制器的移动。
-
激活Kahmi
:
- 准确更改托皮果的ObjectLookup设置,确保各个对象的状态正确切换。
- 测试时注意观察Kahmi的行为和对象状态的变化。
-
Kahmi的魔法
:
- 对岩石塞和通往隧道的路径进行设置时,要严格按照步骤操作,包括脚本的添加和参数的调整。
- 测试时检查路径是否开启,岩石塞是否移除。
-
隧道地图设置
:
- 掌握交互式布料组件的使用方法,通过脚本控制地图的状态。
- 为地图视图设置碰撞器时,要确保其大小和位置合适,方便玩家与地图互动。
-
获取光源
:
- 正确设置花朵和花粉球的灯光组件和动画剪辑,确保光源在合适的时机亮起。
- 调整花朵的查找状态和回复状态时,要注意元数据的准确性。
-
隧道探索
:
- 熟悉隧道的布局和两种情况的处理逻辑,合理利用光源进行探索。
- 对FogManager和ToggleFog脚本的设置要准确,确保雾效果和传送功能正常。
9. 代码总结与复用
在游戏开发过程中,我们编写了多个脚本,这些脚本可以在其他类似的游戏场景中复用。以下是各个脚本的总结:
-
NPC_Barrier脚本
:用于创建路障并确保第一人称控制器能穿过路障。
function Awake () {
var fpc : GameObject = GameObject.Find("First Person Controller");
// 确保第一人称控制器能穿过路障
Physics.IgnoreCollision(this.collider, fpc.collider);
}
- ToggleCloth脚本 :用于控制地图的交互式布料组件,实现地图的不同状态。
var delay : float = 3; // 允许布料进入悬垂配置的时间
function Start () {
yield new WaitForSeconds(delay); // 让布料落下
GetComponent(InteractiveCloth).enabled = false; // 冻结它
}
function DoTheJob () { // 将布料降至皱折状态
GetComponent(InteractiveCloth).enabled = true;
yield new WaitForSeconds(5);
GetComponent(InteractiveCloth).enabled = false;
}
- FogManager脚本 :用于管理隧道中的雾效果,根据玩家是否有光源调整雾的状态。
// 此脚本位于控制中心
var lightSource : Light; // 可打开和关闭
var lightIcon : GameObject; // 检查背包中是否有光源
var hasLight : boolean = false; // 玩家光源标志
internal var originalState : boolean; // 渲染设置中雾的状态
internal var originalColor : Color; // 保存这些以恢复
internal var originalDensity : float;
internal var darkColor : Color = Color.black;
internal var darkDensity : float = 0.06; // 如果玩家有光源
internal var darkerDensity : float = 0.2; // 如果玩家没有,使其更暗
internal var currentState : boolean = false; // 黑暗关闭
function Start () {
originalState = RenderSettings.fog; // 它是开还是关?
originalColor = RenderSettings.fogColor;
originalDensity = RenderSettings.fogDensity;
}
function InTheDark (state : boolean) { // 传入所需的雾状态,true/开,false/关
// 检查背包中是否有光源
if(lightIcon.GetComponent(Interactor).currentState > 0) hasLight = true;
else hasLight = false;
if(state && !currentState){ // 它关闭且你想打开
RenderSettings.fog = true; // 打开雾
RenderSettings.fogColor = darkColor;
RenderSettings.fogDensity = darkerDensity;
currentState = true; // 黑暗雾现在打开
if (hasLight) {
RenderSettings.fogDensity = darkDensity;// 调整光源的密度
lightSource.enabled = true; // 打开灯光
}
}
else {
if(!state && currentState){ // 它打开且你想关闭
RenderSettings.fog = originalState;
RenderSettings.fogColor = originalColor;
RenderSettings.fogDensity = originalDensity;
currentState = false; // 黑暗雾现在关闭
lightSource.enabled = false; // 关闭灯光
}
}
}
- ToggleFog脚本 :用于触发雾状态的变化和处理玩家在隧道中的传送。
var darkState : boolean; // 要调用的状态
internal var controlCenter : GameObject; // 雾状态的保存者
function Start () {
controlCenter = GameObject.Find("Control Center");
}
function OnTriggerEnter() {
controlCenter.SendMessage("InTheDark", darkState);
}
// 后续添加的变量和逻辑
var fpc : GameObject; // 第一人称控制器
var location : Transform; // 传送位置
var blackout : GameObject; // 黑屏渐变预制体
var lightIcon : GameObject; // 光源图标
var newLevel : boolean; // 标志,将玩家发送到下一级
function OnTriggerEnter() {
// 如果玩家没有光源,黑屏并重新定位
if(lightIcon.GetComponent(Interactor).currentState == 0) { // 检查背包中是否有光源
yield new WaitForSeconds(5); // 给他几秒钟时间环顾四周
Instantiate(blackout); // 开始黑屏
yield new WaitForSeconds(1); // 确保在更改任何内容之前完全黑暗
controlCenter.SendMessage("InTheDark", false); // 更新雾状态
fpc.transform.position = location.position; // 重新定位玩家
// 激活关于隧道灯光的话题,因为他现在已经去过那里
var dm : DialogueManager = gameObject.Find("Dialogue Manager").GetComponent(DialogueManager);
dm.topics_2[7] = "107" + dm.topics_2[7].Substring(4);
}
else {
// 关闭灯光并将玩家发送到最终关卡
if(newLevel) { // 在检查器中设置的标志
Instantiate(blackout);
yield new WaitForSeconds(1);
//Application.LoadLevel ("FinalLevel"); // 加载新关卡
controlCenter.SendMessage("InTheDark", false); // 临时测试用
}
}
}
10. 总结与展望
通过以上详细的步骤和操作,玩家可以逐步完成游戏中的各项任务,体验完整的游戏流程。每个环节都需要仔细操作,确保各个对象和脚本的设置正确。在实际游戏开发中,开发者可以根据这些步骤和代码进行扩展和优化,例如添加更多的关卡、道具和角色,丰富游戏的内容和玩法。
同时,对于玩家来说,遵循这些操作步骤可以更顺利地通关游戏,享受游戏带来的乐趣。希望这篇攻略能为游戏开发者和玩家提供有价值的参考,让大家在游戏世界中获得更好的体验。未来,我们可以期待更多创新的游戏玩法和更丰富的游戏内容,为玩家带来全新的游戏体验。
超级会员免费看

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



