#c# #unity3d #instantiation
Вопрос:
Я делал игру от первого лица под названием «бросай мяч в мусорное ведро». Камера находится в цилиндре, так как игрок также имеет столкновение с цилиндром.
Я боролся с главным драйвером игры. Как и в большинстве игр-шутеров от первого лица, вы стреляете из центральной точки камеры или курсора.
Мне трудно воспроизвести это. Код, который у меня есть до сих пор для съемки, таков:
Instantiate(prefab, new Vector3(Camera.main.transform.position.x, Camera.main.transform.position.y, Camera.main.transform.position.z), Camera.main.transform.rotation);
(Спасибо @derHugo за помощь в создании сборного экземпляра)
Но это просто порождает его поверх игрока, а не перед ним. Как мне заставить его стрелять в сторону от игрока, но также и перед игроком, а не сверху?
Ответ №1:
Для того, чтобы появиться перед этой позицией, просто используйте
// Already reference this via the Inspector if possible
[SerializeField] private Camera _camera;
// Adjust how far in front of the camera the object should spawn
[SerializeField] private float distance;
private void Awake ()
{
// otherwise get it ONCE
if(!_camera) _camera = Camera.main;
}
А затем просто добавьте смещение в направлении Transform.forward
камеры, например
Instantiate(prefab, _camera.transform.position _camera.transform.forward * distance, _camera.transform.rotation);
Комментарии:
1. О, привет @derHugo! Это работает! Куда бы я ни посмотрел, он стреляет мячом в том направлении.
Ответ №2:
таким образом, кажется, что, когда вы создаете экземпляры пуль, вы порождаете их непосредственно на позиции камеры. Вы должны настроить эти значения так, чтобы он появлялся в центре экрана. Для этого вам следует разделить положение y на 2 или 1,5 в зависимости от того, на какой высоте находится пистолет от земли. Затем измените z так, чтобы пули продвинулись дальше перед игроком.
Instantiate(prefab, new Vector3(Camera.main.transform.position.x, Camera.main.transform.position.y / 2, Camera.main.transform.position.z somearbitraryvalue), Camera.main.transform.rotation);
Далее, чтобы придать пулям скорость, вам следует создать отдельный скрипт для сборного блока пуль, который отвечает за перемещение пуль.
public Rigidbody2D bullet;
bullet = GetComponent<Rigidbody2D>()
void Update(){
bullet.velocity = new Vector 3(0,0,1)
}
Надеюсь, этот ответ поможет!