我的游戏存在一个非常大的问题。当我尝试按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;
}
}
答案 0 :(得分:0)
我无法完全回答这个问题,因为并非所有代码和上下文都可用,但是,我也许可以为您指明正确的方向。
亲子关系
在SpawnNextStackPiece中,您实例化一个预制件,并使它的当前父变换等于当前变换(此脚本所连接的对象的当前变换),检查每次实例化预制件时您要更改父对象的变换是否正在移动。我倾向于避免更改父级转换,我通常尝试将其附加到不同的父级上,并更改实际对象偏移量而不是父级,这样可以更容易管理。 我怀疑go.transform.parent = transform;
引起了问题。
通过清零值诊断问题
尝试将z轴强制设置为0,以便可以看到每次生成时它偏移了多少,这可能会使诊断问题变得更加容易。使用StackPieceSpawnPoint.position = new Vector3(0.604f, 0.1f,0f);