游戏设置全解析:从激光激活到角色交互
在游戏开发过程中,为玩家打造一个丰富且充满挑战的游戏体验是至关重要的。以下将详细介绍一系列游戏设置步骤,包括激光设备的激活、场景交互以及角色的特殊事件处理等内容。
激光设备激活与场景交互
要让玩家进入寺庙,首先需放下寺庙台阶。当玩家能将套筒套在水晶上组装激光时,就可进行以下操作:
1.
选择并设置寺庙台阶对象
:
- 选择
TempleStairs
对象,取消勾选
Play Automatically
。
2.
定义激光目标
:
- 打开
Laser
脚本,添加以下变量:
var target : GameObject; // target for the lazer to do something when it hits this
var actionObject : GameObject; // object whose animation must be triggered
internal var triggered : boolean = false; // flag to prevent multiple triggers
- 在 `Raycast` 条件语句中,修改 `if(hitParticles` 行,添加正确目标的条件:
if (hitParticles && hit.transform.name == target.name) {
- 目标为 `StairLock` 对象,动画对象为 `TempleStairs` 组。在销毁粒子系统预制体的代码行下方添加:
if (!triggered) DoTheJob();
triggered = true; // set the flag to prevent more triggers
- 创建处理细节的函数:
function DoTheJob () {
actionObject.animation.Play(); // drop the stairs
}
- 保存脚本,选择 `Crystal with Sleeve` 对象,分配 `StairLock` 为目标,`TempleStairs` 为动作对象。
-
更新图标和脚本设置
:
-
将
Golden Sleeve Icon的Lookup State 1, Element 1更改为default,0,Crystal with Sleeve,1,s1_Camera Inventory,0。 -
激活
Gear Handler,选择Crystal with Sleeve对象,添加Interactor和ObjectLookup脚本,并按StateManagement PDF填写,标记为ActionObject。 -
点击
Play进行测试,手动激活Crystal with Sleeve并用激光束击中目标,台阶应按提示落下。重新启动Play模式,收集场景中的两个组件对象,在库存中组合以激活激光设备。
-
将
解决激光穿墙问题
在迷宫中,激光设备过近时会穿墙,可通过创建专门相机解决:
1.
创建武器相机
:
- 将
Crystal with Sleeve
的初始状态暂时改为 1。
- 在用户层 11 创建新层,命名为
Weapons
。
- 复制
Main Camera
,命名为
Camera Weapons
,删除其子对象,移除
MouseLook
脚本和
Audio Listener
。
- 设置其清除标志为
Depth Only
,剔除遮罩为
Weapons
,深度为 1。
- 将新相机拖到
Main Camera
上,取消
Main Camera
剔除遮罩中的
Weapons
。
- 将
Weapons
层分配给
Crystal with Sleeve
对象。
- 点击
Play
测试,手动打开设备并靠近墙壁,此时
Crystal with Sleeve
应保持可见。
处理玩家与楼梯的碰撞问题
为防止玩家在楼梯落下时被挤压,需设置碰撞器:
1.
设置碰撞器
:
- 选择
TempleBlocker
对象,打开其
Mesh Renderer
和
Box Collider
查看位置,然后移除或禁用
Mesh Renderer
,将其层设置为
Default
。
- 点击
Play
测试,玩家和激光会被阻挡。将
Temple Blocker
分配到
Ignore Raycast
层,再次测试,激光可穿过,但玩家无法靠近。
2.
完善激光和玩家处理
:
- 在
Laser
脚本中添加新变量:
var templeBlocker : Collider; // prevent player from standing under stairs
var fpc : Transform; // first person controller
- 在 `DoTheJob` 函数中添加:
templeBlocker.collider.enabled = false; // disable blocker
// wait until the animation is almost done
yield new WaitForSeconds(actionObject.animation.clip.length - 0.05);
GetComponent(Laser).enabled = false; // disable the laser script
hitLight.gameObject.SetActive(false); // deactivate laser light
laser.gameObject.SetActive(false); // kill the line renderer
fpc.position.y = fpc.position.y + 0.1; // "bump" the player up a bit
//animation.Play(); // kill the crystal color
- 为 `Crystal with Sleeve` 分配 `Temple Blocker` 和 `First Person Controller` 参数,点击 `Play` 测试。
-
改变水晶颜色
:
-
选择
Crystal with Sleeve,在动画视图中打开,创建新剪辑dead crystal。 -
打开
Crystal (Material),开启录制按钮,选择Color.r, .g 和 .b轨道,移动时间指示器添加关键帧,将材质颜色改为黑色,设置循环为Once。 -
关闭动画视图,在检查器中取消勾选
Play Automatically,确保dead crystal为默认动画。 -
在
Laser脚本中取消注释动画行:
-
选择
animation.Play(); // kill the crystal color
- 保存脚本并测试。
-
设置水晶状态
:
-
选择
Crystal with Sleeve,按StateManagement PDF更改ObjectLookup和Interactor元数据。 -
设置
Lookup State 2, Element 0为default,0,Spent Crystal Icon,1,Reply State 2, Element 0为You stuff the spent laser device carelessly into your pack.。 -
创建
QuickChange脚本,添加以下代码到Start函数:
-
选择
yield;
if (GetComponent(Interactor).currentState == 2){
renderer.materials[1].color = Color.black;
GameObject.Find("TempleBlocker").collider.enabled = false; // disable blocker
GetComponent(Laser).enabled = false; // disable the laser script
GameObject.Find("Laser Light").SetActive(false); // deactivate laser light
GameObject.Find("Laser").SetActive(false); // kill the line renderer
}
- 保存脚本并添加到 `Crystal with Sleeve` 对象。
-
将
StairLock设为动作对象 :-
选择
StairLock对象,设置标签为Action Object,添加Interactor和ObjectLookup脚本,按StateManagement PDF填写元数据。 -
设置名称为
Key Glyph,选择Stair Drop剪辑,拖动TempleStairs到Ani Object参数。 -
设置
Lookup State 1和Reply State 1大小为 1,添加相应元素。 -
打开
Laser脚本,将if (!triggered) DoTheJob();替换为:
-
选择
if (!triggered) {
// call the target's LookupState function, send its current state, 1, and tell it the default
cursor was the picker
target.GetComponent(ObjectLookup).LookUpState(target,1,"default");
}
- 保存脚本,点击 `Play` 测试,选择 `Crystal with Sleeve`,将初始状态改回 0,保存场景和项目。
与 Gimbok 相遇及相关设置
玩家进入寺庙后,试图拿走黄金托皮果会被传送到迷宫与 Gimbok 对话,以下是相关设置:
1.
设置托皮果脚本
:
- 选择
Topi Fruit
对象,添加
Interactor
和
ObjectLookup
脚本,按
StateManagement PDF
设置。
- 创建
TopiMagic
脚本,添加以下变量:
var crossfade : GameObject; // the crossfade prefab
var mazeCharacter : GameObject; // want character not parent
var fpc : GameObject; // the first person controller
var fpcWaypoint : GameObject; // the placeholder
internal var maze : GameObject; // object with MazeManager script, MazeWalls
var mazeSound : AudioClip;
var terrain : GameObject; // to be able to reset the terrain
internal var terrainPosY : float; // original y position
- 添加 `Start` 函数:
function Start () {
terrain = GameObject.Find("Terrain");
terrainPosY = terrain.transform.position.y ; // get terrain y pos
}
- 创建 `DoTheJob` 函数:
function DoTheJob () {
// activate and update character's state
mazeCharacter.SetActive(true);
mazeCharacter.GetComponent(Interactor).currentState = 1;
// reset maze
var mazeManager : MazeManager = GameObject.Find("Maze Walls").GetComponent(MazeManager);
mazeManager.ResetMaze(); // scramble the maze
// make sure the way out from Gimbok character is open,
// 100 value is trapLimit to clear more than 4 wall trap
mazeManager.CheckDropPoint(mazeCharacter,100.00);
// raise terrain
terrain.transform.position.y = terrainPosY;
// cue the twirl effect
//GameObject.Find("Camera Weapon").camera.animation.Play();
AudioSource.PlayClipAtPoint(mazeSound,fpc.transform.position); // play at character's position
Instantiate(crossfade);
yield new WaitForSeconds(1.5);
// move player
fpc.transform.position = fpcWaypoint.transform.position;
fpc.transform.rotation.eulerAngles.y = 130.0; // hard code to face npc
}
- 保存脚本并添加到 `Topi Fruit` 对象。
-
设置 Gimbok 和第一人称控制器位置
:
-
更改场景视图为等轴顶视图,选择
DropPoint16,拖动Gimbok Prefab到层次视图,分配第一人称控制器为目标,移动Gimbok Group到DropPoint16,设置 Y 位置为 56.3。 - 创建立方体,移动第一人称控制器到指定位置,设置 Y 旋转为 130,检查游戏视图,调整值后保存脚本,删除立方体。
-
确保第一人称控制器略高于地面,创建空游戏对象
FPC Waypoint,确保位置匹配。 -
选择
Topi Fruit,拖动适当对象到Topi Magic组件参数。
-
更改场景视图为等轴顶视图,选择
-
使用图像效果(仅限 Unity Pro)
:
-
若有 Pro 版,导入
Image Effect (Pro Only)包,选择Camera Weapon,设置渲染路径为Forward,添加Vortex效果。 -
打开动画窗口,创建新剪辑
twirly,录制并添加关键帧,设置角度值,保存并设置为默认动画,取消勾选Play Automatically。 -
打开
TopiMagic脚本,若有 Pro 版,取消注释相机行,保存脚本,定位第一人称控制器,点击Play测试。
-
若有 Pro 版,导入
获取岩石及相关设置
Gimbok 会变出托皮大小的岩石供玩家替代黄金托皮,以下是操作步骤:
1.
设置托皮岩石
:
- 选择
Gimbok
,复制
Rock
并重命名为
Topi Rock
,移除组,移动到托盘中心,缩放至 0.5 - 0.6,更改碰撞器,添加刚体组件,拖动到合适位置。
- 选择托盘添加盒形碰撞器,选择
Gimbok
减小碰撞器半径,点击
Play
测试。
- 停止
Play
模式,选择
Topi Rock
,拖动到
Gimbok Group
。
- 设置
Interactor
和
ObjectLookup
,添加相应元素。
2.
创建处理脚本
:
- 创建
TopiRockHandler
脚本,创建处理函数:
function DoTheJob () {
yield new WaitForSeconds(0.5); // allow the rock to drop and settle
rigidbody.isKinematic = true; // turn off regular physics
}
- 保存脚本,添加到 `Topi Rock` 对象,填写参数。
-
调用处理函数
:
-
打开
DialogueManager脚本,添加变量:
-
打开
var topiRock : GameObject;// the rock will require activating
- 在 `SpecialInstructions` 函数中添加:
topiRock.SetActive(true); //activate the rock
topiRock.SendMessage("ProcessObject",1); //trigger the action
- 保存脚本,分配 `topi rock` 到新参数,分配 `Gimbok` 为角色,点击 `Play` 测试。
-
解决碰撞问题
:
-
打开
TopiRockHandler脚本,添加变量:
-
打开
var gimbok : Collider; // required for collision ignore
- 在 `Start` 函数中添加:
// make sure the rock can drop to the tray
Physics.IgnoreCollision(this.collider, gimbok);
- 保存脚本,分配 `Gimbok` 到参数,点击 `Play` 测试。
-
设置 Gimbok 初始状态
:
-
将
Gimbok的初始状态改为 0,点击Play测试。
-
将
通过以上步骤,可完成游戏中激光设备激活、场景交互、与角色相遇及获取物品等功能的设置,为玩家带来丰富的游戏体验。
graph LR
A[选择 TempleStairs 对象] --> B[取消勾选 Play Automatically]
B --> C[打开 Laser 脚本]
C --> D[添加变量]
D --> E[修改 Raycast 条件语句]
E --> F[添加 DoTheJob 调用]
F --> G[创建 DoTheJob 函数]
G --> H[保存脚本]
H --> I[选择 Crystal with Sleeve 对象]
I --> J[分配目标和动作对象]
J --> K[更新图标设置]
K --> L[激活 Gear Handler]
L --> M[添加脚本并设置]
M --> N[点击 Play 测试]
| 操作步骤 | 详细内容 |
|---|---|
| 选择并设置寺庙台阶对象 |
选择
TempleStairs
对象,取消勾选
Play Automatically
|
| 定义激光目标 |
打开
Laser
脚本,添加变量,修改条件语句,添加调用和函数
|
| 更新图标和脚本设置 |
更新图标元素,激活
Gear Handler
,添加脚本并按
StateManagement PDF
设置
|
| 测试 |
点击
Play
进行测试,手动激活并击中目标
|
游戏设置全解析:从激光激活到角色交互(续)
游戏功能细节优化与完善
在完成了前面的一系列基础设置后,我们还需要对游戏的一些细节进行优化和完善,以确保游戏的流畅性和趣味性。
激光充电与状态管理优化
虽然在当前设置中激光使用后水晶颜色变黑表示耗尽,但如果要实现激光充电功能,可以通过设置动画剪辑速度为 -1 来使动画倒放。这为游戏增加了更多的可玩性和策略性,玩家可以思考如何合理利用激光的充电机制来推进游戏进程。
同时,对于激光的状态管理,我们已经通过一系列脚本和参数设置来实现了激光的激活、使用和禁用等操作。在后续的开发中,可以进一步优化状态管理机制,例如添加更多的状态标识,方便在游戏的不同阶段对激光进行精确控制。
场景交互的逻辑优化
在玩家与场景中的各种对象进行交互时,可能会出现一些逻辑上的问题。例如,在玩家拿走托皮果后被传送到迷宫,这个过程中的场景切换和角色位置调整需要确保逻辑清晰和流畅。可以通过添加更多的过渡动画或者提示信息,让玩家更好地理解游戏的流程和规则。
另外,对于迷宫的重置和布局调整,也可以根据玩家的游戏进度和表现进行动态调整,增加游戏的挑战性和随机性。
脚本代码的优化与扩展
在游戏开发中,脚本代码的优化和扩展是非常重要的。以下是一些可以考虑的优化和扩展方向:
脚本复用与模块化
将一些通用的功能封装成独立的脚本模块,例如碰撞检测、动画控制等,这样可以提高代码的复用性和可维护性。在需要使用这些功能时,只需要调用相应的模块即可,避免了代码的重复编写。
事件驱动机制
引入事件驱动机制,当游戏中发生特定事件时,自动触发相应的脚本逻辑。例如,当玩家击中目标、拿到物品或者完成特定任务时,触发相应的动画、音效或者状态改变等操作。这样可以使游戏的逻辑更加清晰,代码更加易于管理。
性能优化
对脚本代码进行性能优化,避免出现性能瓶颈。例如,减少不必要的循环和计算,合理使用内存和资源等。可以通过性能测试工具来检测代码的性能问题,并进行针对性的优化。
游戏测试与调试
在完成了所有的设置和优化后,需要对游戏进行全面的测试和调试,确保游戏的稳定性和可玩性。
功能测试
对游戏的各项功能进行逐一测试,包括激光的发射和击中效果、楼梯的下落、角色的传送和移动、物品的获取和使用等。确保每个功能都能正常工作,没有明显的漏洞和错误。
兼容性测试
测试游戏在不同的设备和平台上的兼容性,包括不同的操作系统、分辨率和硬件配置等。确保游戏在各种环境下都能正常运行,并且保持良好的性能和用户体验。
用户反馈收集
邀请一些玩家进行试玩,并收集他们的反馈意见。根据玩家的反馈,对游戏进行进一步的优化和改进,以满足玩家的需求和期望。
总结与展望
通过以上一系列的设置和优化,我们完成了游戏中从激光激活到角色交互等多个重要功能的实现。在这个过程中,我们涉及了脚本编写、场景设置、动画控制、碰撞检测等多个方面的知识和技术。
未来,我们可以继续对游戏进行扩展和完善,例如添加更多的关卡和任务、丰富角色的技能和属性、增加更多的交互元素和游戏玩法等。同时,不断优化游戏的性能和用户体验,使游戏更加精彩和吸引人。
graph LR
A[激光充电优化] --> B[设置动画剪辑速度为 -1]
C[场景交互优化] --> D[添加过渡动画和提示信息]
D --> E[动态调整迷宫布局]
F[脚本代码优化] --> G[脚本复用与模块化]
G --> H[事件驱动机制]
H --> I[性能优化]
J[游戏测试] --> K[功能测试]
K --> L[兼容性测试]
L --> M[用户反馈收集]
M --> N[游戏优化改进]
| 优化方向 | 具体操作 |
|---|---|
| 激光充电与状态管理优化 | 设置动画剪辑速度为 -1 实现充电动画倒放,优化状态管理机制 |
| 场景交互的逻辑优化 | 添加过渡动画和提示信息,动态调整迷宫布局 |
| 脚本代码的优化与扩展 | 脚本复用与模块化,引入事件驱动机制,进行性能优化 |
| 游戏测试与调试 | 功能测试、兼容性测试,收集用户反馈并进行优化改进 |
通过以上的优化和完善,我们可以打造出一个更加精彩和完善的游戏,为玩家带来更好的游戏体验。
超级会员免费看
10

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



