每当我尝试停止移动对象时,Unity就会崩溃

时间:2018-10-29 07:41:04

标签: c# unity3d transform monodevelop rigid-bodies

我正在制作一个非随机生成的亚军游戏,我正在尝试编写老板进入和战斗的代码。因此,游戏由一个一直在屏幕上的宇航员(玩家)组成(因此,他,背景和相机永远都不会移动,玩家可以移动但受到限制)。

所有危险都移到玩家身上,他必须避免或击败它们,直到最后一个危险是上司。老板在这条线的尽头,沿着z轴也朝玩家方向移动,我希望它在与Quad碰撞时停止,因此老板是静态的,他们可以战斗。

之后,我希望老板上下移动并使用Lerp功能射击玩家。

代码如下:

public class BossController : MonoBehaviour {

public float speed;
public float health;
public Animator anim;
public Transform startMarker;
public Transform endMarker;

private Rigidbody rb;
private HUDController hud;
private bool startIntro = false;

private float startTime;
private float journeyLength;

void Start () {
    startTime = Time.time;
    journeyLength = Vector3.Distance (startMarker.position, endMarker.position);

    anim = GetComponent<Animator> ();
    rb = GetComponent<Rigidbody> ();
    rb.velocity = transform.forward * -speed;

}

void Update(){

    //transform.position += transform.forward * -speed * Time.deltaTime;


    if (startIntro) {
        rb.velocity = new Vector3(0,0,0);
        Fight ();
    }
}

void Fight(){

    float distCovered = (Time.time - startTime) * speed;
    float fracJourney = distCovered / journeyLength;

    while(true)
    {
        transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney);
        transform.position = Vector3.Lerp(endMarker.position, startMarker.position, fracJourney);
    }
}

void OnTriggerEnter(Collider other){
    if (other.gameObject.CompareTag ("bossEntry")) {
        startIntro = true;
        //anim.SetTrigger ("quad"); 
    }
}

}

我首先尝试使用刚体,当刚体碰撞时,刚体的速度为0,并且只要注释了Fight()方法,就可以正常工作。那也许是因为lerp函数吗?

当老板击中对撞机时,它没有被注释,一切都冻结了,我不能再使用Unity了,我必须重新启动程序。

请帮助!

编辑:我删除了while(true)循环,现在当boss与quad碰撞而不是紧绷时,boss掉落了。凸台位于空对象下方,起始标记和结束标记也位于空对象下方。每个组件都附加到空对象(父对象)上。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

尝试并跟踪(打印)您的验证字的值。 我猜你这里的除数为0- float fracJourney = distCovered / flyingLength;

如果不是,则很可能是无休止的循环或至关重要的空指针。

答案 1 :(得分:0)

对不起,我现在才注意到这一点。

transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney);
transform.position = Vector3.Lerp(endMarker.position, startMarker.position, fracJourney);

第二个Lerp立即覆盖第一个的值。如果您想要类似乒乓球的效果,请标记以确定所需的当前状态。

bool toEndMarker = true;
void Fight() {
    //Some code here
    if(toEndMarker)
    {
        transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney);
        if(//DETERMINE if transform.position is already at end marker)
        {
            toEndMarker = false;
        }
    }
    else
    {
        transform.position = Vector3.Lerp(endMarker.position, startMarker.position, fracJourney);
        if(//DETERMINE if transform.position is already at start marker)
        {
            toEndMarker = true;
        }
    }
}