C# 如何使NPC仅垂直和水平移动,而不使用矢量2/3进行对角线移动。如何使NPC仅通过平铺移动

C# 如何使NPC仅垂直和水平移动,而不使用矢量2/3进行对角线移动。如何使NPC仅通过平铺移动,c#,unity3d,2d-games,C#,Unity3d,2d Games,所以我试着做一个游戏只是为了好玩,为了将来的使用而学习。所以我在制作敌人NPC时遇到了这个问题。我希望它跟随我或追逐我,但我希望NPC只在水平和垂直方向移动,我希望NPC也能像我的玩家一样在每个瓷砖上移动 下面是它的外观视频 这是NPC脚本 public class ChaseScript : MonoBehaviour { public float speed; private GameObject player; private Transform player_t

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

下面是它的外观视频

这是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);
    }
}
我对我的玩家所做的每片移动是我只添加了1以进行变换,所以这将是一个持续的移动,但我不知道如何将其应用到带有矢量的NPC上3。移动方向,但如果不可能,则可以检查这是否可行(您可以将其调整到2D情况)

使用UnityEngine;
公共类脚本:MonoBehavior
{
公众浮标速度;
私人游戏对象玩家;
私有变换;
bool isMoving=false;
void Start()
{
player=GameObject.Find(“player”);
player_transform=player.GetComponent();
变换。注视(玩家的变换位置);
}
无效更新()
{
if(transform.InverseTransformPoint(player_transform.position).z>0){
transform.position+=transform.forward*速度*时间.deltaTime;
isMoving=真;
}否则{
如果(正在移动){
浮动角度=矢量3.角度(transform.forward,player_transform.position-transform.position);
变换.旋转(矢量3.up,数学符号(角度)*90);
isMoving=假;

}else if(transform.InverseTransformPoint(player_transform.position).z你能把你的玩家的动作脚本也包括进来吗?好的,只是一个重要的问题。我添加了它。也许你可以让NPC模拟玩家的动作。我建议阅读命令模式,这可能是个好主意。我会试试。这是glitchingI不知道你场景中的yout元素的轴。这个例子是新3D中的两个立方体投影以在水平面上实现您想要的移动。您可以将其作为参考,使其适应您的具体情况。好的,谢谢,我会尝试您可以使用2个立方体进行检查,命名1个“玩家”,并在场景中移动它以检查正交跟随
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;
    }
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);
        }
    }
}
}