【问题标题】:Stuttering movement in Unity 2DUnity 2D 中的口吃运动
【发布时间】:2018-11-14 18:08:18
【问题描述】:

所以基本上我试图让玩家移动系统类似于 RPG Maker 中的一个具有 8 个方向的移动系统。不知何故,我成功了,但只是部分成功。当我试图突然改变前任的方向时。从上到左,角色口吃,不想在不先释放所有键的情况下移动。

重力比例被禁用或更像设置为0,身体类型是动态的。

这是一个代码:

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

public class MoveChar : MonoBehaviour {

Rigidbody2D rigid;

public float Speed;

// Use this for initialization
void Start () {

    rigid = GetComponent<Rigidbody2D>();

}

// Update is called once per frame
void Update () {

//        float horiz = Input.GetAxis("Horizontal");

//        float vert = Input.GetAxis("Vertical");

    if(Input.GetKeyDown(KeyCode.W)) //________________________________________MOVING UP

    {
        rigid.velocity = new Vector2(rigid.velocity.x, 1 * Speed);
    }
    else if(Input.GetKeyUp(KeyCode.W))
    {
        rigid.velocity = new Vector2(0, 0);
    }

    if (Input.GetKeyDown(KeyCode.S)) //_______________________________________MOVING DOWN
    {
        rigid.velocity = new Vector2(rigid.velocity.x, -1 * Speed);
    }
    else if (Input.GetKeyUp(KeyCode.S))
    {
        rigid.velocity = new Vector2(0, 0);
    }


    if (Input.GetKeyDown(KeyCode.A)) //_______________________________________MOVING LEFT
    {
        rigid.velocity = new Vector2(-1 * Speed, rigid.velocity.y);
    }
    else if (Input.GetKeyUp(KeyCode.A))
    {
        rigid.velocity = new Vector2(0, 0);
    }

    if (Input.GetKeyDown(KeyCode.D)) //_______________________________________MOVING RIGHT
    {
        rigid.velocity = new Vector2(1 * Speed, rigid.velocity.y);
    }
    else if (Input.GetKeyUp(KeyCode.D))
    {
        rigid.velocity = new Vector2(0, 0);
    }
}

【问题讨论】:

  • 您需要在每次抬起键时停止将速度设置为零。在这种情况下,您只想修改向量的一个分量,并且您还需要考虑键的状态以朝相反的方向移动。另外,您不使用Input.GetAxis 有什么原因吗?它做了很多你在这里尝试做的事情。
  • 正如 Ruzihm 所说,我首先要尝试的不是设置 (0,0),而是仅更改 x y 在另一种情况下您更改的相应的如果。
  • 没有理由不使用 Axis,我根本不知道要使用它。我之前尝试过使用它,但我无法将它实现为负值(即使我尝试在它前面加上'-',由于某些原因它也不起作用)。当我不将值设置为0时,抬起键后为0,角色将按照设定的方向飞行,我不知道有什么其他方法可以阻止它。
  • @lubeszz 我编辑了我的答案,如果必须的话,包括如何使用Input.GetKeyUp/GetKeyDown

标签: c# unity3d 2d


【解决方案1】:

使用Input.GetAxis(axisName) 来避免输入代码中的大小写冲突。此外,使用 AddForce 可以很好地与其他刚体配合使用。

Vector2 oldV = rigid.velocity;
float horiz = Input.GetAxis("Horizontal");
float vert = Input.GetAxis("Vertical");

Vector2 newV = new Vector2(horiz * Speed, vert * Speed);
rigid.AddForce(newV-oldV, ForceMode2D.Impulse);

或者,当键被抬起/按下时,跟踪你自己的轴

public float horiz;
public float vert;

void Start() {
    horiz = 0f;
    vert = 0f;
    if (Input.GetKey(KeyCode.A)) horiz -= 1f;
    if (Input.GetKey(KeyCode.D)) horiz += 1f;
    if (Input.GetKey(KeyCode.S)) vert -= 1f;
    if (Input.GetKey(KeyCode.W)) vert += 1f;
}

void Update () {
    Vector2 oldV = rigid.velocity;

    if(Input.GetKeyDown(KeyCode.W)) vert += 1f;
    else if(Input.GetKeyUp(KeyCode.W)) vert -= 1f;

    if (Input.GetKeyDown(KeyCode.S)) vert -= 1f;
    else if (Input.GetKeyUp(KeyCode.S)) vert += 1f;

    if (Input.GetKeyDown(KeyCode.A)) horiz -= 1f;
    else if (Input.GetKeyUp(KeyCode.A)) horiz += 1f;

    if (Input.GetKeyDown(KeyCode.D)) horiz += 1f;
    else if (Input.GetKeyUp(KeyCode.D)) horiz -= 1f;

    Vector2 newV = new Vector2(horiz * Speed, vert * Speed);
    rigid.AddForce(newV-oldV, ForceMode2D.Impulse);
}

【讨论】:

  • 如果这对回答您的问题最有帮助,请点击投票按钮下方的灰色复选标记,将其标记为选定答案。这将帮助有类似问题的人在未来找到这个答案。它还会给我一些 Stack Overflow 积分 ;)
【解决方案2】:

释放按钮只有一个小问题。在不受键影响的方向上添加原力。整个脚本应该是这样的:

void Update()
{
    if (Input.GetKeyDown(KeyCode.W)) //________________________________________MOVING UP
    {
        rigid.velocity = new Vector2(rigid.velocity.x, 1 * Speed);
    }
    else if (Input.GetKeyUp(KeyCode.W))
    {
        rigid.velocity = new Vector2(rigid.velocity.x, 0);
    }

    if (Input.GetKeyDown(KeyCode.S)) //_______________________________________MOVING DOWN
    {
        rigid.velocity = new Vector2(rigid.velocity.x, -1 * Speed);
    }
    else if (Input.GetKeyUp(KeyCode.S))
    {
        rigid.velocity = new Vector2(rigid.velocity.x, 0);
    }


    if (Input.GetKeyDown(KeyCode.A)) //_______________________________________MOVING LEFT
    {
        rigid.velocity = new Vector2(-1 * Speed, rigid.velocity.y);
    }
    else if (Input.GetKeyUp(KeyCode.A))
    {
        rigid.velocity = new Vector2(0, rigid.velocity.y);
    }

    if (Input.GetKeyDown(KeyCode.D)) //_______________________________________MOVING RIGHT
    {
        rigid.velocity = new Vector2(1 * Speed, rigid.velocity.y);
    }
    else if (Input.GetKeyUp(KeyCode.D))
    {
        rigid.velocity = new Vector2(0, rigid.velocity.y);
    }
}

希望对你有帮助。

【讨论】:

  • 有点帮助,但还是有些卡顿
  • 附加:将刚体组件的插值参数改为“插值”
  • 如果你同时按下 A 和 D 然后只释放 D,这段代码根本不会水平移动身体。
  • 我不确定是否需要@Ruzihm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
相关资源
最近更新 更多