我三天前发了这个问题,但收到反馈说问题不清楚,所以我想再问一次。此外,随着我对问题的进一步研究,问题的范围也发生了变化(没有统一问题!)
我正在为iOS制作一个游戏,你可以通过触摸屏幕的左边或右侧来旋转一个物体。只要触摸到显示器,物体就会旋转,并在触摸结束时停止旋转。当我在实际的iPad/iPhone上运行游戏一段时间后,每几个人都会接触到物体的旋转,结结巴巴的时间大约是2秒。这种情况发生在大约5%的接触中。所有其他的接触都非常顺利。所有其他游戏动作都可以在60 fps的设定帧速率下工作。唯一不能顺利移动的是旋转的物体,而游戏的其余部分都运行得非常流畅。我试着在附图上想象这个问题。看这里
它在视觉上看起来像触摸刷新率被冻结了两秒钟。
造成这种情况的原因是什么,我如何解决这个问题?
我用游戏引擎团结创造了这个游戏。我使用以下版本:- Unity: 2019.3.15f1 - Xcode: 11 -设备: iPhone x- iOS版本: 13.5.1
经过大量的研究,我发现,这不是一个与团结有关的问题。此外,在Android设备上构建游戏也没有问题。
复制步骤:
int rotation
private void FixedUpdate(){
for (int i = 0; i < Input.touchCount; i++)
{
Vector3 touchPos = Camera.main.ScreenToWorldPoint(Input.touches[i].position);
if (touchPos.x < 0)
{
rotation += 10;
}
else if (touchPos.x > 0)
{
rotation -= 10;
}
}
transform.Rotate(0, 0, rotation);
rotation = 0;
}有人有办法解决这个问题吗?
发布于 2020-06-25 11:48:24
任何“输入”类都应该在Update()中调用,而不是FixedUpdate()。
如果您试图在FixedUpdate()中获取输入数据,则需要输入数据丢失。
例如,FixedUpdate可以在一个框架中执行两次,或者在一个帧中跳过。这就是它导致数据丢失或不准确的原因。
正确的解决办法是如下所示。
int rotation
private void Update()
{
for (int i = 0; i < Input.touchCount; i++)
{
Vector3 touchPos = Camera.main.ScreenToWorldPoint(Input.touches[i].position);
if (touchPos.x < 0)
{
rotation += 10 * time.deltaTime;
}
else if (touchPos.x > 0)
{
rotation -= 10 * time.deltaTime;
}
}
transform.Rotate(0, 0, rotation);
rotation = 0;
}请注意,您当前的旋转方向是由相机的光线投射决定的。
如果您想按屏幕空间左右旋转,这应该会更好。
private void Update()
{
int rotation = 0;
for (int i = 0; i < Input.touchCount; i++)
{
if (Input.touches[i].position.x < Screen.width/2)
{
rotation += 10 * time.deltaTime;
}
else
{
rotation -= 10 * time.deltaTime;
}
}
transform.Rotate(0, 0, rotation);
}一般来说,我更喜欢检查最后一次触摸的简单旋转脚本。
private void Update()
{
if(Input.touchCount > 0)
{
if (Input.touches[Input.touchCount-1].position.x < Screen.width/2)
{
transform.Rotate(0, 0, 10f * time.deltaTime);
}
else
{
transform.Rotate(0, 0, -10f * time.deltaTime);
}
}
}或者,如果您真的想将输入同步到FixedUpdate(),您可以如下所示。
bool HasTouch = false;
float SpeedRot = 0;
private void Update()
{
if(Input.touchCount > 0)
{
HasTouch = true;
if (Input.touches[Input.touchCount-1].position.x < Screen.width/2)
{
SpeedRot = 10f;
}
else
{
SpeedRot = -10f;
}
}
else
{
HasTouch = false;
}
}
private void FixedUpdate()
{
if(HasTouch) transform.Rotate(0, 0, SpeedRot * Time.fixedDeltaTime);
}https://stackoverflow.com/questions/62571827
复制相似问题