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

问题描述 投票:0回答:1

我的游戏有一个非常大的问题。当我尝试按下播放时,他产生的第一个预制件一切正确X位置是-0.604f,z是-1.49f ..但是当我产生第二个物体时,第二个和第三个物体产生于x和z的错误位置。

在第二个对象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;
    }

}
c# object unity3d spawn
1个回答
0
投票

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

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

通过清零值来诊断问题 尝试强制使z轴为0,这样你就可以看到它每次产生偏移的程度,这可能会使诊断问题变得更加容易。用StackPieceSpawnPoint.position = new Vector3(0.604f, 0.1f,0f);做这件事

© www.soinside.com 2019 - 2024. All rights reserved.