Как мне заставить пули вылетать прямо вперед, игнорируя физику игрока (перекатывание)?

#c# #unity3d

#c# #unity3d

Вопрос:

Проблема с моим кодом заключается в том, что пули в основном вылетают из объекта player, но я не могу заставить их стрелять прямо вперед, чтобы поразить препятствия. Вместо этого, когда игрок катится в каждом направлении, пули выходят с одним и тем же заданным вектором, что не то, что я хочу. Я бы хотел, чтобы пули стреляли только по оси 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. Если ваши пули связаны с чем-то, что движется, пули будут двигаться вместе с ним. Вы почти наверняка хотите удалить родительский элемент, чтобы сделать их независимыми

2. ОК… Но родителем является игрок, так как же это будет работать, если нет источника для стрельбы?

3. Но после выстрела они больше не зависят от игрока, они должны быть сами по себе, двигаться в своих направлениях.. подумайте, как space invaders, если вы стреляете и двигаетесь вправо, вы не хотите, чтобы ваша пуля двигалась вправо вместе с вами .. То же самое.. Вы порождаете его, но затем отключаете его, чтобы он мог жить своей собственной жизнью

4. Эй, действительно извините, как мне сделать так, чтобы вы ответили на вопрос? Ваши объяснения помогли мне лучше понять мою проблему, так что теперь я знаю, как это исправить, но до этого не дошло. был занят..

5. Позвольте мне указать то, что я сказал в ответе, тогда вы можете отметить это.

Ответ №1:

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

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

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

Комментарии:

1. Так что это трюк, используемый в фильме «Разыскивается». При съемке пули стрелок должен выйти за пределы экрана, чтобы заставить пулю двигаться.

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

3. харг, мой английский настолько плох, что я даже не могу пошутить. Да, это известная «функция» при создании экземпляров вещей. Это люди всегда обнаруживают при использовании снарядов и частиц. Поскольку они создают эффект изгиба, ими можно практически управлять, перемещая излучатель. Шутка была такая: «Если это работает таким образом на Unity, то вполне возможно, что это работает и в реальности, как в фильме, где они смогли изогнуть пулю. Возможно, бросая актера на большой скорости «. — Ваше объяснение понятно

4. Извини @xdtTransform, что я не понял твоей шутки. было бы здорово, если бы это было реально, не так ли

5. Ладно, значит, я все еще новичок в этом деле. Если мой объект игрока является сферой, должен ли я также освободить излучатель от игрока? Если да, то как бы я расположил его перед игроком, если бы игрок? Кроме того, должен ли я приказать выпустить пулю внутри if или отделить ее от излучателя?