У меня есть объект (оранжевый), который привязан к шарниру (черный) и может вращаться вокруг него. В какой-то момент, когда я обнаруживаю столкновение с другим объектом, мне приходится разрезать его там (красный). Для этого я хочу сжать объект между этими точками (черной и красной), но мне нужно, чтобы он оставался привязанным к шарнирному соединению и сохранял свою ширину.
void OnCollisionEnter2D(Collision2D collision)
{
GameObject obj = collision.gameObject;
Vector3 endPos =collision.contacts[0].point;
float scaleX = Vector3.Distance(new Vector3(startPos.x, 0, 0), new Vector3(endPos.x, 0, 0));
float scaleY = Vector3.Distance(new Vector3(0, startPos.y, 0), new Vector3(0, endPos.y, 0));
Vector3 newScale = new Vector3(scaleX,scaleY, 1);
obj.transform.parent.transform.localScale = obj.transform.TransformPoint(newScale);
}
И начальная позиция инициализируется положением шарнирного соединения:
startPos = GameObject.Find("hair").GetComponent<HingeJoint2D>().transform.position;
Я завернул объект в родительский и масштабировал, так как где-то читал, что тогда он останется на месте:
Я перепробовал много вещей, но не могу заставить их оставаться на месте и иметь правильный размер. Как я могу это реализовать правильно?
Я добавил детали в вопрос. И я использую y, потому что объект можно повернуть на любой угол. как еще мне рассчитать новый масштаб? @шинго
Вы пытались изменить только масштаб по оси Y и поворот спрайта? Можете ли вы добавить больше деталей, например положение каждого узла и местонахождение подключенного твердого тела?
По сути, ваша проблема связана с точкой поворота этого объекта, как отметил @azelito. Если вы настроите все правильно, масштабирование будет работать так, как вы ожидаете. Понимание опорных точек (или якорей) будет полезно и при работе с пользовательским интерфейсом.
Если вы переместите ось (позицию) родительского преобразования на шарнир, а затем примените localScale к родительскому объекту, вы достигнете желаемого результата.
Пример:
private float scale = 3;
А потом:
transform.parent.transform.localScale = new Vector3(transform.parent.transform.localScale.x, transform.parent.transform.localScale.y, scale);
Спасибо, я неправильно расположил родительский объект.
Что такое startPos? Как устроены компоненты преобразования оранжевого объекта и его родительских узлов? Это простой спрайт или что-то еще? Как вы хотите его уменьшить? Это похоже на фигурную палку, но я видел, как вы масштабировали координаты x и y родительского преобразования, я этого не понимаю.