【问题标题】:Synchronising rhythm game notes by changing the maxValue in Mathf.Lerp通过更改 Mathf.Lerp 中的 maxValue 来同步节奏游戏笔记
【发布时间】:2021-09-07 08:59:00
【问题描述】:

enter image description here

由于不懂节奏游戏术语,所以无法彻底描述问题。

在图片中

  • 白色方块 Note 代表玩家需要按时击中的对象。
  • 绿色矩形线表示时间。当音符与线条完美对齐时,就是玩家按下按钮来敲击音符。

现在的问题是,我似乎无法找到一种方法来使 Note 与使用 Mathf.Lerp 的 Line 完美对齐,同时它仍然到达末尾。

void GenerateBeat()
    {

        if (timeItems.Count == 0)
            return;

        if (timeItems.Peek() <= currentBeatPosition + BeatLookForwardValue)
        {
            Debug.Log("Item instantiated, Spawned At : " + currentBeatPosition + " Will reach 0 at : " + timeItems.Peek());
            GameObject obj = Instantiate(tempSpawnObject);
            obj.transform.SetParent(parentObject.transform);
            existingBeats.Add(obj);
            existingBeatsTime.Add(currentBeatPosition);
            timeItems.Dequeue();

        }
            
    }
 void MoveBeat()
    {
       // if (timeItems.Count == 0)
       //     return;

        for (int i = 0; i < existingBeats.Count; i++)
        {
            NoteBeatline beatline = existingBeats[i].GetComponent<NoteBeatline>();
            Vector2 StartingPos = new Vector2(0, 800f);
            Vector2 EndPos = new Vector2(0, 0);
             float offset = (endTime[i] - existingBeatsTime[i]) / 3;
            float time = Mathf.InverseLerp(existingBeatsTime[i], endTime[i] + offset, currentBeatPosition);
            beatline.Image.rectTransform.anchoredPosition = Vector2.Lerp(StartingPos, EndPos, time);
        }
    }

[编辑] 抱歉没有说明清楚。

我正在尝试通过向 endTime 添加额外值来同步 Notes,因为 existingBeatsTime(跟踪生成对象的时间)可能会因 BeatLookFOrwardValue 的大小而异。currentBeatPosition 表示节拍时间已经过去了多长时间从歌曲开始,所以我无法操纵价值。

endTime 值始终是一个常数,由我设置 timeItems 中的项目与 endTime 中的项目相同。

深青色的整个背景颜色目前是800个单位 并且绿色水平线的y位置是600 以便Notes可以与绿线完美对齐 当

 float time = Mathf.InverseLerp(existingBeatsTime[i], endTime[i] + offset, currentBeatPosition);

是 0.75f。

我在发布这篇文章后做了更多的研究和实验, 发现了

float offset = (endTime[i] - existingBeatsTime[i]) / 3;

不知何故同步笔记,但我不明白如何。

请随时评论我的解释。 这是我第一次在 StackOverflow 上发布问题并向其他人解释我的编码问题。

如果仍然缺乏,我会尽力提供更多信息。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    "目前,当 currentBeatPosition == endTime 时,音符到达结尾。 但我想让他们在 currentBeatPosition == endTime" 时到达 Line

    那么,他们在正确的距离上跳跃?他们只是做得太快了是吗?因此,要修复它,您可以增加他们 lerping 的总时间。所以他们在 endTime 到达线路并稍晚到达终点。

    1. 获取比率,从起点到终点的距离/从起点到直线的距离
    2. 将他们忍受的总时间乘以这个比率。

    【讨论】:

    • 感谢您帮助我。我刚刚编辑了问题以获得更多说明。我不打算通过增加旅行所需的时间来实现同步,而是试图通过在float offset = (endTime[i] - existingBeatsTime[i]) / 3; float time = Mathf.InverseLerp(existingBeatsTime[i], endTime[i] + offset, currentBeatPosition); 中添加额外的 lerp 距离来同步它似乎偏移值和大小之间存在关系游戏面板。当前的偏移量在面板的当前大小上为我提供了一些同步的结果。
    【解决方案2】:

    我终于解决了同步问题。

    我发现有Mathf.LerpUnclamped() 可以推断返回值。所以我不得不改变

    beatline.Image.rectTransform.anchoredPosition = Vector2.Lerp(StartingPos, EndPos, time);
    

    beatline.Image.rectTransform.anchoredPosition = Vector2.LerpUnclamped(StartingPos, EndPos, time);
    

    这个。因为它可以推断我能够将 endPos 设置为绿线的位置。

    此外,我还必须创建自己的Mathf.InverseLerp(),这将是Mathf.InverseLerp() 的非固定版本。

    public static float InverseLerpUnclamped(float startValue, float maxValue, float inbetweenValue)
        {
            return (inbetweenValue - startValue) / (maxValue - startValue);
        }
    

    最后,我可以简单地通过这两行代码让它工作。

    float time = Tools.InverseLerpUnclamped(existingBeatsTime[i], endTime[i], currentBeatPosition);
    beatline.Image.rectTransform.anchoredPosition = Vector2.LerpUnclamped(StartingPos, EndPos, time);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      相关资源
      最近更新 更多