Files
Cielonos/docs/动作游戏3C设计理论.md
2026-04-18 13:57:19 -04:00

783 lines
23 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 动作游戏3C设计理论
## 什么是3C
3C是动作游戏开发中最核心的概念指的是
- **Character角色**: 游戏角色的外观、动画和动作
- **Camera摄像机**: 玩家观察和体验游戏世界的视角
- **Control操控**: 玩家输入与角色响应之间的交互
这三点直接影响玩家的**手感**、**沉浸感**和**游戏体验**。
---
## 一、Character角色设计原则
### 1.1 角色基础属性
#### 1.1.1 移动参数
```csharp
public class CharacterMovementConfig
{
// 速度参数
public float walkSpeed = 3.0f; // 行走速度
public float runSpeed = 7.0f; // 奔跑速度
public float sprintSpeed = 10.0f; // 冲刺速度
// 加减速
public float acceleration = 10.0f; // 加速率
public float deceleration = 15.0f; // 减速率
public float turnSpeed = 10.0f; // 转身速度
// 跳跃参数
public float jumpForce = 8.0f; // 跳跃力度
public float gravity = 20.0f; // 重力
public float airControl = 0.3f; // 空中控制力
}
```
#### 1.1.2 动作时间参数
```csharp
public class CharacterTimingConfig
{
// 闪避
public float dodgeDuration = 0.3f; // 闪避持续时间
public float dodgeInvincibleTime = 0.2f; // 无敌时间
public float dodgeDistance = 5.0f; // 闪避距离
// 格挡
public float blockDuration = 0.5f; // 格挡持续时间
public float perfectBlockWindow = 0.1f; // 完美格挡窗口
public float blockAngle = 90.0f; // 格挡角度
// 攻击
public float lightAttackDuration = 0.2f; // 轻攻击时间
public float heavyAttackDuration = 0.4f; // 重攻击时间
public float attackRecoveryTime = 0.3f; // 攻击后摇
}
```
### 1.2 动作动画原则
#### 1.2.1 动画分层
```
底层Base Layer: 基础移动(站立、行走、奔跑)
中层Mid Layer: 上半身动作(攻击、格挡、交互)
顶层Top Layer: 特殊动作(受击、特殊技能)
```
#### 1.2.2 动画混合原则
1. **优先级明确**: 攻击 > 防御 > 移动
2. **过渡平滑**: 使用混合树避免动作跳变
3. **层级隔离**: 不同层级动画互不干扰
4. **符合物理**: 动画应该符合人体运动规律
---
## 二、Camera摄像机设计原则
### 2.1 第三人称视角参数
#### 2.1.1 基础参数
```csharp
public class ThirdPersonCameraConfig
{
// 位置参数
public float distance = 8.0f; // 距离
public float height = 3.0f; // 高度
public float horizontalOffset = 0.5f; // 水平偏移
public float verticalOffset = 1.5f; // 垂直偏移
// 角度参数
public float minPitch = -30.0f; // 最小仰角
public float maxPitch = 60.0f; // 最大俯角
public float rotationSpeed = 3.0f; // 旋转速度
// FOV
public float normalFOV = 50.0f; // 正常视野
public float sprintFOV = 60.0f; // 冲刺视野
public float aimFOV = 35.0f; // 瞄准视野
}
```
#### 2.1.2 视角距离分段
```
极近距离Close Range: 3-5 单位
├── 适用场景: 潜行、近战
└── 优点: 强调紧张感
标准距离Normal Range: 6-8 单位
├── 适用场景: 普通战斗、探索
└── 优点: 平衡视野和代入感
远距离Far Range: 10-15 单位
├── 适用场景: 观察环境、远程战斗
└── 优点: 最大视野
战术距离Tactical Range: 15-25 单位
├── 适用场景: 战术规划、大战场
└── 优点: 战略视角
```
### 2.2 摄像机跟随系统
#### 2.2.1 位置跟随
```csharp
public class CameraFollowSettings
{
// 位置平滑
public bool usePositionSmoothing = true;
public float positionSmoothSpeed = 5.0f; // 位置平滑速度
public float positionDeadzone = 0.1f; // 位置死区
// 碰撞
public bool enableCollision = true;
public float collisionRadius = 0.3f; // 碰撞半径
public LayerMask collisionLayers; // 碰撞层
// 躲避
public bool enableDodge = true;
public float dodgeSpeed = 10.0f; // 躲避速度
public float returnSpeed = 3.0f; // 返回速度
}
```
#### 2.2.2 旋转跟随
```csharp
public class CameraRotationSettings
{
// 旋转平滑
public bool useRotationSmoothing = true;
public float rotationSmoothSpeed = 8.0f; // 旋转平滑速度
// 角度限制
public bool limitVerticalAngle = true;
public float minPitch = -30.0f; // 最小俯仰角
public float maxPitch = 60.0f; // 最大俯仰角
// 自动校准
public bool enableAutoRecenter = true;
public float recenterDelay = 1.5f; // 校准延迟
public float recenterSpeed = 5.0f; // 校准速度
}
```
### 2.3 摄像机震动系统
#### 2.3.1 震动类型
```
┌─────────────────────────────────────────────────────┐
│ 震动类型矩阵 │
├──────────────┬──────────────┬──────────────────────┤
│ 类型 │ 频率 │ 用途 │
├──────────────┼──────────────┼──────────────────────┤
│ 手持震动 │ 高频(10-30Hz)│ 武器后坐力、脚步 │
│ 冲击震动 │ 中频(5-15Hz) │ 爆炸、撞击 │
│ 慢速震动 │ 低频(1-5Hz) │ 大规模爆炸、地震 │
│ 震动偏移 │ 极低频(<1Hz) │ 角色移动视角晃动 │
└──────────────┴──────────────┴──────────────────────┘
```
#### 2.3.2 震动参数配置
```csharp
public class CameraShakeConfig
{
// 基础震动
public float shakeDuration = 0.2f; // 震动持续时间
public float shakeIntensity = 1.0f; // 震动强度
// 旋转震动
public Vector3 rotationShake = new Vector3(1f, 1f, 0.5f);
// 位移震动
public Vector3 positionShake = new Vector3(0.5f, 0.3f, 0.2f);
// 衰减曲线
public AnimationCurve shakeCurve;
}
// 震动预设
public class CameraShakePresets
{
public static CameraShakeConfig LightHit => new CameraShakeConfig
{
shakeDuration = 0.1f,
shakeIntensity = 0.3f,
rotationShake = new Vector3(2f, 1f, 0.5f)
};
public static CameraShakeConfig HeavyHit => new CameraShakeConfig
{
shakeDuration = 0.3f,
shakeIntensity = 1.0f,
rotationShake = new Vector3(5f, 3f, 2f)
};
public static CameraShakeConfig Explosion => new CameraShakeConfig
{
shakeDuration = 0.5f,
shakeIntensity = 2.0f,
rotationShake = new Vector3(8f, 5f, 3f)
};
}
```
### 2.4 特殊视角模式
#### 2.4.1 锁定目标视角
```
锁定目标相机 (Lock-On Camera)
├── 特点: 主角朝向敌人,相机跟随敌人
├── 优点: 便于观察敌人动作
├── 适用: 近战动作游戏、Boss战
└── 实现:
├── 相机看向目标
├── 主角自动转向目标
└── 保留闪避时的相机跟随
```
#### 2.4.2 自由视角
```
自由视角相机 (Free Look Camera)
├── 特点: 相机独立于主角方向
├── 优点: 灵活观察周围环境
├── 适用: 探索、潜行、观察
└── 实现:
├── 相机与主角方向分离
├── 支持360度旋转
└── 主角朝向跟随移动方向
```
#### 2.4.3 电影视角
```
电影相机 (Cinematic Camera)
├── 特点: 预设相机路径,自动播放
├── 优点: 增强演出效果
├── 适用: 过场动画、Boss登场、技能特写
└── 实现:
├── 路径关键帧
├── 焦点跟随
└── 景深变化
```
### 2.5 摄像机FOV系统
#### 2.5.1 FOV动态调整
```csharp
public class FOVSettings
{
// 基础FOV
public float baseFOV = 50.0f;
// 速度感FOV
public float sprintFOV = 60.0f;
public float sprintFOVSpeed = 8.0f;
// 瞄准FOV
public float aimFOV = 35.0f;
public float aimFOVSpeed = 10.0f;
// 特殊技能FOV
public float ultimateFOV = 70.0f;
public float ultimateFOVSpeed = 5.0f;
}
```
#### 2.5.2 FOV调整时机
```
时机 FOV变化 速度
───────────────────────────────────────────
正常移动 50° -
奔跑加速 50° → 60° 快速(0.3s)
全力冲刺 60° → 70° 中速(0.5s)
瞄准 50° → 35° 快速(0.2s)
释放大招 50° → 70° 慢速(0.8s)
受到重伤 轻微震动 即时
```
### 2.6 遮挡处理系统
#### 2.6.1 遮挡类型
```
1. 透明化处理 (Fade)
└── 遮挡物渐变透明,保持视野
2. 相机躲避 (Dodge)
└── 相机自动移动到安全位置
3. 快速推近 (Push In)
└── 相机快速推向角色,减少遮挡
4. 目标穿透 (Through)
└── 相机看向目标时穿透遮挡物
```
#### 2.6.2 透明化参数
```csharp
public class OcclusionFadeConfig
{
// 触发条件
public float fadeStartDistance = 1.0f; // 开始距离
public float fadeEndDistance = 3.0f; // 结束距离
// 透明效果
public float fadeTargetAlpha = 0.3f; // 目标透明度
public float fadeSpeed = 8.0f; // 淡出速度
public float recoveryDelay = 0.2f; // 恢复延迟
public float recoverySpeed = 3.0f; // 恢复速度
// 检测射线
public int rayCount = 5; // 射线数量
public float rayRadius = 0.2f; // 球形检测半径
}
```
---
## 三、Control操控设计原则
### 3.1 输入设计
#### 3.1.1 输入映射
```csharp
public class InputMapping
{
// 移动
public InputAction moveAction; // WASD/摇杆移动
// 视角
public InputAction lookAction; // 鼠标/右摇杆视角
// 动作
public InputAction jumpAction; // 跳跃 (Space)
public InputAction sprintAction; // 冲刺 (Shift)
public InputAction dodgeAction; // 闪避 (Ctrl/V)
// 战斗
public InputAction attackAction; // 攻击 (LMB/Trigger)
public InputAction heavyAttackAction; // 重攻击 (RMB/R2)
public InputAction blockAction; // 格挡 (Hold RMB/R2)
// 武器
public InputAction weaponSwitchAction; // 武器切换 (Q/E)
public InputAction skillAction1; // 技能1 (1)
public InputAction skillAction2; // 技能2 (2)
// 系统
public InputAction pauseAction; // 暂停 (Esc)
public InputAction lockOnAction; // 锁定 (Tab)
}
```
#### 3.1.2 输入响应时间
```
输入 → 响应 时间表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
移动 0-16ms 即时响应
视角旋转 0-16ms 即时响应
跳跃 16-33ms 1帧延迟
闪避 33-50ms 2-3帧延迟
攻击 33-66ms 2-4帧延迟
格挡 33-50ms 2-3帧延迟
技能 50-100ms 3-6帧延迟
```
### 3.2 输入缓冲系统
#### 3.2.1 缓冲机制
```csharp
public class InputBufferConfig
{
// 缓冲时间
public float attackBufferTime = 0.15f; // 攻击缓冲时间
public float dodgeBufferTime = 0.2f; // 闪避缓冲时间
public float jumpBufferTime = 0.1f; // 跳跃缓冲时间
// 优先级
public bool enablePriority = true;
public InputPriority priorityOrder = InputPriority.Dodge > InputPriority.Jump > InputPriority.Attack;
}
public enum InputPriority
{
Dodge, // 最高优先级
Jump,
Attack,
Block,
Move // 最低优先级
}
```
#### 3.2.2 缓冲执行逻辑
```
玩家输入 → 存入缓冲区 → 按优先级执行
当前动作可被打断?
↓ 是
检测缓冲输入 → 匹配成功 → 执行缓冲动作
↓ 否
继续当前动作 → 动作结束 → 清空缓冲区
```
### 3.3 预输入系统
#### 3.3.1 预输入原理
```csharp
public class PreinputConfig
{
// 预输入窗口
public float preinputWindow = 0.1f; // 动作结束前多久可以输入
// 预输入验证
public bool requireDirectionMatch = true; // 是否要求方向匹配
public float directionThreshold = 0.8f; // 方向相似度阈值
}
```
#### 3.3.2 预输入示例
```
场景: 玩家刚结束一个攻击动作
时机1: 攻击结束前 0.1s 按下闪避
结果: 立即执行闪避,无缝衔接
时机2: 攻击结束前 0.2s 按下闪避
结果: 忽略(超出预输入窗口)
时机3: 攻击结束后 0.1s 按下闪避
结果: 正常执行闪避(普通输入)
```
### 3.4 输入辅助系统
#### 3.4.1 方向修正
```csharp
public class InputAssistConfig
{
// 自动锁定
public bool enableAutoLock = false;
public float autoLockAngle = 30.0f; // 自动锁定角度
public float autoLockRange = 5.0f; // 自动锁定距离
// 方向吸附
public bool enableDirectionSnapping = true;
public float snapAngle = 45.0f; // 吸附角度
public float snapDeadzone = 0.5f; // 吸附死区
// 目标吸附
public bool enableTargetSnapping = true;
public float targetSnapAngle = 60.0f; // 目标吸附角度
}
```
#### 3.4.2 友好度设置
```
辅助等级 自动锁定 方向吸附 目标吸附 瞄准辅助
────────────────────────────────────────────────────────
新手 ✓ ✓ ✓ ✓
普通 ✓ ✓ ✗ ✓
老手 ✗ ✗ ✗ ✗
硬核 ✗ ✗ ✗ ✗
```
---
## 四、3C协调设计
### 4.1 移动与相机协调
#### 4.1.1 移动时相机行为
```
移动类型 相机行为
─────────────────────────────────────────
静止站立 缓慢恢复居中
缓慢行走 平滑跟随
正常奔跑 快速跟随 + FOV增加
冲刺 快速跟随 + 大FOV + 震动
闪避/后撤 特殊跟随路径
跳跃 垂直跟随 + 轻微下压
```
#### 4.1.2 相机过渡时机
```csharp
public class CameraTransitionSettings
{
// 移动类型切换
public float walkToRunThreshold = 5.0f; // 行走→奔跑阈值
public float runToSprintThreshold = 8.0f; // 奔跑→冲刺阈值
// FOV过渡
public float fovTransitionSpeed = 5.0f; // FOV变化速度
// 距离过渡
public float distanceTransitionSpeed = 3.0f; // 距离变化速度
// 角色旋转过渡
public float characterRotationDelay = 0.1f; // 角色旋转延迟
}
```
### 4.2 战斗与相机协调
#### 4.2.1 攻击时相机行为
```
攻击类型 相机行为
───────────────────────────────────────
轻攻击 轻微震动 + 快速恢复
重攻击 中度震动 + 视角跟随武器
技能释放 大震动 + 可能有特写
完美格挡/闪避 轻微震动 + 焦点锁定
受击 强烈震动 + 屏幕变红
```
#### 4.2.2 锁定系统行为
```csharp
public class LockOnSettings
{
// 锁定范围
public float maxLockOnDistance = 50.0f; // 最大锁定距离
public float lockOnAngle = 180.0f; // 锁定角度
// 切换
public bool enableTargetSwitch = true;
public float switchCooldown = 0.3f; // 切换冷却
public InputAction switchTargetAction; // 切换目标输入
// 脱离
public float autoUnlockDistance = 60.0f; // 自动解锁距离
public float unlockIfBehindTime = 2.0f; // 目标在背后多久解锁
}
```
### 4.3 特殊状态协调
#### 4.3.1 剧情/过场状态
```csharp
public class CinematicSettings
{
// 进入/退出
public float fadeInDuration = 0.5f; // 淡入时长
public float fadeOutDuration = 0.5f; // 淡出时长
// 相机控制
public bool disablePlayerCamera = true; // 禁用玩家控制相机
public bool lockPlayerMovement = true; // 锁定玩家移动
// UI
public bool hideHUD = true; // 隐藏HUD
public bool showDialogue = false; // 显示对话
}
```
#### 4.3.2 死亡/复活状态
```csharp
public class DeathCameraSettings
{
// 死亡相机
public float deathCameraHeight = 2.0f; // 相机高度
public float deathCameraDistance = 5.0f; // 相机距离
public float deathCameraDuration = 2.0f; // 死亡相机持续时间
// 复活相机
public float respawnCameraSpeed = 3.0f; // 复活相机速度
public TransitionCurve respawnCurve; // 复活过渡曲线
}
```
---
## 五、调试工具
### 5.1 运行时调试显示
```csharp
public class CameraDebugInfo : MonoBehaviour
{
public bool showDebugInfo = true;
void OnGUI()
{
if (!showDebugInfo) return;
GUILayout.BeginArea(new Rect(10, 10, 400, 300));
GUILayout.Label($"Camera Distance: {currentDistance}");
GUILayout.Label($"Camera Pitch: {currentPitch}");
GUILayout.Label($"Camera Yaw: {currentYaw}");
GUILayout.Label($"Current FOV: {currentFOV}");
GUILayout.Label($"Camera State: {cameraState}");
GUILayout.Label($"Is Locking: {isLocking}");
GUILayout.EndArea();
}
}
```
### 5.2 编辑器调试工具
```csharp
#if UNITY_EDITOR
[CustomEditor(typeof(ThirdPersonCameraController))]
public class CameraControllerEditor : Editor
{
void OnSceneGUI()
{
var controller = target as ThirdPersonCameraController;
// 绘制相机锥体
Handles.color = Color.cyan;
Vector3 camPos = controller.transform.position;
Vector3 forward = controller.transform.forward * controller.distance;
Handles.DrawLine(camPos, camPos + forward);
Handles.DrawWireDisc(camPos + forward, Vector3.up, controller.fovAtDistance);
}
}
#endif
```
### 5.3 录制回放工具
```csharp
public class CameraRecorder : MonoBehaviour
{
public List<CameraFrame> recordedFrames = new List<CameraFrame>();
private bool isRecording;
[Serializable]
public struct CameraFrame
{
public float time;
public Vector3 position;
public Quaternion rotation;
public float fov;
}
public void StartRecording()
{
recordedFrames.Clear();
isRecording = true;
}
public void StopRecording()
{
isRecording = false;
}
void LateUpdate()
{
if (isRecording)
{
recordedFrames.Add(new CameraFrame
{
time = Time.time,
position = transform.position,
rotation = transform.rotation,
fov = GetComponent<Camera>().fieldOfView
});
}
}
}
```
---
## 六、优化建议
### 6.1 性能优化
#### 6.1.1 摄像机性能
```
优化项 建议
───────────────────────────────────
相机更新频率 跟随角色更新LateUpdate
震动系统 使用对象池避免GC
碰撞检测 使用LayerMask减少检测
FOV计算 缓存计算结果
距离计算 使用sqrMagnitude代替magnitude
```
#### 6.1.2 输入性能
```
优化项 建议
───────────────────────────────────
输入检测 使用事件而非轮询
输入缓冲 使用固定大小数组
预输入验证 简化验证逻辑
辅助计算 必要时才计算
```
### 6.2 内存优化
```
优化项 建议
───────────────────────────────────
震动预设 使用Struct而非Class
动画曲线 共享常用曲线
相机状态 使用Enum而非字符串
调试信息 运行时可关闭
```
---
## 七、参考案例
### 7.1 优秀3C设计游戏
1. **Dark Souls系列** - 精准的锁定系统
2. **Devil May Cry系列** - 华丽的视角演出
3. **God of War** - 优秀的过肩视角
4. **The Witcher 3** - 自然的相机跟随
5. **Ghost of Tsushima** - 电影化的相机语言
### 7.2 关键学习点
```
游戏 学习点
─────────────────────────────────────────
Dark Souls 锁定系统、精准反馈
Devil May Cry 视角演出、特写镜头
God of War 过肩视角、战斗相机
Witcher 3 探索相机、自然跟随
Ghost of Tsushima 电影语言、视觉叙事
Bayonetta 闪避特写、Witch Time
```
---
## 八、总结
### 8.1 3C设计核心原则
1. **一致性**: 所有系统应该协调一致
2. **响应性**: 玩家输入应该得到即时反馈
3. **可读性**: 玩家应该能清楚看到游戏状态
4. **沉浸感**: 相机应该增强而非干扰体验
5. **辅助性**: 应该提供合理的辅助选项
### 8.2 开发检查清单
```
□ 基础移动流畅
□ 视角旋转平滑
□ 战斗反馈明确
□ 锁定系统稳定
□ 遮挡处理自然
□ FOV变化合理
□ 震动效果适度
□ 调试工具完善
□ 性能表现良好
□ 辅助选项完整
```
### 8.3 常见问题
```
问题 解决方案
─────────────────────────────────────────
相机抖动 增加平滑度,降低跟随速度
视角穿墙 增加碰撞检测,调整躲避速度
锁定不稳定 增加目标切换冷却,调整角度阈值
输入延迟 检查事件调用顺序,优化计算
FOV变化突兀 使用缓动曲线,增加过渡时间
```
---
*文档生成日期: 2026-04-17*
*生成者: Game Designer Agent*