簡體   English   中英

如何在 Unity 2D 中禁用對角線移動?

[英]How do I disable diagonal movement in Unity 2D?

我想問一下是否有辦法在 Unity 2D 中禁用對角線移動。 問題是當我同時按下“W”+“D”(移動鍵)時,角色開始沿對角線移動。 因此,當我按下組合按鈕時,我希望它完全筆直地移動,而不是字符移動對角線,而不是如果我按下“d”或任何其他鍵移動,即使我仍然同時按下另一個按鈕。 所以說優先考慮我按下的最后一個按鈕的 function。

這是一個簡短的視頻,可以進一步解釋我的問題。

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

感謝幫助我正在嘗試制作的游戲

一種簡單的方法是將一個軸優先於另一個軸,然后將另一個檢查包含在一個條件中。

movement.x = Input.GetAxisRaw("Horizontal");
if (movement.x != 0)
{
    movement.y = Input.GetAxisRaw("Vertical");
}

但是,這可能會失敗,因為根據您的輸入,當使用 controller 時,軸可能會返回接近零的值。 在這種情況下,您可以獲取兩個值並檢查較大的值。

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

分享為答案,因為我無法對這篇文章發表評論,您應該查看最近發布的新輸入系統統一: https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/QuickStartGuide。 html

它可以更好地控制事件系統等輸入,因此您可以鎖定移動,直到釋放第一個鍵。

您只能在代碼中處理每個機會的軸中處理運動,請在下面找到草稿:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM