【问题标题】:Transform movement bounds to local axis将移动边界转换为局部轴
【发布时间】:2019-10-16 21:47:33
【问题描述】:

我的这段代码很好用,可以在局部 X 轴(游戏对象的 X 轴)上移动一个对象

    var vel = rb2d.velocity;
    if (Input.GetKey(moveLeft)) {
        rb2d.velocity = -transform.right * speed;
    }
    else if (Input.GetKey(moveRight)) {
        rb2d.velocity = transform.right * speed;
    }
    else {
        rb2d.velocity = transform.right * 0;
    }

但是我还需要限制它在局部 X 轴上的移动,但似乎无法弄清楚这一点。到目前为止,我有这个:

    var pos = transform.position;
    if (pos.x > boundX) {
        pos.x = boundX;
    }
    else if (pos.x < -boundX) {
        pos.x = -boundX;
    }
    transform.position = pos;

如果本地 X 轴与世界 X 轴对齐,这会很好,但显然我希望它在本地 X 轴上工作,而不是游戏对象。我似乎无法弄清楚如何将世界点转换为本地点。我一直在搞乱InverseTransformPoint,但无法让它工作。

【问题讨论】:

    标签: c# unity3d transform


    【解决方案1】:

    你可以用一些向量数学来做到这一点。

    首先,找到对象在世界空间中沿其局部 x 和 y 轴的偏移量:

    float xOffset = Vector2.Dot(transform.position,transform.right);
    float yOffset = Vector2.Dot(transform.position,transform.up);
    

    然后,将xOffset 固定到边界:

    xOffset = Mathf.Clamp(-boundX,boundX,xOffset);
    

    然后,将偏移量应用回它们的轴上并将它们加在一起以获得位置:

    transform.position = xOffset * transform.right + yOffset * transform.up;
    

    总共:

    float xOffset = Vector2.Dot(transform.position, transform.right);
    float yOffset = Vector2.Dot(transform.position, transform.up);
    
    xOffset = Mathf.Clamp(xOffset, -boundX, boundX);
    
    transform.position = xOffset * transform.right + yOffset * transform.up;
    

    【讨论】:

    • 这种方法适用于旋转 45 度的 2 个对象,但边界比应有的更近(对象未覆盖整个距离)。以更大角度旋转的对象要么根本不动,要么正在消失。
    • 不完全确定我做了什么,但现在可以了,谢谢一百万!
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 2016-01-07
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2022-12-28
    相关资源
    最近更新 更多