我有一个函数,可以在等距视角中创建由 n*n 块组成的地面,n 是一侧的长度,就像下面的示例所示。所有的创作都是从头开始,我的意思是,我的场景几乎都是空的。
问题是,当我引入 1 位数字的长度(从 1 到 9)时,脚本运行良好。但是当我尝试向该数字添加另一个数字,使长度> 9时,它使最后一个块看起来像这样。我认为它是分层的 1 层后面,我不明白为什么。
只有当我在游戏运行时尝试改变长度时才会出现这个问题。当我在跑步前将长度更改为> 9时,效果很好。我认为这是一个分层问题,但我不知道。我毕竟是初学者。 :)
无论如何,这是我的脚本:
using System.Collections;
using System.Collections.Generic;
using System.Linq.Expressions;
using UnityEngine;
public class CreateField : MonoBehaviour
{
[SerializeField] Camera _cam;
[SerializeField] GameObject _sprite;
[SerializeField] GameObject _groundContainer;
[SerializeField] int lungime;
int lastLungime;
float _height, _width;
private void Start()
{
if(lungime<1) lungime = 1;
lastLungime = lungime;
_width = lungime;
setCameraResolution();
createField(new Vector3(0, _height, 0));
}
void setCameraResolution()
{
_height = _width / _cam.aspect;
_cam.orthographicSize = _height;
}
void deleteField()
{
for(int i = 0; i < _groundContainer.transform.childCount; i++)
{
Destroy(_groundContainer.transform.GetChild(i).gameObject);
}
}
void createField(Vector3 offset)
{
for(int i=1; i<= lungime; i++)
{
for (int j = 1; j <= lungime; j++)
{
Vector3 pos = new Vector3((i-j), -(i + j) / 2f, 0) + offset;
GameObject newSprite = Instantiate(_sprite, pos, _sprite.transform.rotation);
newSprite.transform.parent = _groundContainer.transform;
newSprite.name = "ground("+i+","+j+")";
}
}
}
private void Update()
{
if (lastLungime != lungime)
{
deleteField();
_width = lungime;
setCameraResolution();
createField(new Vector3(0, _height, 0));
lastLungime = lungime;
}
}
}
话虽如此,问题很可能出在 Update() 中,但我没有看到它。
更多图片供参考:
我尝试了不同的方法,但没有成功。 就在那时我教使用position.z。 我乘以长度*长度,然后将其与相机的 pos.z 相加,然后,对于每个块,我这样做:
newSprite.transform.position += new Vector3(0, 0, diff--);
这样,第一个放置的块将是 cam.pos.z-lungime*lungime,然后我们减少,直到放置的最后一个块将是 cam.pos.z。