【发布时间】:2016-01-14 03:03:17
【问题描述】:
脚本使用逼真的重力使游戏对象跳跃并到达特定目标。 GameObject relative 跳转到目标,从而调整其轨迹。它在目标点移动时也有效。
当 GameObject 到达目标时,目标会跳到更高的位置 (position.y += 50) 并且 GameObject 会朝那里跳跃。因此,我们有一个“连续跳跃循环”。
脚本:
using UnityEngine;
using System.Collections;
public class Jumper : MonoBehaviour
{
public Vector3 _gravity = 9.8f * Vector3.down;
public bool stillJumping = true;
public GameObject Target1;
public void SetVelocityToJump(GameObject goToJumpTo, float timeToJump)
{
StartCoroutine(jumpAndFollow(goToJumpTo, timeToJump));
}
private IEnumerator jumpAndFollow(GameObject goToJumpTo, float timeToJump)
{
var startPosition = transform.position;
var targetTransform = goToJumpTo.transform;
var lastTargetPosition = targetTransform.position;
var initialVelocity = getInitialVelocity(lastTargetPosition - startPosition, timeToJump);
var progress = 0f;
while (progress < timeToJump)
{
progress += Time.deltaTime;
if (targetTransform.position != lastTargetPosition)
{
lastTargetPosition = targetTransform.position;
initialVelocity = getInitialVelocity(lastTargetPosition - startPosition, timeToJump);
}
transform.position = startPosition + (progress * initialVelocity) + (0.5f * Mathf.Pow(progress, 2) * _gravity);
yield return null;
}
OnFinishJump(target, timeToJump);
}
private void OnFinishJump(GameObject target, float timeToJump)
{
if (stillJumping)
{
Vector3 temp1 = Target1.transform.position;
temp1.y += 12.5f;
Target1.transform.position = temp1;
StartCoroutine(jumpAndFollow(target, timeToJump));
}
}
private Vector3 getInitialVelocity(Vector3 toTarget, float timeToJump)
{
return (toTarget - (0.5f * Mathf.Pow(timeToJump, 2) * _gravity)) / timeToJump;
}
}
使用上面的脚本,游戏对象总是从它到达的位置跳转。这就是我所说的“连续跳跃循环”的意思
JumpTarget 的脚本:
public class JumpTarget : MonoBehaviour
{
public Jumper Jumper;
public float TimeToJump;
public void Start()
{
if (Jumper != null) Jumper.SetVelocityToJump(gameObject, TimeToJump);
}
}
这里的问题是:我们怎样才能让 GameObject 继续在 (Input.GetMouseButtonUp(0)) 上跳跃每次(不仅仅是第一次跳跃)?我不能安静地想通出去。
下面的代码应该可以实现这一点,但 GameObject 甚至不跳转!
if (Input.GetMouseButtonUp(0) && Jumper != null) Jumper.SetVelocityToJump(gameObject, TimeToJump);
我尝试调试,但不幸的是,我的 Unity 编辑器每次都崩溃。
编辑:我抱怨我的脚本按应有的方式运行
(Input.GetMouseButtonUp(0) 如果我的脚本适合您,请上传一个示例项目,其中我的脚本可以正常工作,作为答案。我怀疑我的其他脚本正在干扰...谢谢。
【问题讨论】:
-
你的代码是在
JumpTarget的Update()函数中使用了Input.GetMouseButtonUp吗? -
@Adam H 问题已编辑。