Как заставить пули излучать прямо вперед, игнорируя физику игрока (катится)? - PullRequest
0 голосов
/ 08 апреля 2019

Проблема с моим кодом заключается в том, что пули будут в основном выпадать из объекта игрока, но я не могу заставить их стрелять прямо вперед, чтобы попасть в препятствия.Вместо этого, когда игрок катит каждое направление, пули выходят с одним и тем же заданным вектором, что не то, что я хочу.Мне бы хотелось, чтобы пули стреляли вдоль оси x, а вместо этого они стреляют со всех сторон в зависимости от того, как игрок катится.

В этом случае я попытался изменить вращение и силу пули, в случаечто сила пули изменила направление и импульс игрока.Это не удалось, поэтому я убрал форвардную силу игроков для тестирования, но по-прежнему никакого прогресса.

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{

    public Rigidbody rb;
    public float backwardForce = -60f;
    public float forwardForce = 100f;
    public float sidewaysForce = 1f;

    // Start is called before the first frame update
    void Start()
    {
        rb.AddForce(0, 100, 200);
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        //Movement force
        rb.AddForce(0, 0, 50.0f * Time.deltaTime);

        if (Input.GetKey("a"))
        {
            rb.AddForce(-sidewaysForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        }
        else if (Input.GetKey("d"))
        {
            rb.AddForce(sidewaysForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        }
        else if (Input.GetKey("w"))
        {
            rb.AddForce(forwardForce * Time.deltaTime, 0, 0, ForceMode.Force);
        }
        else if (Input.GetKey("s"))
        {
            rb.AddForce(backwardForce * Time.deltaTime, 0, 0, ForceMode.Force);
        }


        /*switch (Input.GetKeyDown())
         {

            // case Input.GetKeyDown("a"):


            //a: rb.AddForce(sidewaysForce * Time.deltaTime, 0, 0);

        }
    }
}
public class BulletShoot : MonoBehaviour
{

    //Reference to bullet emitter
    public GameObject Bullet_Emitter;

    //Reference to bullet prefab
    public GameObject Bullet;

    //Forward force of bullet
    public float Bullet_Force;// = 10.0f;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        //When "Space" key is pressed..
        if (Input.GetKey("space")){

            //Temp variable that will hold reference to bullet
            GameObject tempBulletHandler;

            //Temp then instantiates bullet to game using emitter position and angle
            tempBulletHandler = Instantiate(Bullet, Bullet_Emitter.transform.position, Bullet_Emitter.transform.rotation);

            //Corrects angle that bullets appear
            tempBulletHandler.transform.Rotate(Vector3.left * 180);

            //RigidBody instantiated to control bullet physics using bullet handler
            Rigidbody tempRigidBody = tempBulletHandler.GetComponent<Rigidbody>();

            //Add force to the rigidbody to simulate firing the bullet forward using set bullet force
            tempRigidBody.AddForce(Vector3.forward * Bullet_Force);

            //Free up space from bullets fired (after 4 sec)
            Destroy(tempBulletHandler, 4.0f);
        }
    }
}

Ожидается: игрок постоянно движется вперед, имея возможность стрелять препятствия в линейном направлении.

Факт: игрок движется правильно, но пули излучают без контроля, как рис, выпадающий из мешка с одним отверстием, которое продолжает вращаться во всех направлениях.

1 Ответ

1 голос
/ 17 апреля 2019

Это распространенная ранняя проблема, когда вы создаете экземпляр чего-то вроде пуль, стрелок или даже частиц из чего-либо, если вы создаете экземпляр (myprefab, transform) независимо от того, какое преобразование было назначено вам, теперь является родительским объектом. Таким образом, если этот экземпляр был боксом для игрока, это может быть хорошо, потому что по мере того, как родитель / игрок перемещается, бокс тоже будет двигаться, отлично. Не нужно кодировать это.

Представьте себе космических захватчиков, если вы обстреляли противника влево, а затем хотели направиться в крайнее правое положение, то, что вы ожидаете, это то, что ракета, которую вы послали, чтобы продолжать подниматься, в этой колонне противно, что в настоящее время произойдет ваша ракета, как вы двигались вправо, а также движется вправо. Вам нужно отключить ракету, чтобы она могла двигаться дальше и свободно двигаться в направлении, в котором вы ее выставили.

Короче говоря, вы должны установить missle.transform.SetParent (newParent); где newparent может даже быть нулевым, что помещает его на верхний уровень иерархии.

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