Как создать экземпляр объекта в правильном положении?

#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… Пожалуйста, найдите какое-нибудь решение для меня, ребята :/