783 lines
23 KiB
Markdown
783 lines
23 KiB
Markdown
# 动作游戏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*
|