【问题标题】:Movement controls (2D scene)运动控制(2D 场景)
【发布时间】:2018-07-28 10:18:00
【问题描述】:

我为 2D 自上而下的 RPG 编写的移动代码有问题。请原谅我缺乏知识,但我最近才不得不学习如何编码,这是我第一次尝试运动控制。期望的结果是有两种输入法;控制器和键盘。我想让它们分开,所以当你使用控制器时,你不能使用键盘,反之亦然。这是代码。

using UnityEngine;
using System.Collections;

public class playerMovement : MonoBehaviour 
{   

    public float Speed = 1;
    private float deadZone = 0.25f;    

    // START - Use this for initialization
    void Start () {}

    // UPDATE is called once per frame - Using deadZone to compensate for faulty controllers etc.... Using options for controller true or false to switch between keyboard and controller input.
    void FixedUpdate () 
    {

        Vector2 stickInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));

        if ( Options.useController == true)
        {
            if( Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.A))
            {
                stickInput = Vector2.zero;
            }
            else if ( stickInput.magnitude < deadZone)
            {
                stickInput = Vector2.zero;
            }
            else
            {
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime;
            }

        }

        //Here is keyboard input - this is working great.
        else if ( Options.useController == false)
        {
            if ( Input.GetKey(KeyCode.A) && Input.GetKey (KeyCode.W))
            {
                stickInput = new Vector2(-1f,1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime;  
            }
            else if ( Input.GetKey(KeyCode.W) && Input.GetKey (KeyCode.D))
            {
                stickInput = new Vector2(1f,1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.S) && Input.GetKey (KeyCode.D))
            {
                stickInput = new Vector2(1f,-1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.A) && Input.GetKey (KeyCode.S))
            {
                stickInput = new Vector2(-1f,-1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.W))
            {
                stickInput = new Vector2(0f,1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.D))
            {
                stickInput = new Vector2(1f,0f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if ( Input.GetKey(KeyCode.S))
            {
                stickInput = new Vector2(0f,-1f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }
            else if  ( Input.GetKey(KeyCode.A))
            {
                stickInput = new Vector2(-1f,0f);
                stickInput.Normalize();
                rigidbody2D.velocity = stickInput * Speed * Time.deltaTime; 
            }       
        }




    }
}

在执行顶部循环时出现问题。当useController 等于真时,我希望键的移动为空。只要按住键,它就可以很好地工作,但是一旦您释放键(A、D、S、W),它就会退出 if 语句,并且播放器会被剩余的 GetAxis 值移动。

我必须使用GetAxis 作为此循环中的控制器输入,不幸的是 Unity 会自动从键中获取值。有没有办法不仅可以将速度限制为 0,还可以确保释放键时GetAxis 的值也变为 0。

【问题讨论】:

  • 只是一个(非常快速的)建议:您是否尝试过使用 GetKeyDown() 而不是 GetKey()?顺便说一句,不知道这是否可以解决...
  • 我也可以试试这个看看它是否改变了什么。在键下设置速度和 GetAxis 是有道理的。好主意!
  • 很遗憾,这并没有解决问题,不过是个好主意!

标签: c# unity3d game-physics


【解决方案1】:

您必须使用rigidbody2d.velocity 将一个刚体2d 附加到要移动的对象上。但是,每帧都这样做并不是一个好主意。相反,您可以使用 transform.translate,或者如果您想通过使用刚体来保持物理模拟,请使用rigidbody2d.addforce。

此外,在编辑 > 项目设置 > 输入中,确保您从轴上移除 WSAD 键。

您的代码应该看起来更像这样

void FixedUpdate () 
{

    if (Options.useController)
    {
        // if the controller is enabled do this stuff
        Vector2 stickInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
    }
    else
    {
        // else if the controller is not enabled, do this stuff.
        stickinput = new Vector2(0, 0);
        if (Input.GetKey(KeyCode.W)
            stickinput += new Vector2(0, 1);
        if (Input.GetKey(KeyCode.S)
            stickinput += new Vector2(0, -1);
        if (Input.GetKey(KeyCode.A)
            stickinput += new Vector2(-1, 0);
        if (Input.GetKey(KeyCode.D)
            stickinput += new Vector2(1, 0);
        /* can have code like:
         * if (stickinput.x > 0)
         *     animator.crossfade("rightAnimation", 0f);
         * else if (stickinput.x < 0)
         *     animator.crossfade("leftanimation", 0f);
         * else
         *     animator.crossfade("standinganimation", 0f);
         */
    }

        transform.Translate(((stickinput.magnitude > 1) ? stickinput.normalized : stickinput) * speed * Time.fixedDeltaTime, Space.Self);

        // or use the one commented out below
        // rigidbody2D.AddForce(((stickinput.magnitude > 1) ? stickinput.normalized : stickinput) * speed * Time.fixedDeltaTime);


}

请注意,我没有使用 else if。如果有人持有 W 和 S,则 y 分量加到 0。我选择 Space.Self 进行本地平移,但您可以使用 Space.World 将其相对于全局轴移动。

【讨论】:

  • 感谢您的回答!我会试试这个,看看我得到了什么。我可能必须编辑也控制动画状态的代码,以使一切都好起来,但这看起来是一个好的开始。再次感谢您!
  • 我尝试实现上面的代码。如果我不在乎玩家可以在控制器启用时使用按键,它会很好用,但我会。我希望他们必须在两者之间做出选择。这意味着如果控制器已启用,则按键将被禁用。实现这一点后,当控制器启用时,没有什么能阻止用户使用按键。因此,按键的控制感觉很飘,可能会引起混乱。这是一个很好的尝试!
  • 显然我打算做一些不同的事情,忘记改变它什么的。我将 if (!Options.useController) 更改为 if (Options.useController) 另外,请确保您更改了项目设置下的输入设置。这将阻止玩家在控制器启用时使用按键。
  • 更改了答案以包含基于此输入方案更改动画状态的示例。此外,stickinput 可能应该在 FixedUpdate 之外声明。
  • 我一定错过了您在第一篇文章中说我必须从输入管理器中删除 WSAD。这实际上是我唯一必须做的事情,以实现我心中的目标。我绝对可以清理代码以匹配您的代码,以进行内务管理。非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多