упругий объект в единстве? - PullRequest
0 голосов
/ 28 июня 2018

Я новичок в Unity и мне нужна помощь, буду очень признателен за любые ответы!

Я пытаюсь создать упругую плоскость, которую я хочу растянуть, перетаскивая. Я хочу растянуть всю плоскость по оси X с помощью Ctrl + левая кнопка мыши и по оси Y с помощью Alt + левая кнопка мыши. Затем я хочу растянуть отдельные полигоны, которые находятся вдоль границы плоскости, используя только левую кнопку мыши и перетаскивая в любом направлении.

До сих пор мне удавалось растянуть всю плоскость с помощью левой или правой кнопки мыши, используя скрипт ниже, но я не смог ограничить, насколько далеко он может быть растянут, поэтому я был бы признателен за любые советы о том, как чтобы сделать это также. Для растягивания отдельных полигонов я заглянул в модификатор ткани и попытался прикрепить подвижные объекты, но так и не смог заставить его работать. Спасибо за любую помощь!

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 голосов
/ 28 июня 2018

Как сказал Драко, 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). Это, вероятно, хорошо для двух, но если вы определяете метод три или более раз, лучше всего использовать один метод, который принимает дополнительные аргументы. Таким образом, если вы хотите что-то изменить, вам нужно будет изменить это только в одном месте.

На самом деле я не запускал их, чтобы посмотреть, работают ли они, поэтому им могут потребоваться небольшие модификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...