【问题标题】:Unity crashes every time I try to stop the movement of my object每次我尝试停止对象的移动时,Unity 都会崩溃
【发布时间】:2018-10-29 07:41:04
【问题描述】:

我正在制作一个非随机生成的跑步游戏,我正在尝试编写老板进入和战斗的代码。所以游戏由一个一直停留在屏幕上的宇航员(玩家)组成(所以他,背景和相机永远不会移动,玩家可以移动但它被夹住了。

所有的危险都向玩家靠近,他必须避开它们或击败它们,直到最后一个危险是老板。老板在线的尽头,也沿着 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) 循环,现在当老板与四边形碰撞而不是 lerping 时,它会直接倒下。 Boss 位于空对象下方,开始和结束标记也位于空对象下方。每个组件都附加到空对象(父对象)。

【问题讨论】:

  • 顺便说一句我还没有实施拍摄
  • while(true) - 嗯,这是一个无限循环。您可能想要一种摆脱困境的方法。
  • 是的,但我希望老板无休止地玩弄直到被打败
  • 由于您在Update() 方法中调用Fight(),您可以在Fight() 中删除while(true)
  • 每帧都会调用Update()方法,所以Fight()也会每帧调用一次,因为它在Update()内部

标签: c# unity3d transform monodevelop rigid-bodies


【解决方案1】:

尝试跟踪(打印)您的变量的值。 我猜你这里的除数为 0 - 浮动 fracJourney = distCovered / JourneyLength;

如果不是,很可能你有一个无限循环,或者一个至关重要的空指针。

【讨论】:

    【解决方案2】:

    抱歉,我现在才注意到这一点。

    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;
            }
        }
    }
    

    【讨论】:

    • 谢谢!但我已经解决了,我附加了 2 个不同的脚本,一个是沿着 z 轴的运动,一个是 lerping,当它碰撞时,运动停止并且老板只是 lerps,它可以工作:)
    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多