Блокировка шкалы размеров дочерних сеток в Unity - PullRequest
0 голосов
/ 29 июня 2018

Я создаю мобильное приложение в Unity, которое позволяет пользователю масштабировать объекты во всех трех измерениях (в настоящее время используется LeanTouch). Все это прекрасно работает, но, очевидно, когда вы масштабируете родительский игровой объект, все масштабируется в этом измерении. Я бы предпочел, чтобы на самом деле масштабировались только определенные сетки, содержащиеся в игровом объекте, исходя из масштабируемого измерения.

Например, если у меня есть таблица, и пользователь хочет увеличить ширину объекта на лету (т.е. масштабировать в направлении X), я хочу масштабировать верхнюю часть блока, но толщину отдельные ноги остаются прежними. Прямо сейчас, если вы масштабируете ширину, сами ножки увеличиваются в толщине.

Leg Thickness Scales

Это изображение иллюстрирует проблему. Чем шире стол, тем больше и ноги. Я бы хотел, чтобы ширина ножки B оставалась такой же, как и у ножки A, несмотря на то, что столешница «растягивалась» в направлении X.

Эти модели сделаны с отдельными сетками для каждого компонента, поэтому я не пытаюсь сделать это с одной сеткой.

Есть ли способ указать (или в скриптах), что сетка или игровой объект могут масштабироваться только в двух измерениях (например, ножки стола могут масштабироваться по Y и Z, но не по X)? Я считаю, что это называется «Плоская блокировка» в Blender.

Прямо сейчас я использую Blender для импорта DXF, который я конвертирую в .obj или .fbx, однако я полный нуб.

Спасибо за любые предложения

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Я предлагаю вам написать простой скрипт, который привязывает один объект к другому в определенной позиции, например:

using UnityEngine;
using UnityEditor;

[ExecuteInEditMode, DisallowMultipleComponent]
public class Anchor : MonoBehaviour
{
  public Transform target;
  public Vector3 localPosition;

  void Update()
  {
    if (target == null) return;
    transform.position = target.position - transform.TransformVector(localPosition);
  }

  void OnDrawGizmos()
  {
    if (!enabled) return;
    var pos = transform.TransformPoint(localPosition);
    Gizmos.color = Color.red;
    Gizmos.DrawSphere(pos, HandleUtility.GetHandleSize(pos) * .05f);
  }
}

Я также предлагаю вам сделать иерархию объектов, подобную этой:

enter image description here

Желательно, чтобы растягиваемый объект и закрепленный объект были родными и общими родителями.

Таким образом, вы можете преобразовать столешницу так, как вы хотите, чтобы ножки оставались прикрепленными к положению закрепленных объектов (которые должны быть потомками растягиваемого объекта). Если вы хотите, чтобы преобразование было применено к обоим объектам (например, масштабирование в направлении z), просто преобразуйте общего родителя. Пример в 2D, но он работает и для 3D.

enter image description here

0 голосов
/ 29 июня 2018

Два простых подхода к этой проблеме: очистить ваши игровые объекты перед масштабированием родителя (переместить их во временного родителя, масштабировать родителя и переместить обратно). В качестве альтернативы вы можете применить обратную шкалу ко всем детям. Два примерно эквивалентны. Ни в коем случае не имейте в виду, что боковые «ножки» вашего комбинированного объекта будут прилипать к сторонам, в 2D вы можете использовать для этого класс RectTransform, но в 3D, я думаю, вам понадобятся некоторые дополнительные шаги для достижения этого.

...