【问题标题】:How can I make the NPC move only vertical and horizontal and not diagonal with Vector2/3.MoveTowards and how can I make the NPC move only by tile如何使用 Vector2/3.MoveTowards 使 NPC 仅垂直和水平移动而不是对角线移动,如何使 NPC 仅通过平铺移动
【发布时间】:2021-08-20 09:17:59
【问题描述】:

所以我尝试制作一款游戏只是为了好玩和学习以备将来使用。所以我在制作敌方NPC时遇到了这个问题。我希望它跟随我或追逐我,但我希望 NPC 只能水平和垂直移动,并且我希望 NPC 也像我的玩家一样在每个图块上移动。

这是它的外观视频 https://www.youtube.com/watch?v=CB_vdt1Z3nA

这是 NPC 脚本

public class ChaseScript : MonoBehaviour
{
    public float speed;
    private GameObject player;
    private Transform player_transform;


    void Start()
    {
        player = GameObject.Find("Player");
    }


    void Update()
    {
        player_transform = player.GetComponent<Transform>();
        transform.position = Vector3.MoveTowards(transform.position, player_transform.position, speed * Time.deltaTime);
    }
}

这是我的播放器控制器

public void InputMove()
    {
        if (!isMoving)
        {
            input.x = Input.GetAxisRaw("Horizontal");
            input.y = Input.GetAxisRaw("Vertical");

            if (input.x != 0) input.y = 0;

            if (input != Vector2.zero)
            {
                playerAnimation.SetParameterValue(animator);

                var movePos = transform.position;
                movePos.x += input.x;
                movePos.y += input.y;
                FacingForward.transform.position = movePos;

                if (IsWalkable(movePos))
                    StartCoroutine(Move(movePos));
            }
            playerAnimation.SetParameterValueisMoving(animator);
        }

        if (Input.GetKey(KeyCode.LeftShift))
        {
            moveSpeed = 6f;
            animator.speed = 1.5f;
        }

        else
        {
            moveSpeed = 4f;
            animator.speed = 1f;
        }
    }

    IEnumerator Move(Vector3 movePos)
    {
        isMoving = true;
        while ((movePos - transform.position).sqrMagnitude > Mathf.Epsilon)
        {
            transform.position = Vector3.MoveTowards(transform.position, movePos, moveSpeed * Time.deltaTime);
            yield return null;
        }
        transform.position = movePos;
        isMoving = false;
    }

    private bool IsWalkable(Vector3 movePos)
    {
        if (Physics2D.OverlapCircle(movePos, 0.1f, SolidObjectLayer | NPC) != null)
        {
            return false;
        }
        return true;
    }

我对我的玩家所做的移动每个图块是我只是添加 1 来变换,所以这将是一个持续的移动,但我不知道如何使用 Vector3.MoveTowards 将它应用到 NPC 但如果不是可以做就可以了

【问题讨论】:

  • 能否请您也包含播放器的移动脚本?
  • 好的,请稍等
  • 好的,我加了。
  • 也许你可以让 NPC 模仿玩家的动作。我建议阅读命令模式en.wikipedia.org/wiki/Command_pattern
  • 这可能是个好主意。我会试试的。

标签: c# unity3d 2d-games


【解决方案1】:

检查这是否可行(您可以将其调整为您的 2D 案例)

using UnityEngine;

public class ChaseOrthoScript : MonoBehaviour
{
    public float speed;
    private GameObject player;
    private Transform player_transform;
    bool isMoving = false;

void Start()
{
    player = GameObject.Find("Player");
    player_transform = player.GetComponent<Transform>();
    transform.LookAt(player_transform.position);
}

void Update()
{
    if (transform.InverseTransformPoint(player_transform.position).z > 0) {
        transform.position += transform.forward * speed * Time.deltaTime;
        isMoving = true;
    } else {
        if (isMoving) {
            float angle = Vector3.Angle(transform.forward, player_transform.position - transform.position);
            transform.Rotate(Vector3.up, Mathf.Sign(angle) * 90);
            isMoving = false;
        } else if (transform.InverseTransformPoint(player_transform.position).z <= 0) { //player is back
            transform.Rotate(Vector3.up, 180);
        }
    }
}
}

请注意,player_transform = player.GetComponent&lt;Transform&gt;(); 已移至 Start()。通常你不希望 GetComponents 在更新中,因为你只需要得到它一次。此外,在脚本中有一个public GameObject player; 变量并在编辑器中附加 player = GameObject.Find("Player"); 的引用也更加简洁。通常,您不希望通过代码中的硬编码魔法值找到场景元素。

希望对您有所帮助。

【讨论】:

  • 出现故障
  • 我不知道你场景中你元素的轴。该示例适用于新 3D 项目中的 2 个立方体,以实现您想要的水平面移动。您可以将其作为参考以适应您的具体情况
  • 您可以检查 2 个立方体,命名 1“玩家”并在场景中移动它以检查正交跟随
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多