狗屎Minimax坏我代码
This commit is contained in:
782
docs/动作游戏3C设计理论.md
Normal file
782
docs/动作游戏3C设计理论.md
Normal file
@@ -0,0 +1,782 @@
|
||||
# 动作游戏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*
|
||||
Reference in New Issue
Block a user