Объект создается с собственным вращением, которое я не могу изменить - PullRequest
0 голосов
/ 16 июня 2020

В моем проекте Unity я пытаюсь создать сферу, которая движется вперед, когда игрок щелкает мышью. Когда создается сфера, она всегда движется в одном направлении, независимо от того, в какую сторону смотрит игрок. Я пробовал свои силы в установке go в том же направлении, что и игрок, но безрезультатно.

Как создать экземпляр объекта с таким же вращением, что и мой проигрыватель?

Код создания:

            if (polyWand.activeSelf == true)
    {
        Quaternion playerRotation = Quaternion.Euler(player.transform.rotation.x, player.transform.rotation.y, player.transform.rotation.z);
        Instantiate(fireSpellPrefab, SpellLocation, playerRotation);
    }

Поведение безумного объекта:

void Update ()
{
    Destroy(this, 5f);
    transform.rotation = Player.transform.rotation;
    transform.position += Vector3.forward * 9 * Time.deltaTime;
}

1 Ответ

1 голос
/ 16 июня 2020

Ваш код всегда отправляет объект по оси Z, потому что transform.position не знает, в каком направлении обращен объект. Это совершенно другой Vector3 по сравнению с вектором вращения. Чтобы заставить что-то двигаться в направлении относительно вращения объекта, попробуйте:

transform.position += transform.forward * 9 * Time.deltaTime;

Я не пробовал, но каждое преобразование имеет свой собственный вектор вперед. И поскольку преобразование содержит векторы вращения и положения, это должно сработать.

Но обычно для чего-то вроде этого вы должны использовать transform.forward, чтобы помочь с начальным позиционированием объекта, а затем использовать Rigidbody.velocity для фактического

Edit:

Я пробовал нечто подобное, и transform.forward сам предоставит начальную точку для вашего снаряда и направление движения. Я создал для вас пример.

public class PlayerControl : MonoBehaviour
{
    public float speed;
    public float projectileSpeed;
    public Transform projectile;

    private Transform instantiatedProjectile;

    private bool projectileLaunched;

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

    }

    // Update is called once per frame
    void Update()
    {
        var rotationAngle = 0f;

        if (Input.GetKey(KeyCode.A))
        {
            rotationAngle = -speed * Time.deltaTime;
            transform.Rotate(Vector3.up, rotationAngle);
        }

        if (Input.GetKey(KeyCode.D))
        {
            rotationAngle = speed * Time.deltaTime;
            transform.Rotate(Vector3.up, rotationAngle);
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            instantiatedProjectile = Instantiate(projectile, transform.forward, Quaternion.identity);
            projectileLaunched = true;
        }

        if (projectileLaunched)
        {
            var projPos = instantiatedProjectile.position;
            projPos += transform.forward * projectileSpeed;
            instantiatedProjectile.position = projPos;
        }
    }
}

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

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