首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mathf.clamp()统一函数

Mathf.clamp()统一函数
EN

Stack Overflow用户
提问于 2017-05-02 12:58:19
回答 3查看 8.1K关注 0票数 3

我的游戏场景中有一个魔方(玩家)。我编写了一个C#脚本来限制立方体的移动(使用Mathf.Clamp()),这样它就不会离开屏幕。

下面是脚本中的FixedUpdate()方法

代码语言:javascript
复制
private void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        rb.velocity = movement * speed;

        rb.position = new Vector3(
            Mathf.Clamp (rb.position.x, x_min, x_max),
            0.5f,
            Mathf.Clamp(rb.position.z, z_min, z_max)
            );

    }

x_minx_maxz_minz_max的值分别为-3、3、-2、8。

问题

脚本运行良好,但是我的播放器(立方体)可以在负X-AXIS中移动到-3.1个单位(如果我一直按左箭头按钮),负X-AXIS的这个值要高出0.1个单位(其他轴也是如此)。显然,当我停止按按钮时,它会夹紧-3.1到-3。

  • 为什么会发生这种情况?为什么它(Mathf.Clamp())不把立方体限制在-3单位的第一位?
  • 为什么我要得到那额外的0.1单位?
  • 为什么这个数值仅为0.1单位?为什么不或多或少?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-02 13:27:28

  • 这是因为内部物理更新移动立方体之后,你已经把它放在它的夹紧位置。Mathf.Clamp()首先确实将多维数据集限制在预期位置上,因为您可以通过在指定职位后直接放置一个Debug.Log来验证
  • 您将获得额外的.1单元,因为您给对象一个在夹紧后应用的速度。
  • 它是0.1单位,因为速度和固定时间步长的设置(在项目设置>时间)。如果你设定一个更高的速度,它将是更多。如果你要降低固定的时间步长,它也会多一点。
票数 4
EN

Stack Overflow用户

发布于 2017-05-02 13:25:36

你的问题可能是因为你设定了速度然后定位,但是在下一个框架之前,统一会把速度加到你的物体位置上。这就是为什么它最终损失了0.1单位。

要解决这个问题,尝试将物体的速度重置为零,如果它即将离开你的边界。

票数 5
EN

Stack Overflow用户

发布于 2017-05-02 14:02:09

你已经知道发生这种事的原因了。

为了解决这个问题,您可以使用此代码防止多维数据集超出您的边界:

代码语言:javascript
复制
private void FixedUpdate() {
    Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical"));

    // Get new position in advance
    float xPos = rb.position.x + movement.x * speed * Time.fixedDeltaTime;
    float zPos = rb.position.z + movement.z * speed * Time.fixedDeltaTime;

    // Check if new position goes over boundaries and if true clamp it
    if (xPos > x_max || xPos < x_min) {
        if (xPos > x_max)
            rb.position = new Vector3(x_max, 0, rb.position.z);
        else
            rb.position = new Vector3(x_min, 0, rb.position.z);
        movement.x = 0;
    }
    if (zPos > z_max || zPos < z_min) {
        if (zPos > z_max)
            rb.position = new Vector3(rb.position.x, 0, z_max);
        else
            rb.position = new Vector3(rb.position.x, 0, z_min);
        movement.z = 0;
    }

    rb.velocity = movement * speed;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43738537

复制
相关文章

相似问题

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