Unity中的水平移动

时间:2015-11-03 16:10:47

标签: c# unity3d

我是Unity的新手,我试图在经典的2D地图上移动一个简单的方块(超级马里奥像)。

我使用addForce跳转,它按计划进行。 但现在,我正试图横向移动我的角色。

首先,我尝试使用tramsform.translation(),我很快注意到这不是正确的方法,因为这种方法“传送”了角色,如果它移动太快,它可以传送到墙后面。我也尝试使用addForce,但我希望我的角色具有恒定的速度,并且它会产生惯性,因此当我释放按键时它不会立即停止。我也尝试使用.MovePosition(),但角色正在用这种方法摇晃(显然,由于引力)。

那么,是什么方法可以移动一个角色(Rigidbody2D)?

这是我的代码与不同的尝试:

using UnityEngine;
using System.Collections;
public class test : MonoBehaviour {
    private Rigidbody2D rb;
    public Vector2 velocity;
    public float jumpforce;
    // Use this for initialization
    void Start () {
        rb = GetComponent<Rigidbody2D>();
    }

// Update is called once per frame
void Update () {
    Debug.Log(velocity);
    if (Input.GetKeyDown("space")){
        rb.AddForce(new Vector2(0, jumpforce), ForceMode2D.Impulse);
    }
    if (Input.GetKey("a")){ // move to the left
        rb.AddForce(-velocity * Time.deltaTime, ForceMode2D.Impulse);
        //rb.MovePosition(rb.position - velocity * Time.fixedDeltaTime);
        //transform.Translate(-velocity);
    }
    if (Input.GetKey("d")){ // move to the right
            rb.AddForce(velocity * Time.deltaTime, ForceMode2D.Impulse);
            //rb.MovePosition(rb.position + velocity * Time.fixedDeltaTime);
            //transform.Translate(velocity);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果你想要一个&#34;物理学&#34;基于运动然后你应该对Rigidbody施加力量。作用于刚体的好处是它会考虑与物体碰撞(如墙壁)。

Here是一个很棒的介绍教程(它的3D,但相同的概念适用于2D)。这是该教程中的代码,并进行了一些修改以使其成为2D:

if (!EmptyFieldCheck('Hardware')) { return false; } else { return true; }

我们可以通过更改using UnityEngine; using System.Collections; public class PlayerController : MonoBehaviour { public float speed; // Here we set a float variable to hold our speed value private Rigidbody2D rb; // This is to hold the rigidbody component // Start is called as you start the game, we use it to initially give values to things void Start () { rb = GetComponent<Rigidbody2D>(); // Here we actually reference the rigidbody. } void FixedUpdate () { // We assign values based on our input here: float moveHorizontal = Input.GetAxis ("Horizontal"); float moveVertical = Input.GetAxis ("Vertical"); // Here we assign those values to a Vector2 variable. Vector2 movement = new Vector2 (moveHorizontal, moveVertical); rb.AddForce (movement * speed); // Finally we apply the forces to the rigidbody } } ForceMode2D参数来更改力作用于刚体的方式。例如,AddForce

  

使用质量为刚体添加力。

ForceMode2D.Force

  

使用质量为刚体2D添加瞬时力脉冲。

这对跳跃等事情更好。

  • 注意 - 最好将基于物理的方法调用放在ForceMode2D.Impulse中,而不是放在FixedUpdate中,因为帧率依赖。
  • 还要注意 - 当你对一个物体施加一个力时,它会加速,因为你在一个质量(刚体)上作用并根据其他力量(friction等减速)。如果你想要你的玩家停下来而不是停止死亡,考虑一下作用于球员的力量。此外,如果你根据FixedUpdate对刚体施加一次力,如果你选择Update,这将导致你想要的恒定速度,因为在相反方向作用的其他力将平衡它(见下图 - 信用到http://www.school-for-champions.com/用于图片)。

enter image description here

<小时/> 编辑:关于上面rutter的评论,here是2D角色控制器的入门教程。

答案 1 :(得分:2)

就个人而言,我使用这样的设置:

Rigidbody2D rb;
[SerializeField] [Range(0, 1)] float LerpConstant;
//Other stuff here
FixedUpdate() {
    float h = Input.GetAxisRaw("Horizontal");
    Vector2 movement = new Vector2(h, rb.velocity.y);
    rb.velocity = Vector2.Lerp(rb.velocity, movement, LerpConstant);
}

Lerp只是意味着“从A到B取一个'x'量的Vector2,然后返回它”。因此,代码创建一个运动矢量,即水平运动(用户输入),垂直运动(刚体已经具有的垂直运动),然后将当前速度提取到它。通过直接修改速度,只要您知道如何正确操作,它就可以确保您的运动保持平稳和恒定。