Unity падает каждый раз, когда я пытаюсь остановить движение моего объекта - PullRequest
0 голосов
/ 29 октября 2018

Я создаю неслучайно сгенерированную игру раннер и пытаюсь закодировать вступление босса и бороться. Таким образом, игра состоит из астронавта (игрока), который все время остается на экране (поэтому он, фон и камера никогда не двигаются, так что игрок может двигаться, но он зажат.

Все опасности приходят к игроку, и он должен избегать их или победить их до последней опасности, которой является босс. Босс находится в конце линии и идет вдоль оси z к игроку, и я хочу, чтобы он остановился, когда он столкнется с квадом, так что босс статичен, и они могут сражаться.

После этого я хочу, чтобы босс двигался вверх и вниз и стрелял в игрока с помощью функций 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), и теперь босс падает прямо вниз, когда сталкивается с квадом вместо того, чтобы прыгать. Босс находится под пустым объектом, а начальный и конечный маркеры также находятся под пустым объектом. Каждый компонент привязан к пустому объекту (родителю).

enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Извините, я только что заметил это сейчас.

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;
        }
    }
}
0 голосов
/ 29 октября 2018

попытайтесь отследить (распечатать) значения ваших достоверных данных. Я думаю, у вас есть делитель 0 здесь - float fracJourney = distCovered / travelLength;

Если нет, скорее всего, у вас бесконечный цикл или нулевой указатель, который жизненно необходим.

...