Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Unity 2D中禁用对角线移动?_C#_Unity3d_2d Games - Fatal编程技术网

C# 如何在Unity 2D中禁用对角线移动?

C# 如何在Unity 2D中禁用对角线移动?,c#,unity3d,2d-games,C#,Unity3d,2d Games,我想问一下,是否有一种方法可以禁用Unity 2D中的对角线运动。 问题是,当我同时按下“W”+“D”(移动键)时,角色开始沿对角线移动。 因此,当组合按钮按下时,我不希望字符以对角线移动,而是希望它完全笔直移动,如果我按下“d”键或任何其他键移动,即使我仍然同时按下另一个按钮。也就是说,对我按下的最后一个按钮的功能进行优先级排序 这里有一个简短的视频来进一步解释我的问题 这是我角色移动的代码 using System.Collections; using System.Collections

我想问一下,是否有一种方法可以禁用Unity 2D中的对角线运动。 问题是,当我同时按下“W”+“D”(移动键)时,角色开始沿对角线移动。 因此,当组合按钮按下时,我不希望字符以对角线移动,而是希望它完全笔直移动,如果我按下“d”键或任何其他键移动,即使我仍然同时按下另一个按钮。也就是说,对我按下的最后一个按钮的功能进行优先级排序

这里有一个简短的视频来进一步解释我的问题

这是我角色移动的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class keycontrol : MonoBehaviour
{

    public float moveSpeed = 0f;
    public Rigidbody2D rb2d;
    Vector2 movement;
    public Animator animator;


    // Update is called once per frame
    void Update()
    {
        movement.x = Input.GetAxisRaw("Horizontal");
        movement.y = Input.GetAxisRaw("Vertical");

        animator.SetFloat("walk_right", movement.x);
        animator.SetFloat("walk_left", -movement.x);
        animator.SetFloat("walk_down", -movement.y);
        animator.SetFloat("walk_up", movement.y);
    }

    void FixedUpdate()
    {
        rb2d.MovePosition(rb2d.position + movement * moveSpeed * Time.fixedDeltaTime);

        if(Input.GetKey("left shift"))
        {
            moveSpeed = 200 * Time.deltaTime;
            animator.speed = 1.5f;
        }
        else
        {
            moveSpeed = 110 * Time.deltaTime;
            animator.speed = 1f;
        }
    }
}

感谢您的帮助

因为我无法对此帖子发表评论,所以您应该查看最近发布的新输入系统unity:


它可以更好地控制输入(如事件系统),因此您可以锁定移动直到释放第一个键。

一种简单的方法是将一个轴优先于另一个轴,并将另一个检查包装在一个条件中

movement.x = Input.GetAxisRaw("Horizontal");
if (movement.x != 0)
{
    movement.y = Input.GetAxisRaw("Vertical");
}
但是,这可能会失败,因为根据您的输入,轴在使用控制器时可能返回接近零的值。在这种情况下,您可以同时获取这两个值并检查较大的值

movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");

if (Mathf.Abs(movement.x) > Mathf.Abs(movement.y))
{
    movement.y = 0;
}
else
{
    movement.x = 0;
}

您只能在其中一个轴上处理移动。在代码中,每个机会都可以找到以下草稿:

bool isXMoving;
bool isYMoving;
// Update is called once per frame
void Update()
{
    if (Input.GetAxisRaw("Horizontal") != 0f && !isYMoving) {
        movement.x = Input.GetAxisRaw("Horizontal");
        movement.y = 0; 
        isXMoving = true;
        isYMoving = false;
    }
    if (Input.GetAxisRaw("Horizontal") != 0f && !isXMoving) {
        movement.y = Input.GetAxisRaw("Vertical");
        movement.x = 0; 
        isYMoving = true;
        isXMoving = false;
    }
    Debug.Log($"X: {movement.x} Y: {movement.y}");  //check
    
    animator.SetFloat("walk_right", movement.x);
    animator.SetFloat("walk_left", -movement.x);
    animator.SetFloat("walk_down", -movement.y);
    animator.SetFloat("walk_up", movement.y);
}

您可以添加条件以检查是否按下了水平移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class keycontrol : MonoBehaviour
{

    public float moveSpeed = 0f;
    public Rigidbody2D rb2d;
    Vector2 movement;
    public Animator animator;


    // Update is called once per frame
    void Update()
    {
        movement.x = Input.GetAxisRaw("Horizontal");
        if(movement.x == 0){
        movement.y = Input.GetAxisRaw("Vertical");
        }
        animator.SetFloat("walk_right", movement.x);
        animator.SetFloat("walk_left", -movement.x);
        animator.SetFloat("walk_down", -movement.y);
        animator.SetFloat("walk_up", movement.y);
    }

    void FixedUpdate()
    {
        rb2d.MovePosition(rb2d.position + movement * moveSpeed * Time.fixedDeltaTime);

        if(Input.GetKey("left shift"))
        {
            moveSpeed = 200 * Time.deltaTime;
            animator.speed = 1.5f;
        }
        else
        {
            moveSpeed = 110 * Time.deltaTime;
            animator.speed = 1f;
        }
    }
}