首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不规则iOS触觉率对iPhone的影响

不规则iOS触觉率对iPhone的影响
EN

Stack Overflow用户
提问于 2020-06-25 09:09:40
回答 1查看 61关注 0票数 0

我三天前发了这个问题,但收到反馈说问题不清楚,所以我想再问一次。此外,随着我对问题的进一步研究,问题的范围也发生了变化(没有统一问题!)

我正在为iOS制作一个游戏,你可以通过触摸屏幕的左边或右侧来旋转一个物体。只要触摸到显示器,物体就会旋转,并在触摸结束时停止旋转。当我在实际的iPad/iPhone上运行游戏一段时间后,每几个人都会接触到物体的旋转,结结巴巴的时间大约是2秒。这种情况发生在大约5%的接触中。所有其他的接触都非常顺利。所有其他游戏动作都可以在60 fps的设定帧速率下工作。唯一不能顺利移动的是旋转的物体,而游戏的其余部分都运行得非常流畅。我试着在附图上想象这个问题。看这里

它在视觉上看起来像触摸刷新率被冻结了两秒钟。

造成这种情况的原因是什么,我如何解决这个问题?

我用游戏引擎团结创造了这个游戏。我使用以下版本:- Unity: 2019.3.15f1 - Xcode: 11 -设备: iPhone x- iOS版本: 13.5.1

经过大量的研究,我发现,这不是一个与团结有关的问题。此外,在Android设备上构建游戏也没有问题。

复制步骤:

代码语言:javascript
运行
复制
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;
}
  1. 通过c#在统一中对触控输入进行编码(见上文)
  2. 在iOS平台上构建项目(创建xcodeproject)
  3. 在XCode中打开项目并在iPhone上运行它

有人有办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2020-06-25 11:48:24

任何“输入”类都应该在Update()中调用,而不是FixedUpdate()。

如果您试图在FixedUpdate()中获取输入数据,则需要输入数据丢失。

例如,FixedUpdate可以在一个框架中执行两次,或者在一个帧中跳过。这就是它导致数据丢失或不准确的原因。

正确的解决办法是如下所示。

代码语言:javascript
运行
复制
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;
}

请注意,您当前的旋转方向是由相机的光线投射决定的。

如果您想按屏幕空间左右旋转,这应该会更好。

代码语言:javascript
运行
复制
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);
}

一般来说,我更喜欢检查最后一次触摸的简单旋转脚本。

代码语言:javascript
运行
复制
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(),您可以如下所示。

代码语言:javascript
运行
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62571827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档