Заставить gameObject следовать поведению другого gameObject? - PullRequest
0 голосов
/ 13 июля 2020

Я управляю текстовым GameObject. Я выполняю такие операции, как SetActive() и меняю текст gameObject. Теперь я дублирую один и тот же объект, и я хочу, чтобы дублированный объект следовал поведению своего основного gameObject. То есть ObjA является родительским, а ObjB - клоном. Если я изменю текстовый интерфейс с помощью кода objA, я хочу, чтобы objB автоматически изменил свой компонент. Как добиться такого поведения?

1 Ответ

1 голос
/ 13 июля 2020

Есть несколько способов сделать это, но это всегда будет код, для этого нет «авторизации».

Таким образом, с помощью кода вы можете установить связь между дочерним элементом и родительским элементом или родительским элементом для дочернего элемента. .

Один из способов может быть таким:

public class Parent : MonoBehaviour
{
    public Child child = null;

    public void DoSomething()
    {
        this.gameObject.SetActive(true);
        child.DoSomething();
    }
}

public class Child : MonoBehaviour
{
    public void DoSomething()
    {
        this.gameObject.SetActive(true);
    }
}

Еще один интересный способ сделать это - использовать делегаты или Действия:

public class Parent : MonoBehaviour
{
    public Action OnDoSomething = null;
    public Action OnDoSomethingElse = null;

    public void DoSomething()
    {
        this.gameObject.SetActive(false);
        OnDoSomething();
    }

    public void DoSomethingElse()
    {
        this.gameObject.SetActive(true);
        OnDoSomethingElse();
    }
}

public class Child : MonoBehaviour
{
    public Parent parent = null;

    public void Awake()
    {
        parent.OnDoSomething += ChildDoSometing;
        parent.OnDoSomethingElse += ChildDoSometingElse;
    }
    public void OnDestroy()
    {
        parent.OnDoSomething -= ChildDoSometing;
        parent.OnDoSomethingElse -= ChildDoSometingElse;
    }

    public void ChildDoSometing()
    {
        this.gameObject.SetActive(false);
    }

    public void ChildDoSometingElse()
    {
        this.gameObject.SetActive(false);
    }
}

У вас может возникнуть соблазн передайте свой собственный метод в качестве параметра действия, например Action<Action>, но помните, что дочерний элемент будет вызывать родительский метод и не будет действовать самостоятельно. Итак, в этом случае, если вы сделаете что-то вроде:

public class Parent : MonoBehaviour
{
    public Action<Action> OnDoSomething = null;

    [ContextMenu("A")]
    public void DoSomething()
    {
        this.gameObject.SetActive(true);
        OnDoSomething(this.DoSomething);
    }

    public void DoSomethingElse()
    {
        print("Hello");
    }
}

public class Child : MonoBehaviour
{
    public Parent parent = null;

    public void Awake()
    {
        parent.OnDoSomething += RepeatedAction;
    }
    public void OnDestroy()
    {
        parent.OnDoSomething -= RepeatedAction;
    }    

    public void RepeatedAction(Action actionToRepeat)
    {
        actionToRepeat?.Invoke();
    }
}

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

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

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