# 动作游戏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 recordedFrames = new List(); 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().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*