Как сказать объекту Unity двигаться вперед в направлении осей каждого из его родительских объектов? - PullRequest
0 голосов
/ 30 марта 2020

Я использовал простое учебное пособие по Unity для создания игры Space Invaders, но я хочу адаптировать ее к другой игре.

Учебное пособие позволяет управлять кораблем игрока вправо и влево, но я изменил его на управление вращением (что заняло какое-то время, потому что по какой-то причине сценарий почти не корректно ограничивал поворот установленными границами).

После сценария вращения я хотел, чтобы кадры двигались вперед на экране в направлении оси, к которой он порожден. Ось представляет собой пустой дочерний объект внутри объекта корабля, поэтому его собственные углы всегда установлены в 0.

Я видел оригинальную функцию, управляющую движением пули:

bullet.position += Vector3.up * speed;

все еще движется это вверх по экрану независимо от того, как пуля вращается. Итак, я попытался:

bullet.position += Vector3.forward * speed;

и увидел, что он перемещает пулю в ось Z.

По сути, я спрашиваю, есть ли какая-то подфункция Vector3, которая мне не хватает, которая перемещается объект в соответствии с направлением его собственной оси?

Вот коды двух классов:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShotSpawner : MonoBehaviour
{
    public GameObject shot;
    public Transform shotSpawn;
    public float fireRate;
    private float nextFire;
    // Start is called before the first frame update
    void Start()
    {
    }
    void Update()
    {
        if (Input.GetButton("Fire1") && Time.time > nextFire)
        {
            nextFire = Time.time + fireRate;
            Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletController : MonoBehaviour
{
    private Transform bullet;
    public float speed;
    // Start is called before the first frame update
    void Start()
    {
        bullet = GetComponent<Transform>();
    }
    void FixedUpdate()
    {
        bullet.position += Vector3.up * speed;
        if (bullet.position.y >= 10)
            Destroy(gameObject);
    }
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Enemy")
        {
            Destroy(other.gameObject);
            Destroy(gameObject);
            PlayerScore.playerScore++;
        }
        else if (other.tag == "Base")
            Destroy(gameObject);

    }
}

1 Ответ

1 голос
/ 30 марта 2020

Я нашел простое решение Требуемый код

transform.up

Вместо

Vector3.up

Преобразование идет по оси объектов, а Vector3 - по мировому пространству.

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