Как установить все bools в одном скрипте на те, что в другом скрипте? - PullRequest
0 голосов
/ 13 мая 2018

Правильно, поэтому у меня есть два экземпляра одного и того же скрипта на двух игровых объектах. У них есть bools.

public class Values: MonoBehaviour {
    public bool One;
    public bool Two;
}

правый. Теперь я хочу скопировать значения из одного игрового объекта в другой. Но если я добавлю значение к этому сценарию, мне не нужно менять сценарий, который копирует значения. Есть ли способ автоматически циклически перебирать все логические значения и устанавливать для них значение в одном скрипте?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Если я правильно понял, вы хотите создать «общие» переменные.

Итак, для этого вы можете использовать ScriptableObject. Создайте новый скрипт в папке активов с именем BoolVariable и поместите этот код:

using UnityEngine;
[CreateAssetMenu(menuName = "Shared/Bool")]
public class BoolVariable : ScriptableObject{
    public bool Value;
}

Затем создайте объекты bool enter image description here

Ваш класс Values будет изменен на:

public class Values: MonoBehaviour {
    public BoolVariable One;
    public BoolVariable Two;
}

И настройте свой новый 'Bools'

enter image description here

Надеюсь, это поможет вам, или даст какие-то идеи!

0 голосов
/ 13 мая 2018

Конечно.

Это пример того, как этого можно достичь:

public class Program
{
    public static void Main(string[] args)
    {
        var original = new Values();
        original.One = true;
        original.Two = false;
        var copy = CopyValuesToAnotherValues(original);
        Console.WriteLine($"one value: {copy.One}; two value: {copy.Two}");
        Console.ReadLine();
    }

    public static AnotherValues CopyValuesToAnotherValues(Values originalValue)
    {
        var valuesProperties = typeof(Values).GetProperties();
        var anotherValuesProperties = typeof(AnotherValues).GetProperties();

        var anotherValueInstance = new AnotherValues();

        foreach (PropertyInfo property in valuesProperties)
        {
            if (property.PropertyType != typeof(bool))
            {
                continue;
            }

            var booleanValue = property.GetValue(originalValue);
            anotherValuesProperties.Where(x => x.Name == property.Name).Single().SetValue(anotherValueInstance, booleanValue);
        }

        return anotherValueInstance;
    }
}

public class Values
{
    public bool One { get; set; }
    public bool Two { get; set; }
}

public class AnotherValues
{
    public bool One { get; set; }
    public bool Two { get; set; }
}

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

Еще один способ сделать это с помощью AutoMapper , посмотрите на него позже и решите, хотите ли вы броситьсвой собственный код для этого или используйте эту библиотеку.

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