我对Unity很陌生,所以我这样做可能不是最好的方法,但是当角色跳跃时它是不一致的。
一些反弹比其他反弹更多,我不确定为什么会这样。
此外,如果我快速按下向上箭头,立方体会跳得很快,但如果我等了几秒钟就会像往常一样反弹。
这是我的代码:
using UnityEngine;
using System.Collections;
public class MovePlayer : MonoBehaviour
{
Vector3 endPos;
int numBackwards = 0;
bool jumping = false;
public Rigidbody rigidBody;
//public Collider theCollider;
void Start()
{
rigidBody = GetComponent<Rigidbody> ();
}
// Update is called once per frame
void Update()
{
rigidBody.freezeRotation = true;
endPos = gameObject.transform.position;
if (!jumping)
{
if (Input.GetButtonDown("up") && gameObject.transform.position == endPos) {
if (numBackwards < 0)
{
numBackwards++;
}
else
{
UpdateScore.score++;
}
transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
transform.Translate(Vector3.forward * 110 * Time.deltaTime, Space.World);
}
else if (Input.GetButtonDown("down") && gameObject.transform.position == endPos)
{
transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
transform.Translate(-Vector3.forward * 110 * Time.deltaTime, Space.World);
numBackwards--;
}
else if (Input.GetButtonDown("left") && gameObject.transform.position == endPos)
{
transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
transform.Translate(Vector3.left * 110 * Time.deltaTime, Space.World);
}
else if (Input.GetButtonDown("right") && gameObject.transform.position == endPos)
{
transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
transform.Translate(Vector3.right * 110 * Time.deltaTime, Space.World);
}
}
}
void OnCollisionEnter(Collision other)
{
if (other.gameObject.CompareTag("Ground"))
jumping = false;
}
void OnCollisionExit(Collision other)
{
if (other.gameObject.CompareTag("Ground"))
jumping = true;
}
}
答案 0 :(得分:1)
不是翻译对象,而是利用rigidbodys为其添加力量的能力。我还用更简单的方法替换了碰撞事件。它检查物体中心和地面之间的距离。 (显然你仍然可以使用你的方式)。 FixedUpdate确保定期调用代码,而不是取决于帧速度。 (有关该主题的更多信息Here)
//PUBLIC
public float distance;
public float fspeed;
public float uspeed;
//PRIVATE
private Rigidbody rigidBody;
void Awake()
{
rigidBody = GetComponent<Rigidbody>();
rigidBody.freezeRotation = true;
}
void FixedUpdate()
{
if (Physics.Raycast(transform.position, -Vector3.up, distance + 0.1F))
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
rigidBody.AddForce(new Vector3(0, uspeed, fspeed));
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
rigidBody.AddForce(new Vector3(0, uspeed, -fspeed));
}
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
rigidBody.AddForce(new Vector3(fspeed, uspeed, 0));
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
rigidBody.AddForce(new Vector3(-fspeed, uspeed, 0));
}
}
}
public float distance
距离地面的最小距离是否可以再次跳跃
public float fspeed
前进或侧向速度(跳跃距离)
public float uspeed
是向上速度(跳跃高度)