Как создать объект на правильной позиции? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть одна очень большая проблема с моей игрой. Когда я пытаюсь нажать play, когда он создает первый префаб, все в порядке, позиция 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 Ответ

0 голосов
/ 10 апреля 2019

Я не могу полностью ответить на этот вопрос, так как не весь код и контекст доступны, однако, возможно, я мог бы указать вам правильное направление.

Родительско-детские отношения
В SpawnNextStackPiece вы создаете экземпляр префаба, и его текущее родительское преобразование равно текущему преобразованию (объекта, к которому присоединен этот скрипт), проверяет, смещается ли преобразование, к которому вы изменяете родительский объект, каждый раз, когда создается экземпляр. Я стараюсь избегать смены родительских преобразований, я обычно пытаюсь прикрепить их к разным родителям и изменить фактические смещения объектов, а не родителей, им легче управлять. Я подозреваю, что go.transform.parent = transform; вызывает проблему .

Диагностика проблемы путем обнуления значений
Попробуйте принудительно сделать ось Z равной 0, чтобы вы могли видеть, насколько сильно она смещается при каждом появлении, что может значительно упростить диагностику проблемы. Сделайте это с StackPieceSpawnPoint.position = new Vector3(0.604f, 0.1f,0f);

...