C# 摄像机未正确居中于两个游戏对象之间 我有一个按钮,使主相机在多个对象中间切换。
例如,有[StartPoint,CheckPoint,CheckPoint,EndPoint] 我希望摄像机在检查点之间连续切换,就像检查点之间的逗号一样^^ 此代码是实际切换主摄像头位置的代码(可能存在错误) 在相机保持在相同位置或关闭两个值后,相机切换最适合前两个检查点(起点和终点或起点和检查点)。我使用Debug.Log()进行了检查;要查看相机之间是否有正确的游戏对象,为什么不工作C# 摄像机未正确居中于两个游戏对象之间 我有一个按钮,使主相机在多个对象中间切换。,c#,unity3d,C#,Unity3d,例如,有[StartPoint,CheckPoint,CheckPoint,EndPoint] 我希望摄像机在检查点之间连续切换,就像检查点之间的逗号一样^^ 此代码是实际切换主摄像头位置的代码(可能存在错误) 在相机保持在相同位置或关闭两个值后,相机切换最适合前两个检查点(起点和终点或起点和检查点)。我使用Debug.Log()进行了检查;要查看相机之间是否有正确的游戏对象,为什么不工作 中心点应该是所有点的平均值,因此您需要添加点,而不是减去点,然后将结果除以平均值包含的点数 center=
中心点应该是所有点的平均值,因此您需要添加点,而不是减去点,然后将结果除以平均值包含的点数
center=sum(points)/count(points)
,所以center=(a+b)/2
或者,如果您发现Vector3.Lerp(a,b,0.5f)更具可读性,尽管从技术上讲这会更慢,因为它既是一个方法调用,又是更多的操作,除非编译器在幕后做一些奇特的事情……您正在通过变换索引对游戏对象进行排序。您确定排序后,开始点和结束点仍分别位于列表的开始和结束处吗?看看在插入/添加之前移动排序时会发生什么。是的,我选中了,按正确的顺序列出,移动正确是数学问题吗?两个点之间的中心点不是这样的吗(对于一维):
centerPoint=x2-((x2-x1)/2)
?例如,10和2之间的中心是6,但是你的公式会产生4。center=(a+b)/2
,而不是(a-b)/2
也可以使用Vector3.Lerp(a,b,0.5f)
,如果需要的话。@cwharis就是这样,谢谢!哇,这样一个愚蠢的错误慢的部分可能不是真的,Lerp是一个负运算加上一个乘法(乘法可以在芯片上比除法更快)。对其中的最后一个参数进行了钳制检查,因此Vector3.lerpunclipped可能会更快。Vector3的运算符重载+和/都是方法调用。顺便说一句,运算符重载只是为类提供语法糖,以提供更好的体验。确定。不过,这还需要更多的计算。编译器将处理一些琐碎的优化,例如/2
vs*0.5
vs>2
。甚至可以将运算符/方法联机。甚至可以通过静态分析将lerp(a,b,0.5)
转换为(a+b)*0.5
。谁知道呢。仍然很好的实践,IMO,考虑这些事情(虽然简单),特别是如果你是一个多语言,其中一些语言可能没有好的编译器。
public void SwitchCameraBetween(GameObject nextPoint, GameObject afterNextPoint)
{
Vector3 centerPoint = (afterNextPoint.transform.position - nextPoint.transform.position) / 2;
centerPoint.z = -10;
float cameraSize = (afterNextPoint.transform.position - nextPoint.transform.position).magnitude - nextPoint.transform.localScale.x;
mainCamera.transform.position = centerPoint;
mainCamera.orthographicSize = cameraSize / 3;
}