#c# #object #unity3d #spawn
#c# #объект #unity3d #порождение
Вопрос:
У меня есть одна действительно большая проблема с моей игрой. Когда я пытаюсь нажать кнопку воспроизведения, когда он создает первый сборный файл, все правильно, позиция X равна -0.604f, z равна -1.49f .. Но когда я создаю второй объект, второй и третий объекты появляются в неправильном положении x и z.
Для второго объекта позиция X не является хорошей (в этом случае вторая позиция Z объекта равна -1.208, и мне нужно здесь то же значение, что и раньше -0.604) Я действительно не знаю, почему это происходит, и я не знаю, как я могу изменить положение Z, когда я создаю третий объект с другой стороны, поэтому, если первые два объекта находятся справа и слева, и когда я создаю третий объект, он получает положение Z -4.968, что неверно, потому что мне нужно на третьей позиции наZ = -1.655984, и я получаю на третьем объекте z позицию ~-5f.
Вот мой код для создания объектов..
public class StackPiecesSpawner : Singleton<StackPiecesSpawner> {
public GameObject stackPrefab;
[SerializeField] public Transform StackPieceSpawnPoint;
[SerializeField] public float PieceSpawnSize = 0.1f;
[SerializeField] public float PieceSpawnWidth = 1.0f;
[SerializeField] private float speed = 1f;
public Vector3 OriginalSpawnPointPosition;
protected override void Awake()
{
base.Awake();
OriginalSpawnPointPosition = StackPieceSpawnPoint.position;
}
public void SpawnNextStackPiece()
{
//StackPieceSpawnPoint.position = new Vector3(0f,PieceSpawnSize,0f);
StackPieceSpawnPoint.position = new Vector3(0.604f, 0.1f, -1.656f);
//GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
GameObject go = GameObject.Instantiate(stackPrefab);
//go.transform.localScale = new Vector3(PieceSpawnWidth,PieceSpawnSize,PieceSpawnWidth);
go.transform.localScale = new Vector3(0.4f, 0.4f,0.05f);
go.transform.position = nextSpawnPosition();
go.AddComponent<Rigidbody>();
go.GetComponent<Rigidbody>().isKinematic = true;
go.AddComponent<StackPiece>();
go.transform.parent = transform;
go.transform.name = "StackPiece_" (StackPiecesManager.StackPieces.Count 1);
StackPiece piece = go.GetComponent<StackPiece>();
piece.TargetTransform = StackPieceSpawnPoint;
piece.Speed = speed;
StackPiecesManager.Instance.AddNewPiece(piece);
}
private Vector3 nextSpawnPosition()
{
System.Random rnd = new System.Random();
int num = rnd.Next(0, 100);
Vector3 modifier = new Vector3();
modifier = num < 50 ? Vector3.back : Vector3.left;
modifier *= StackPiecesManager.Instance.SpawnDistance;
Vector3 returned = (StackPieceSpawnPoint.position - modifier) Vector3.up * (StackPiecesManager.Instance.ExtraHeight);
// returned = (StackPieceSpawnPoint.position) Vector3.up * (StackPiecesManager.Instance.ExtraHeight);
return returned;
}
public void Reset()
{
StackPieceSpawnPoint.position = OriginalSpawnPointPosition;
}
}
Комментарии:
1. StackPieceSpawnPoint.position = новый Вектор3(0.604f, 0.1f, -1.656f); — Зачем вам нужна эта строка? Вот почему ваш gameobject запускается в разных позициях.
2. @Gray_Rhino , потому что он создает объект в правильном положении, а после появления первого объекта другие не находятся в правильных позициях..
3. Тогда просто используйте «=», а не » =».
4. @Gray_Rhino, но это не решает мою проблему появления второго объекта.. Спасибо, что указали мне на эту проблему..
5. Возвращен Vector3 = (StackPieceSpawnPoint.position — модификатор) Vector3.up * (StackPiecesManager. Экземпляр. Сверхвысокий); — для второй позиции появления эта строка вызывает проблему. Для «модификатора» используйте (x, y, z) вместо back, forward . Таким образом, вы будете иметь контроль над точной дифракцией.
Ответ №1:
Я не могу полностью ответить на этот вопрос, поскольку доступен не весь код и контекст, однако, возможно, я мог бы указать вам правильное направление.
Отношения родитель-потомок
В SpawnNextStackPiece вы создаете экземпляр сборного объекта, и его текущее родительское преобразование равно текущему преобразованию (объекта, к которому прикреплен этот скрипт), проверьте, меняется ли преобразование, на которое вы меняете родительский объект, при каждом создании экземпляра сборного объекта. Я стараюсь избегать изменения родительских преобразований, я обычно пытаюсь прикрепить его к разным родителям и изменить фактическое смещение объектов, а не родителей, это может быть проще в управлении. Я подозреваю go.transform.parent = transform;
, что это вызывает проблему.
Диагностика проблемы путем обнуления значений
Попробуйте принудительно сделать ось z 0, чтобы вы могли видеть, насколько она смещается при каждом появлении, что может значительно упростить диагностику проблемы. Сделайте это с помощью StackPieceSpawnPoint.position = new Vector3(0.604f, 0.1f,0f);
Комментарии:
1. Эйден Фалконер, я действительно ценю ваш ответ, но это не решение для меня, когда я ставлю 0 в третьем параметре, мои объекты находятся не в правильном положении.. Может быть, родительское решение может помочь, но я понятия не имею, как я могу реализовать его в своем коде? p.s. честно говоря, когда я использую куб примитивных объектов, все работает нормально, когда я использую свой сборный объект рядом с кубом примитивных объектов unity, ничего не появляется правильно, только первый объект находится в хорошем положении, другие перемещаются idk почему..
2. Нет проблем, попробуйте использовать совершенно другой подход, чем возиться с родительско-дочерними отношениями, и посмотрите, как это работает для вас. Может быть, просто не делайте этого вообще, вероятно, это сработало бы, если бы вы вручную установили позицию родительского элемента в редакторе, а не через скрипт. Попробуйте это и расскажите мне, как у вас дела!
3. Извините, но даже если я сделаю его дочерним элементом родительского элемента, это не сработает, я не знаю, почему мои скрипты добавляют к следующему объекту двойное значение в позиции X и почему, черт возьми, третий объект появляется на неправильной оси z… Пожалуйста, найдите какое-нибудь решение для меня, ребята :/