【问题标题】:How do I disable diagonal movement in Unity 2D?如何在 Unity 2D 中禁用对角线移动?
【发布时间】:2021-06-21 03:18:39
【问题描述】:

我想问一下是否有办法在 Unity 2D 中禁用对角线移动。 问题是当我同时按下“W”+“D”(移动键)时,角色开始沿对角线移动。 因此,当我按下“d”或任何其他键移动时,我希望它完全笔直,而不是在组合按钮按下时移动对角线,即使我仍然同时按下另一个按钮。所以说优先考虑我按下的最后一个按钮的功能。

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

https://youtu.be/aPZii5HfP4s

这是我的角色移动的代码。

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;
        }
    }
}

感谢帮助

【问题讨论】:

    标签: c# unity3d 2d-games


    【解决方案1】:

    执行此操作的一种简单方法是将一个轴优先于另一个轴,然后将另一个检查包含在一个条件中。

    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;
    }
    

    【讨论】:

      【解决方案2】:

      由于我无法评论此帖子,因此作为答案分享,您应该查看最近发布的新输入系统统一:https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/QuickStartGuide.html

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

      【讨论】:

        【解决方案3】:

        您只能在代码中处理每个机会的轴中处理运动,请在下面找到草稿:

        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);
        }
        

        【讨论】:

          【解决方案4】:

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

          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;
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-11
            • 1970-01-01
            相关资源
            最近更新 更多