如何在正确位置上实例化对象?

时间:2019-04-09 23:47:46

标签: c# object unity3d spawn

我的游戏存在一个非常大的问题。当我尝试按Play生成第一个预制件时,所有正确的X位置是-0.604f,z是-1.49f。但是当我生成第二个对象时,第二个和第三个对象在x和z的错误位置上生成了。 / p>

在第二个对象上,X位置不好(在这种情况下,对象的第二个Z位置为-1.208,我在这里需要与以前-0.604相同的值),我真的不知道为什么会发生这种情况,我也不知道当我在另一侧生成第三个对象时如何更改Z位置,因此如果前两个对象在左右,当我生成第三个对象时,他会得到-4.968的Z位置,这是不正确的,因为我需要在Z的第三个位置上= -1.655984,我在〜-5f的第三个对象z位置。

这是我生成对象的代码。

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 :(得分:0)

我无法完全回答这个问题,因为并非所有代码和上下文都可用,但是,我也许可以为您指明正确的方向。

亲子关系
在SpawnNextStackPiece中,您实例化一个预制件,并使它的当前父变换等于当前变换(此脚本所连接的对象的当前变换),检查每次实例化预制件时您要更改父对象的变换是否正在移动。我倾向于避免更改父级转换,我通常尝试将其附加到不同的父级上,并更改实际对象偏移量而不是父级,这样可以更容易管理。 我怀疑go.transform.parent = transform;引起了问题

通过清零值诊断问题
尝试将z轴强制设置为0,以便可以看到每次生成时它偏移了多少,这可能会使诊断问题变得更加容易。使用StackPieceSpawnPoint.position = new Vector3(0.604f, 0.1f,0f);