我已经在很长一段时间内一直在努力解决问题,并且几乎没有想法。
我在2D项目中使用Cinemachine虚拟相机来跟踪目标。地面/背景是Unity Tilemap GameObject。 正如你在this gif中看到的那样,当跟随玩家(24x24精灵)时,背景图块似乎有点扭曲。我试图编写所有类型的解决方案脚本来调整虚拟摄像机转换位置,并希望“正确”捕捉/移动它无济于事。我甚至不确定问题的根源是相机设置。我的解决方案已经用完了,这似乎是一个非常简单和非常常见的场景。我已经创建了一个示例项目,说明了可以下载的问题here。
使用Unity 2017.3.1f1 Personal。 背景精灵为32x32,PPU为32.无压缩,点(无滤镜),使用具有着色器:Sprites / Default和Pixel snap的材质渲染。
Cinemachine Virtual Cam设置为Ortho镜头尺寸16,Body:Framing Transposer,默认设置。
非常感谢您的任何建议或提示!!!
感觉类似于被描述here的子像素移动,但我不确定,并且该博客帖子中的解决方案似乎应该是不必要的(但是再次 - 也许不是)。
我已经创建了相机脚本并将它们连接到虚拟相机,如下所示:
float maxPixelHeight = 32;
CinemachineVirtualCamera vcam;
public void Awake()
{
float scale = Screen.height / maxPixelHeight;
float orthographicSize = (Screen.height / scale) / 2f;
vcam = GetComponent<CinemachineVirtualCamera>();
vcam.m_Lens.OrthographicSize = orthographicSize;
}
public void Update()
{
Vector3 tempPos = vcam.transform.position;
Vector3 newPos = new Vector3(Mathf.RoundToInt(tempPos.x), Mathf.RoundToInt(tempPos.y), Mathf.RoundToInt(tempPos.z));
vcam.transform.position = tempPos;
}
我也试过了:
public void Update()
{
Vector3 tempPos = vcam.transform.position;
Vector3 newPos = new Vector3((float)System.Math.Round((decimal)tempPos.x, 2) , (float)System.Math.Round((decimal)tempPos.y, 2), (float)System.Math.Round((decimal)tempPos.z, 2));
vcam.transform.position = newPos;
}
等等:
public void Update()
{
Vector3 tempPos = vcam.transform.position;
vcam.transform.position = new Vector3(RoundToNearestPixel(tempPos.x), RoundToNearestPixel(tempPos.y), RoundToNearestPixel(tempPos.z));
}
public float RoundToNearestPixel(float unityUnits)
{
float valueInPixels = unityUnits * maxPixelHeight;
valueInPixels = Mathf.Round(valueInPixels);
float roundedUnityUnits = valueInPixels * (1 / maxPixelHeight);
return roundedUnityUnits;
}