当前位置:   article > 正文

unity2D吃豆人游戏移动教程(超级详细)_unity2d movetowards 方法

unity2d movetowards 方法

对物体一开始的定义

首先if要写某个物体移动的脚本时先对其速度(speed),初始位置,所用的结构,和动画器进行引用如:

public float speed = 0.35f;

private Vector2 dest = Vector2.zero;

private Rigidbody2D rb2D;

private Animator animator;

建立的公共speed(速度)可以进行改变

public float speed = 0.35f;:这是一个公共的浮点型变量 speed,被初始化为0.35。这个变量可能用于控制物体的移动速度。public 表示该变量可以在其他类中访问,而 float 表示它是一个浮点数。

private Vector2 dest = Vector2.zero;:这是一个私有的 Vector2 类型的变量 dest,被初始化为 Vector2.zero。Vector2.zero 表示一个零向量,通常被用来表示初始位置或未设置的目标位置。这个变量可能用于存储物体当前的目标位置。

private Rigidbody2D rb2D;:这是一个私有的 Rigidbody2D 类型的变量 rb2D,用于存储物体上的 Rigidbody2D 组件的引用。Rigidbody2D 通常用于处理物体的物理属性和运动。这个变量可能在后续的代码中被用来控制物体的物理行为。

private Animator animator;:这是一个私有的 Animator 类型的变量 animator,用于存储物体上的 Animator 组件的引用。Animator 通常用于控制物体的动画。这个变量可能在后续的代码中被用来控制物体的动画状态和播放动画。

总体而言,这些变量提供了一个用于控制物体运动和动画的基础设施。speed 控制物体的速度,dest 存储目标位置,rb2D 存储物体的物理组件引用,而 animator 存储动画组件的引用。这些变量可能会在后续的脚本中被使用,以实现物体的运动和动画效果。

private void Start()

然后在private void Start()该函数中写

 private void Start()
    {
        dest = transform.position;
        rb2D = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }
 

dest = transform.position;:这行代码将 dest 变量的值设置为当前物体(可能是角色)的位置。transform.position 表示物体当前的位置。这个操作可能是在初始化过程中用来确保 dest 变量的初始值与物体的初始位置一致。

rb2D = GetComponent<Rigidbody2D>();:这行代码是用来获取物体上的 Rigidbody2D 组件的引用并将其分配给名为 rb2D 的变量。Rigidbody2D 通常用于处理物体的物理属性和运动。通过获取这个组件的引用,您可以在后续的代码中控制物体的物理行为,比如施加力或设置速度。

animator = GetComponent<Animator>();:这行代码是用来获取物体上的 Animator 组件的引用并将其分配给名为 animator 的变量。Animator 通常用于控制物体的动画。通过获取这个组件的引用,您可以在后续的代码中控制物体的动画状态和播放动画。

综合起来,这段代码的作用是进行一些初始化操作,以便在后续的游戏逻辑中使用。它确保了目标位置 dest 的初始值与物体的当前位置一致,并获取了 Rigidbody2D 和 Animator 组件的引用,以便在游戏中控制物体的物理行为和动画。这些初始化步骤通常在游戏对象被创建或启动时执行。

private void FixedUpdate()

在private void FixedUpdate()中的

