在让敌人移动的时候 为什么要有方向、实际速度和位置
//移动属性
public Vector2 Velocity { get; set; }
//默认速度
public float Speed { get; set; } = 200f;
//方向
public Vector2 Direction { get; set; }
//引用到实体的位置
public Vector2 Position { get; set; }
不太理解这两句的作用,以及为什么有这两个
public Vector2 Velocity { get; set; }
public Vector2 Direction
这两个属性的区别和作用是掌握游戏物理和运动系统的核心。
Direction(方向)和 Velocity(速度)的区别
让我用一个现实世界的比喻来解释:
想象一下你在开车:
-
Direction(方向):就像你的方向盘。它只控制你朝哪个方向开(前、后、左、右、或任何角度),但不控制你开得多快。- 值范围:通常是一个单位向量(长度为1),例如
(1, 0)表示向右,(0, -1)表示向上。 - 作用:纯粹表示移动的方向。
- 值范围:通常是一个单位向量(长度为1),例如
-
Velocity(速度):就像你的油门和车速表。它表示你实际移动的速度和方向。- 值范围:是一个向量,其长度表示速度大小,方向表示移动方向。
- 作用:直接决定物体位置如何变化。
为什么需要两个属性?
-
分离关注点:
Direction由输入系统或AI系统决定(玩家按了什么键,AI决定往哪走)Velocity由物理系统计算得出(方向 × 速度)
-
灵活性:
- 你可以改变方向而不影响速度(例如:角色在空中转向但保持原速度)
- 你可以改变速度而不影响方向(例如:角色加速或减速但仍朝同一方向移动)
-
代码清晰度:
- 输入/AI只需要关心"我想往哪走",不需要知道具体速度计算
- 物理系统只需要关心"如何根据方向计算实际移动"
实际工作流程
在你的代码中,工作流程是这样的:
// 1. 输入/AI系统设置方向
Movement.Direction = inputComponent.GetDirection(); // 例如: (0.7, 0.7) 表示右上45度
// 2. 物理系统计算速度
Movement.Velocity = Movement.Direction * Movement.Speed; // 例如: (0.7*200, 0.7*200) = (140, 140)
// 3. 使用速度更新位置
Position += Movement.Velocity * deltaTime; // 实际移动角色
如果你觉得太复杂,可以简化
如果你刚开始学习,也可以简化这个系统,只使用速度:
public class SimpleMovementComponent
{
public Vector2 Velocity { get; set; }
public Vector2 Position { get; set; }
public void Update(GameTime gameTime)
{
float deltaTime = (float)gameTime.ElapsedGameTime.TotalSeconds;
Position += Velocity * deltaTime;
}
}
// 在使用时直接设置速度
playerMovement.Velocity = new Vector2(100, 0); // 向右移动,每秒100像素
但这种简化方式失去了方向与速度分离的灵活性,当游戏复杂度增加时可能会遇到限制。
总结
Direction:纯粹的方向(单位向量)Velocity:实际的速度(方向 × 速度大小)
这种分离设计是游戏开发中的常见模式,它提供了更大的灵活性和更清晰的代码结构。当你需要实现更复杂的功能(如不同方向有不同的速度,或者施加外力影响移动)时,这种分离的优势会更加明显。
浙公网安备 33010602011771号