57、游戏设置全攻略:从遇见Kahmi到探索隧道

游戏设置全攻略:从遇见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. 总结与展望

通过以上详细的步骤和操作,玩家可以逐步完成游戏中的各项任务,体验完整的游戏流程。每个环节都需要仔细操作,确保各个对象和脚本的设置正确。在实际游戏开发中,开发者可以根据这些步骤和代码进行扩展和优化,例如添加更多的关卡、道具和角色,丰富游戏的内容和玩法。

同时,对于玩家来说,遵循这些操作步骤可以更顺利地通关游戏,享受游戏带来的乐趣。希望这篇攻略能为游戏开发者和玩家提供有价值的参考,让大家在游戏世界中获得更好的体验。未来,我们可以期待更多创新的游戏玩法和更丰富的游戏内容,为玩家带来全新的游戏体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值