Как мне создавать объекты в Unity? - PullRequest
0 голосов
/ 05 апреля 2019

Я делаю нисходящую игру в Unity, как мне создавать объекты на основе текущего положения игроков сверху камеры в Unity?

Пока я пробовал:

Instantiate(prefab, player.transform.position * 2 * Space.World)

но это не сработало.Это только что породило объекты из центра камеры.

1 Ответ

5 голосов
/ 05 апреля 2019

Space - просто перечисление и не имеет ничего общего с тем, что вы пытаетесь!(Его цель - определить относительное пространство преобразования, например, Transform.Rotate или Transform.Translate)

в этом перечислении afaik

  • Space.World просто имеет значение int 0
  • Space.Self имеет значение int 1

, поэтому на самом деле вы

Instantiate(prefab, player.transform.position * 2 * 0);

, что равно

Instantiate(prefab, Vector3.zero);

, что означает, что объект создается в Мировой позиции 0,0,0.

Также использование

Instantiate(prefab, player.transform.position * 2);

выглядит немного странно.Вы уверены, что хотите продублировать position player?Это означало бы, что вызываемый объект всегда находится на одной линии с игроком и миром 0,0,0 и всегда удваивается так же далеко от центра, как и игрок.


Для меня это звучит так, как будто вы скорее хотитепородить что-то перед игрока ... в зависимости от направления просмотра игрока (в играх сверху вниз обычно player.transform.up или player.transform.right), поэтому я думаю, что вы пытаетесьdo вместо этого - что-то вроде

Instantiate(prefab, player.transform.position + player.transform.forward * 2);

, которое вместо этого порождает объект 2 юнитов перед объектом игрока


После вашего комментария это звучит так, как будто вы хотитепородить объект на позиции игрока на X-axis, но «над ним» на Y-axis, поэтому

Instantiate(prefab, player.transform.position + Vector3.Up * 2);

возможно, вам придется настроить 2 в зависимости от того, как ваш игрок может двигаться, икак далеко это должно быть, чтобы быть "за кадром".В качестве альтернативы вы могли бы также использовать немного более сложный вариант, используя Camera.ScreenToWorldPoint

// get players position
var playerPos = player.transform.position;

// get camera's position
var cameraPos = Camera.main.transform.position;

// get difference on Z-axis
var cameraDistance = cameraPos.z - playerPos.z;

// Get the world 3d point for the upper camera border
// don't care about the X value
// and as distance we use the z-distance to the player
var cameraTopPoint = Camera.main.ScreenToWorldPoint(new Vector3(0, Camera.main.pixelHeight, cameraDistance);

// use the players X-axis position
cameraTopPoint.x = player.transform.x;

// to spawn it exactly on the Screen border above the player
Instantiate(prefab, cameraTopPoint);

// or to spawn it a bit higher
Instantiate(prefab, cameraTopPoint + Vector3.Up * 1);

Обновление

, которое вы сказали, что хотите сборныйчтобы появиться на «противоположной» позиции игрока на оси X.

Если ваша Камера статична в мире x = 0, то это на самом деле довольно просто:

cameraTopPoint.x = -player.transform.x;

ЕслиВаша камера движется или нет на х = 0, чем мы должны рассчитать уже на уровне положения экрана:

// get players position
var playerPos = player.transform.position;

// additionally convert the player position to screen space
var playerScreenPos = Camera.main.WorldToScreenPoint(playerPos);

var centerX = Camera.main.pixelWidth / 2.0f;

// get the difference between camera an player X (in screen space)
var differenceX = Mathf.Abs(playerScreenPos.x - centerX);

// here calculate the opposide side
var targetX = centerX + differenceX * (playerScreenPos.x < centerX ? 1 : -1);
// or alternatively if you want e.g. that the prefab always
// spawn with a bit of distance to the player even though he is very close
// to the center of the screen you could do something like
//var targetX = centerX + centerX / 2 * (playerScreenPos.x < centerX ? 1 : -1);

// Get the world 3d point for the upper camera border
// with the calculated X value
// and as distance we use the z-distance to the player
var cameraTopPoint = Camera.main.ScreenToWorldPoint(new Vector3(targetX, Camera.main.pixelHeight, playerScreenPos.z);

// to spawn it exactly on the Screen border above the player
Instantiate(prefab, cameraTopPoint);

// or to spawn it a bit higher
Instantiate(prefab, cameraTopPoint + Vector3.Up * 1);

Другое обновление

Okпоэтому вы хотите, чтобы префаб всегда появлялся рядом с игроком на определенном расстоянии.Сторона зависит от того, на какой стороне экрана находится плеер, так что вы можете снова использовать первый подход, но просто добавьте желаемое расстояние:

// Adjust this is the Inspector (in Unity units)
public float spawnDistanceToPlayer;

...

// get players position
var playerPos = player.transform.position;

// additionally convert the player position to screen space
var playerScreenPos = Camera.main.WorldToScreenPoint(playerPos);

var centerX = Camera.main.pixelWidth / 2.0f;

// Get the world 3d point for the upper camera border
// with the calculated X value
// and as distance we use the z-distance to the player
var cameraTopPoint = Camera.main.ScreenToWorldPoint(new Vector3(playerScreenPos.x, Camera.main.pixelHeight, playerScreenPos.z);

// now add or reduce spawnDistanceToPlayer 
// depending on which side of the screen he is
cameraTopPoint.x += spawnDistanceToPlayer * (playerScreenPos.x < centerX ? 1 : -1);

// OR if your camera sits static on X=0 anyway you also could compare
// the player position directly without calculating in screenspace:
cameraTopPoint.x += spawnDistanceToPlayer * (playerPos.x < 0 ? 1 : -1);

// to spawn it exactly on the Screen border above the player
Instantiate(prefab, cameraTopPoint);

// or to spawn it a bit higher
Instantiate(prefab, cameraTopPoint + Vector3.Up * 1);

Печатается на смартфоне, поэтому может быть"возможность копирования-вставки";)

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