繁体   English   中英

Unity 2D 中的口吃运动

Stuttering movement in Unity 2D

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

所以基本上我试图让玩家运动系统像 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);
    }
}
2 个回复

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

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

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

我希望这可以帮助你。

1 unity 2D 摇杆运动

**嗨,我正在尝试做一些操纵杆运动,当角色离开时,角色精灵将面朝左翻转。 它实际上看起来像工作,但事实并非如此。 当角色越过红线左侧时,它向左转,当它移动到右侧时,它向右转。 那么我该如何解决这个问题? **我的代码; ...

2 统一 2D 的物理运动

我有一个 XY 位置的球员。 对于 x 区域,玩家的滑动位置必须在 1 上增加或减少。 试图通过addForce和velocity来做到这一点,但这些方法正在将 x-area pos 增加到无穷大。 那么 - 在(0,0)之后,我如何停止增加位置(1,0)? 或 mb 有什么其他方法可以帮助我吗? ...

3 2D基本机芯UNITY

目前,我的角色在键盘上可以正常工作,但是当我通过3个UI按钮将您的动作转换为触摸时(我也尝试过UI图像,但是成功了),我没有成功 它基本上是向右,向左和跳跃。 请按照以下说明进行操作: 当用户按下方向键时,角色不会停止行走,直到用户用户释放按钮,并且当您按下跳转播放器时才跳转。 ...

4 Unity 2D 播放器运动

我在我的电脑上进行了我的统一运动,但是当我尝试在我的 android 上玩时,它根本不适合我。 我相信这可能是我忽略的一个小错误,但我会非常感谢任何帮助! 如果有任何帮助,当我尝试运行我的代码时,我没有收到任何错误! 我将提供以下代码: ...

5 Unity 2D角色移动

对于我要构建的游戏,我希望在按住“ W / A / S / D”时移动播放器对象。 例如,如果我想向右移动,则必须按住'D'。 我尝试使用Rigidbody2D.AddForce,但我不喜欢它创建的运动的感觉。 我正在寻找即时运动和停止,而不是任何加速/减速。 有任何想法 ...

6 Unity Player 2D 运动

尊敬的程序员您好, 我在学校有一个项目要在 Unity 中编写游戏。 Unity 非常难以理解,而且还有它的所有附加功能。 我想从另一款游戏中汲取灵感,制作一款类似 Pokémon 的游戏。 我找到了这个源代码并对其进行了一些更改,以适应我的游戏。 但我发现它可以让我的玩家在瓷砖之间移动。 我 ...

7 Unity 中的 2D 运动错误

我正在尝试在 Unity 中制作 2D 太空射击游戏,但偶然发现了一个需要修复的错误。 我正在使用 Unity 2021.1.0f1 和 Unity 中的新输入系统,我正在尝试为我的角色实现运动。 当我按下 WASD 键时,我的角色出于某种原因在每次按下时移动 15 个单位。 我不想要那个,我想要我 ...

8 统一的 2D 布娃娃运动

我尝试和我的兄弟一起制作布娃娃游戏,但问题是我们尝试制作布娃娃运动,我们可以制作运动,但是当我们在布娃娃上尝试这种运动时,它变得非常正常。 我们知道我们需要骨头之类的东西,但我们不知道如何制作这样的脚本。 我们不想在 YouTube 上看到教程,我们想制作一个我们想要的脚本。 任何人都知道我们如何做 ...

10 Unity 2d Movement脚本问题

因此,我在Unity中制作了一个2d平台游戏(对于c#和Unity来说也是新手),并且我试图为一个简单的正方形制作一个移动脚本,该正方形将随机停止移动,跳起来重新开始运动,只为再次发生。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM