Как создать экземпляр объекта в том месте, куда смотрит камера в Unity

#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)
}
 

Надеюсь, этот ответ поможет!