Почему AddExplosionForce не работает в моем коде? - PullRequest
0 голосов
/ 26 марта 2019

Что не так с этим кодом?Когда я запускаю ракету, это не влияет на персонажа.

Я пробовал искать другие места и т. Д., Но ничего не помогает.Я уже получил помощь, так что теперь, по крайней мере, код на самом деле выполняется.

using UnityEngine;
using System.Collections;

public class Rocket : MonoBehaviour
{
    //Public changable things
    public float speed = 20.0f;
    public float life = 5.0f;
    public float explosionForce = 1.0f;
    public float explosionRadius = 1.0f;
    public bool isGrounded;

    public Rigidbody rb;
    // Use this for initialization
    void Start()
    {
        Invoke("Kill", life);
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += transform.forward * speed * Time.deltaTime;

        if (isGrounded)
        {
            Kill();
        }
    }

    void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.tag == "Ground")
        {
            isGrounded = true;
        }
    }
    //
    void OnCollisionExit(Collision other)
    {
        if (other.gameObject.tag == "Ground")
        {
            isGrounded = false;
        }
    }
    //Explosion code
    void Kill()
    {
        Vector3 explosionCenterPosition = transform.position;
        rb.AddExplosionForce(explosionForce, explosionCenterPosition, explosionRadius);

        Destroy(gameObject);

    }
}

Я создаю игру, в которой вы прыгаете с ракетой, как TF2.Он также должен переместить другие жесткие тела, как описано здесь: https://docs.unity3d.com/ScriptReference/Rigidbody.AddExplosionForce.html

Я новичок в единстве и не знаю, почему это не сработает.

1 Ответ

0 голосов
/ 26 марта 2019

@ bobshellby

вы уничтожаете объект ракеты в том же кадре, в котором применяете силу взрыва.поэтому, прежде чем вы увидите эффект взрыва, ракета будет уничтожена.

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

void Start()
{
    //Invoke("Kill", life);
}

// Update is called once per frame
void Update()
{
    transform.position += transform.forward * speed * Time.deltaTime;

    if (isGrounded)
    {
      StartCoroutine( Kill());
    }
}

void OnCollisionEnter(Collision other)
{
    if (other.gameObject.tag == "Ground")
    {
        isGrounded = true;
    }
}
//
void OnCollisionExit(Collision other)
{
    if (other.gameObject.tag == "Ground")
    {
        isGrounded = false;
    }
}
//Explosion code
IEnumerator Kill()
{
    Vector3 explosionCenterPosition = transform.position;
    rb.AddExplosionForce(explosionForce, explosionCenterPosition, explosionRadius);
    yield return new WaitForSeconds(2f);
    Destroy(gameObject);

}

Другое дело, что вычерез 5 секунд после запуска запускается функция kill, которая снова уничтожает ракету.Удалите это, поскольку вы уже проверяете это в обновлении, если ракета упала на землю или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...