Ваш код всегда отправляет объект по оси 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;
}
}
}
В этом примере все, что я сделал, это создал куб в качестве игрока, создал шар в качестве снаряда и превратил его в сборный объект. Затем я прикрепил этот скрипт к кубу плеера.