Flandre923
808 words
4 minutes
Untity学习记录-实现一个完整的2D游戏Demo-05-实现人物的移动和反转

一、使用 Rigidbody 2D 的 Velocity 进行移动:

  1. Rigidbody 驱动坐标: 强调一旦物体挂载了 Rigidbody 2D 组件,其位置和旋转主要由 Rigidbody 控制,可以通过查看 Rigidbody 组件的 Info 面板来了解其 positionrotationvelocity
  2. 使用速度驱动移动: 相较于直接修改 Transform 的坐标,通过修改 Rigidbody 的 velocity 来实现物理效果更真实的移动。
  3. 创建 Speed 变量: 创建一个 public float speed 变量,用于控制角色的移动速度,可以在 Unity 编辑器中调整。
  4. 在 FixedUpdate 中执行物理操作: 解释了 FixedUpdate() 函数以固定的时间间隔执行,适合进行物理相关的操作,确保在不同性能的设备上表现一致。
  5. 创建 Move 函数: 创建一个自定义的 void Move() 函数来包含角色移动的逻辑。
  6. 在 FixedUpdate 中调用 Move 函数:FixedUpdate() 函数中调用 Move() 函数,使移动逻辑在固定的物理更新周期内执行。

二、获取 Rigidbody 2D 组件:

  1. 方法一:在 Inspector 中拖拽:

    • 声明一个 public Rigidbody2D rb 变量。
    • 将 Player 对象上的 Rigidbody 2D 组件直接拖拽到 Inspector 窗口中 rb 变量的槽位中。
    • 优点:获取速度快,适用于需要在游戏开始前就确定引用的情况。
  2. 方法二:通过代码获取 (GetComponent):

    • 声明一个 private Rigidbody2D rb 变量。
    • Awake() 函数中使用 rb = GetComponent<Rigidbody2D>(); 来获取自身 GameObject 上的 Rigidbody 2D 组件。
    • 解释了 public (公开,可在 Inspector 和其他脚本访问) 和 private (私有,仅限当前脚本访问) 关键字的区别。

三、修改 Rigidbody 2D 的速度 (Velocity):

  1. 访问 Velocity: 通过 rb.velocity 访问 Rigidbody 2D 的速度属性。

  2. 设置新的速度:velocity 设置为一个新的 Vector2 值:new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y);

    • inputDirection.x 获取水平方向的输入值 (-1, 0, 1 或手柄的模拟值)。
    • speed 应用设定的移动速度。
    • Time.deltaTime 使移动速度与帧率无关,保证在不同性能的设备上速度一致。
    • rb.velocity.y 保留原有的垂直方向速度,以保持重力效果。

四、实现角色翻转:

  1. 翻转的两种方法:

    • 修改 transform.localScale.x 的值(例如设置为 -1 可以实现水平翻转)。
    • 使用 SpriteRenderer 组件的 flipX 属性。
  2. 使用 transform.localScale.x 进行翻转:

    • 访问 Transform 组件: 通过 transform (小写) 直接访问 GameObject 的 Transform 组件。
    • 创建 faceDirection 变量: 创建一个 int faceDirection 变量来记录角色的朝向 (1 为右,-1 为左)。
    • 初始化 faceDirectionfaceDirection 初始化为当前的 transform.localScale.x (强制转换为 int)。
    • 根据输入方向更新 faceDirection 使用 if 语句判断 inputDirection.x 的正负来更新 faceDirection 的值。
    • 应用翻转: 设置 transform.localScale = new Vector3(faceDirection, 1, 1); 来根据 faceDirection 的值翻转角色。

五、关于 SpriteRenderer.flipX

  1. 获取 SpriteRenderer 组件: 可以使用 GetComponent<SpriteRenderer>() 来获取角色身上的 SpriteRenderer 组件。
  2. 使用 flipX 属性: 通过 GetComponent<SpriteRenderer>().flipX = true;false; 来控制是否在 X 轴翻转精灵。

六、代码周期函数的重要性:

  1. Update() 每帧执行。
  2. FixedUpdate() 以固定的时间间隔执行,用于物理相关的操作。
  3. OnEnable() OnDisable() 在 GameObject 启用和禁用时执行。
  4. Awake()Start() 函数之前执行。
Untity学习记录-实现一个完整的2D游戏Demo-05-实现人物的移动和反转
https://fuwari.vercel.app/posts/unity/2dadvanture/05playerfilp/
Author
Flandre923
Published at
2025-03-31