Я использовал простое учебное пособие по 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);
}
}