每次我尝试停止对象的移动时,Unity 都会崩溃

问题描述 投票:0回答:2

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

所有的危险都向玩家袭来,他必须避开它们或击败它们,直到最后一个危险,即老板。 Boss 位于线的末端,并沿着 z 轴朝向玩家,我希望它在与四边形碰撞时停止,因此 Boss 是静态的,他们可以战斗。

之后我想让boss上下移动并用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 函数?

如果没有评论,当 Boss 撞到碰撞器时,一切都会冻结,我不能再使用 Unity,我必须重新启动程序。

编辑:我删除了 while(true) 循环,现在 Boss 在与四边形碰撞时会直接掉下来,而不是 lerping。 Boss 位于空物体下方,开始和结束标记也位于空物体下方。每个组件都附加到空对象(父对象)。

enter image description here enter image description here

c# unity-game-engine transform rigid-bodies
2个回答
0
投票

尝试跟踪(打印)您的变量的值。 我猜你这里的除数是 0 - float fracJourney = distCovered /旅程长度;

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


0
投票

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

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

第二个 Lerp 立即覆盖第一个 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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.