Velocity и AddForce () не работают в Unity

В своей игре FPS я пытаюсь заставить своего игрока бросить гранату. Я знаю, что есть подобные вопросы, но сообщения старые, и их ответы мне совсем не помогли. Когда я попытался бросить гранату с помощью метода AddForce (), граната просто появилась прямо перед игроком, как будто метод AddForce () никогда не вызывался. То же самое произошло, когда я установил для него значение скорости. Похоже, граната вообще не сдвинется с места! Я убедился, что:

  • Граната НЕ кинематическая
  • Не работает как при включенной, так и при выключенной гравитации
  • Позиции / вращения не заморожены
  • К нему прикреплено твердое тело
  • К гранате не прикреплен контроллер персонажа.
  • Масса всего одна

Мой код ниже:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;



public class Script : MonoBehaviour {
    [SerializeField] GameObject grenade;
    public int throwForce = 30;
    Vector3 spawnPosition;

// Use this for initialization
void Start () {
        instantiateVariables ();
}   
    void instantiateVariables(){



    }
    void throwGrenade(){

        print (spawnPosition);
        GameObject tempGrenade = (GameObject)   Instantiate (grenade, spawnPosition, transform.rotation);
    Vector3 direction = new Vector3(transform.forward.x, transform.forward.y, transform.forward.z );

        Rigidbody rb = grenade.GetComponent<Rigidbody> ();          
    if (rb  != null){
    rb.velocity = direction.normalized * 10f;
        Destroy (tempGrenade, 10);
    }
    else {
        Debug.LogError ("There is no rigid body on your cube!");
    }

    }
// Update is called once per frame
void Update () {


    spawnPosition = transform.forward + transform.position;
    print (spawnPosition);
        if (Input.GetMouseButtonDown (1)) {
            throwGrenade ();
        }

}


}

Инспектор:

Инспектор


person Aaron Ge    schedule 16.04.2016    source источник


Ответы (1)


Разве вы не должны хранить компонент жесткого тела tempGrenade в rb вместо жесткого тела гранаты? Я бы порекомендовал использовать жесткое тело tempGrenade, а затем изменить rb.velocity.

Нравиться:

rb = tempGrenade.GetComponent<Rigidbody> ();

РЕДАКТИРОВАТЬ: исправлена ​​строка кода, удалив поле скорости.

person Dayman75    schedule 16.04.2016
comment
Как ни странно, приведенная выше строка не должна работать, потому что она пытается назначить ссылку на компонент твердого тела в поле скорости (которое, как я полагаю, является Vector3). но до тех пор, пока OP работает, я думаю ...: D - person yes; 19.04.2016
comment
Я полагаю, что спрашивающий исправил это, иначе будет выдано сообщение об ошибке. - person Dayman75; 19.04.2016