private void FixedUpdate()
    {
        Vector2 dir = dest - (Vector2)transform.position;
        animator.SetFloat("DirX", dir.x);
        animator.SetFloat("DirY", dir.y);
        Vector2 temp = Vector2.MoveTowards(transform.position, dest, speed);
        rb2D.MovePosition(temp);


Vector2 dir = dest - (Vector2)transform.position;:这行代码计算一个名为 dir 的向量,它表示从当前位置 transform.position 指向目标位置 dest 的方向。它通过将目标位置减去当前位置来计算方向向量。

animator.SetFloat("DirX", dir.x); 和 animator.SetFloat("DirY", dir.y);:这两行代码用于更新角色的动画参数。它们使用 animator 变量引用的 Animator 组件来设置两个浮点型动画参数,分别是 "DirX" 和 "DirY"。这些参数通常用于控制角色的动画,例如使角色的动画在不同方向上播放。

Vector2 temp = Vector2.MoveTowards(transform.position, dest, speed);:这行代码使用 Vector2.MoveTowards 方法来计算一个新的位置向量 temp。这个方法接受三个参数:起始位置 transform.position,目标位置 dest,以及移动的速度 speed。它会返回一个新的位置,表示从当前位置向目标位置移动一定距离后的位置。这个新位置存储在 temp 变量中。

rb2D.MovePosition(temp);:这行代码使用 rb2D 变量引用的 Rigidbody2D 组件的 MovePosition 方法来移动角色到新的位置 temp。这个方法通常用于在物理引擎中移动物体,确保物体在移动时受到物理碰撞的影响。这将导致角色向目标位置移动,移动速度由 speed 控制。

综合起来,这段代码的目的是计算角色应该移动到的新位置 temp,并将角色移动到这个新位置。同时,它还更新了角色的动画参数,以确保角色在不同方向上播放适当的动画。这是一个常见的游戏开发中用于处理角色移动和动画的代码片段。

if((Vector2)transform.position == dest) {

            if ((Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W) )&& Valid(Vector2.up))

            {

                dest = (Vector2)transform.position + Vector2.up;

            }

            if ((Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S) )&& Valid(Vector2.down))

            {

                dest = (Vector2)transform.position + Vector2.down;

            }

            if ((Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A) )&& Valid(Vector2.left))

            {

                dest = (Vector2)transform.position + Vector2.left;

            }

            if ((Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)) && Valid(Vector2.right))

            {

                dest = (Vector2)transform.position + Vector2.right;

            }

        }

首先,代码开始了一个条件语句 if((Vector2)transform.position == dest),这个条件检查角色当前位置是否等于一个名为 dest 的目标位置。这个条件可能用于检查角色是否已经到达了目标位置。

如果条件1满足(也就是角色当前位置等于目标位置),则进入条件语句的内部块,这里将检查用户的输入来确定角色下一步应该移动到哪里。

每个 if 语句都检查不同的输入键是否被按下。例如,第一个 if 语句检查是否按下了向上箭头键或 'W' 键,同时调用 Valid(Vector2.up) 来检查是否可以向上移动。如果这个条件满足,那么 dest 将被设置为当前位置向上移动一个单位的位置,即 (Vector2)transform.position + Vector2.up。类似的操作在每个方向上都有,分别对应向上、向下、向左和向右的移动。

每个方向上的移动都会检查 Valid 方法的返回值,以确保移动是有效的。这可能涉及到检查碰撞、地图边界或其他移动约束,以防止角色移动到不允许的位置。

总的来说,这段代码的目的是在用户按下相应的方向键时,根据用户的输入来移动角色。如果当前位置等于目标位置,并且用户输入的方向是有效的,那么角色的目标位置 dest 会被更新为一个新的位置,从而触发角色的移动。这个代码片段可能是一个游戏中处理角色移动的一部分,但它还需要与其他部分一起工作,以实现完整的移动逻辑。

全部代码:

  1. using UnityEngine;
  2. public class PacmanMove : MonoBehaviour
  3. {
  4. public float speed = 0.35f;//速度
  5. private Vector2 dest = Vector2.zero;
  6. private Rigidbody2D rb2D;//2D结构
  7. private Animator animator;
  8. private void Start()
  9. {
  10. dest = transform.position;
  11. rb2D = GetComponent<Rigidbody2D>();
  12. animator = GetComponent<Animator>();
  13. }
  14. private void FixedUpdate()
  15. {
  16. Vector2 dir = dest - (Vector2)transform.position;
  17. animator.SetFloat("DirX", dir.x);
  18. animator.SetFloat("DirY", dir.y);
  19. Vector2 temp = Vector2.MoveTowards(transform.position, dest, speed);
  20. rb2D.MovePosition(temp);
  21. if((Vector2)transform.position == dest) {
  22. if ((Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W) )&& Valid(Vector2.up))
  23. {
  24. dest = (Vector2)transform.position + Vector2.up;
  25. }
  26. if ((Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S) )&& Valid(Vector2.down))
  27. {
  28. dest = (Vector2)transform.position + Vector2.down;
  29. }
  30. if ((Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A) )&& Valid(Vector2.left))
  31. {
  32. dest = (Vector2)transform.position + Vector2.left;
  33. }
  34. if ((Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)) && Valid(Vector2.right))
  35. {
  36. dest = (Vector2)transform.position + Vector2.right;
  37. }
  38. }
  39. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/122750
推荐阅读
相关标签
  

闽ICP备14008679号