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



我的游戏有一个非常大的问题。当我尝试按播放时,当他生成第一个预制件时,一切都是正确的 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;
    }
}

我不能完全回答这个问题,因为并非所有代码和上下文都可用,但是,我可能会为您指出正确的方向。

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

通过清零值
来诊断问题尝试强行将 z 轴设为 0,以便您可以看到每次生成时偏移量,这可能会使诊断问题变得更加容易。用StackPieceSpawnPoint.position = new Vector3(0.604f, 0.1f,0f);执行此操作

最新更新