我是C#编程的新手。
我在一个平面上有一个球体刚体。
我希望在按下空格键时使此球体跳跃,然后反弹两次,然后在释放该键时再次休息。
这并不总是在平面上它有时会在物体上,我希望反弹的高度反映从初始跳跃下降的距离。
我目前有一台摄像机从侧面朝向球体,并让它从一定距离跟随球。球体可以向任何方向移动,但相机始终与球体保持同一侧和距离。
问题是我的代码目前说(据我所知)如果未按下空格键尝试向下移动球体的Y位置,然后如果按下空格键则使球体跳跃然后再回来在空格键上发布。
编写这段代码的方式会让我的飞机跳起来,因为当没有按下空格键时球会不断弹跳,但是如果我拿出那部分球就会拒绝掉落。
示例代码:
public class RollAdvancedScript : MonoBehaviour
{
public Transform camera;
public float posY;
void lol()
{
posY = transform.position.y;
}
void Update()
{
if (Input.GetKey(KeyCode.D))
{
Vector3 vectorToUse = camera.right;
vectorToUse.y = 0;
transform.position += vectorToUse * Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.A))
{
Vector3 vectorToUse = -camera.right;
vectorToUse.y = 0;
transform.position += vectorToUse * Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.S))
{
Vector3 vectorToUse = -camera.forward;
vectorToUse.y = 0;
transform.position += vectorToUse * Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.W))
{
Vector3 vectorToUse = camera.forward;
vectorToUse.y = 0;
transform.position += vectorToUse * Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.Space))
{
Vector3 vectorToUse = camera.up;
transform.position += vectorToUse * Time.deltaTime * 10;
}
else
{
if ( posY >= 0)
{Vector3 vectorToUse = camera.up;
transform.position -= vectorToUse * Time.deltaTime * 10;
}
else
{
Vector3 vectorToUse = camera.up;
vectorToUse.y = 0;
transform.position -= vectorToUse * Time.deltaTime * 10;
}
}
}
}
示例图片:
请忽略阴影,因为它现在无法正常工作。
TLDR;当相对于固定的摄像机位置移动时,使Keypress上的物体跳跃和下降的最佳方法是什么?
答案 0 :(得分:3)
你是想在动画或物理学中处理这个问题吗?看看代码它看起来像纯粹的控制器动画,所以我建议你明确地跟踪你的跳跃状态而不是仅使用y> 0检查每次更新。如果你知道对象的状态,那么看看会发生什么事情要容易得多。
当您点击空格时,您的代码会使您看起来像(10 * deltaTime)弹出,然后立即弹出10,直到您低于零。你是否期望玩家能够保持飞行空间,喷气背包式?否则你应该给出一个初始冲动,然后从中减去以给出一个平稳的下降。
这是一个非常简单的例子。向上矢量是世界上的(不是像你的例子中的摄像头),但如果你的摄像机没有滚动,结果将是相同的。
public class DoJump : MonoBehaviour {
public float JumpSpeed = .25f;
public bool Jumping;
Vector3 jumpVec;
void Start () {
Jumping = false;
}
void Update () {
if (Jumping)
{
transform.position += jumpVec * Time.deltaTime;
jumpVec += (Vector3.down * Time.deltaTime);
//accelerate downward one unit per second per second
}
else
{
if (Input.anyKeyDown)
{
Jumping = true;
jumpVec = Vector3.up * (JumpSpeed * Time.SmoothDeltaTime);
// impulse up @ jumpSpeed units per second
}
}
}
void LateUpdate()
{
if (transform.position.y < 0)
{
transform.position = new Vector3(transform.position.x, 0, transform.position.z);
Jumping = false;
}
}
}
如果你的地形不平整,你应该使用物理碰撞器或光线投射来知道什么时候停止下降。
答案 1 :(得分:1)
这是我的代码,希望它可以帮到你:
public class Player : MonoBehaviour
{
public float m_gravity=10f;
void Jump()
{
if (m_ch.isGrounded) //this is the point
{
m_Gravity = 10;
if (Input.GetKeyDown(KeyCode.Space))
{
m_Gravity = -8;
}
}
else
{
m_Gravity += 10f * Time.deltaTime;
if (m_Gravity >= 10) { m_Gravity = 10; }
}
}
}