我是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);
}
}
}
答案 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
中,因为帧率依赖。Update
,这将导致你想要的恒定速度,因为在相反方向作用的其他力将平衡它(见下图 - 信用到http://www.school-for-champions.com/用于图片)。
答案 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,然后返回它”。因此,代码创建一个运动矢量,即水平运动(用户输入),垂直运动(刚体已经具有的垂直运动),然后将当前速度提取到它。通过直接修改速度,只要您知道如何正确操作,它就可以确保您的运动保持平稳和恒定。