Измените одно значение атрибута скрипта, чтобы оно влияло на все объекты gameObject, к которым присоединен этот скрипт - PullRequest
0 голосов
/ 12 июня 2019

Как изменить одно или два значения атрибута скрипта, чтобы он влиял на все объекты gameObject, к которым присоединен этот скрипт?

Например, создание атрибутов SphereSmall и SphereBig global

 public Vector3 SphereSmall = new Vector3 (0.001f, 0.001f, 0.001f);
 public Vector3 SphereBig = new Vector3 (0.0015f, 0.0015f, 0.0015f);

К двум gameObjects прикреплен этот скрипт, и я изменил атрибут открытых переменных SphereSmall и SphereBig для одного GameObject. Я хочу, чтобы это значение также было изменено во втором GameObject.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Я также новичок в Unity, но вот некоторые решения:

1) Если вы говорите о нескольких экземплярах одного и того же объекта, просто создайте сборный объект из этого объекта и обновитесвойства сборного.https://docs.unity3d.com/Manual/CreatingPrefabs.html

2) Если вы говорите об экземплярах различных объектов, вы можете попробовать использовать функцию множественного выбора редактора единиц, это позволит вам редактировать все общие свойства.Это легко, если у вас есть меньшее число, если экземпляры и сгруппированы под родительским объектом на панели Иерархия.

3) Если вы говорите об экземплярах разных объектов и не возражаете увидеть эффектваши обновления только во время выполнения: вы можете попробовать использовать класс ScriptableObject:

[CreateAssetMenu]
public class CommonObjectProperties : ScriptableObject
{
    public Vector3 SphereSmall = new Vector3(1, 0.001f, 0.001f);
    public Vector3 SphereBig = new Vector3(0.0015f, 0.0015f, 0.0015f);
}

После создания этого сценария перейдите в Ресурсы> Создать> Общие свойства объекта:

enter image description here

Теперь вы можете использовать этот экземпляр ScriptableObject для добавления общих значений к вашим объектам, и после их обновления внутри экземпляра ScriptableObject они будут обновляться для всех объектов.

ObjectScript - это сценарий MonoBehaviour для размещения ваших объектов:

public class ObjectScript : MonoBehaviour
{
    public CommonObjectPropertis commonProps;
    public Vector3 ObjectScriptSmallSphere;

    private void Start()
    {
        ObjectScriptSmallSphere = commonProps.SphereSmall;   
    }
}

Как это должно выглядеть в конструкторе: enter image description here

Я уверен, что их достаточнодругих способов сделать это, удачи!

1 голос
/ 12 июня 2019

Вы можете добавить [ExecuteInEditMode] в ваш скрипт, чтобы он работал во время работы редактора.Оттуда вы можете проверить, изменяются ли значения, а затем обновить их.Примерно так:

[ExecuteInEditMode]
public class MyScript : MonoBehaviour
{
  public int myValue;
  private int oldValue;

  void Update ()
  {
    if (oldValue != myValue)
    {
      MyScript[] objects = FindObjectsOfType<MyScript>();

      foreach(MyScript myObject in objects)
      {
        myObject.myValue = myValue
      }

      oldValue = myValue;
    }
  }
}

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

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