Unity中有弹性的物体?

时间:2018-06-27 23:47:12

标签: c# unity3d

我是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;
    }
}
}

1 个答案:

答案 0 :(得分:0)

正如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)稍有变化。这可能对两个方法都很好,但是如果您发现自己定义了三次或多次方法,则最好使用带有附加参数的单个方法。这样,如果您要更改某些内容,则只需一次更改即可。

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