【问题标题】:elastic object in Unity?Unity中的弹性对象?
【发布时间】:2018-12-06 22:40:04
【问题描述】:

我是 Unity 新手,需要一些帮助,非常感谢任何答案!

我正在尝试创建一个弹性平面,我想通过拖动来拉伸它。我想使用 ctrl+鼠标左键通过 x 轴拉伸整个平面,使用 alt+鼠标左键通过 y 轴拉伸整个平面。 然后我想通过使用鼠标左键并沿任何方向拖动来拉伸沿平面边界的单个多边形。

到目前为止,我已经设法使用鼠标左键或右键,使用下面的脚本来拉伸整个平面,但我无法限制它可以拉伸的距离,所以我希望有任何关于如何拉伸的提示也这样做。对于拉伸单个多边形,我研究了布料修改器并尝试附加可移动对象,但根本无法使其工作。 感谢您的帮助!

public GameObject elasticobject;
public float sizingFactor = 0.1f;
private GameObject lastSpawn = null;
private float startSize;
private float startX;

void Update()
{

    if (Input.GetMouseButton(0))
    {
        Vector3 size = elasticobject.transform.localScale;
        size.x = startSize + (Input.mousePosition.x - startX) * sizingFactor;
        elasticobject.transform.localScale = size;
    }

    if (Input.GetMouseButton(1))
    {
        Vector3 size = elasticobject.transform.localScale;
        size.y = startSize + (Input.mousePosition.y - startX) * sizingFactor;
        elasticobject.transform.localScale = size;
    }
}
}

【问题讨论】:

  • Mathf.Clamp 是你的朋友。

标签: c# unity3d


【解决方案1】:

正如 Draco 所说,Mathf.Clamp 对于这类事情很有用。

public GameObject elasticobject;
public float sizingFactor = 0.1f;
private GameObject lastSpawn = null;
private float startSize;
private float startX;

private float limitX;
private float limitY;

void Update()
{

    if (Input.GetMouseButton(0))
    {
        Vector3 size = elasticobject.transform.localScale;
        size.x = Mathf.Clamp(
            startSize + (Input.mousePosition.x - startX) * sizingFactor, 
            0, limitX);
        elasticobject.transform.localScale = size;
    }

    if (Input.GetMouseButton(1))
    {
        Vector3 size = elasticobject.transform.localScale;
        size.y = Mathf.Clamp(
            startSize + (Input.mousePosition.y - startX) * sizingFactor, 
            0, limitY);
        elasticobject.transform.localScale = size;
    }
}

我为您添加了 X 和 Y 的一些限制。我不明白你在做什么,StartX 的使用有点神秘,尤其是它出现在 Y 轴部分。

在进行这种重新缩放时,按百分比而不是固定数量增加更有用。否则,非常大的平面相对于它的大小将显示很小的变化。

private float multFactor = 0.01f;

void Update()
{
    if (Input.GetMouseButton(0))
    {
        Vector3 size = elasticobject.transform.localScale;
        size.x = Mathf.Clamp(
            size.x *= 1 + multFactor,
            0, limitX);
        elasticobject.transform.localScale = size;
    }

    if (Input.GetMouseButton(1))
    {
        Vector3 size = elasticobject.transform.localScale;
        size.x = Mathf.Clamp(
            size.y *= 1 + multFactor,
            0, limitY);
        elasticobject.transform.localScale = size;
    }
}

这里要注意的另一件事是,您基本上定义了相同的方法,但在两个不同的区域(一个用于 X,一个用于 Y)略有不同。这可能只适用于两者,但如果您发现自己定义了三次或更多次方法,则最好使用带有附加参数的单个方法。这样,如果您想更改某些内容,您只需在一处更改即可。

我实际上并没有运行这些来查看它们是否有效,因此它们可能需要一些小的修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    相关资源
    最近更新 更多