Есть несколько способов сделать это, но это всегда будет код, для этого нет «авторизации».
Таким образом, с помощью кода вы можете установить связь между дочерним элементом и родительским элементом или родительским элементом для дочернего элемента. .
Один из способов может быть таким:
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, потому что дочерний элемент вызовет родителя, который вызывает ребенка, который снова вызывает родительский ... вы можете увидеть проблему.
В любом случае было бы неплохо объявить абстрактный базовый класс, у которого есть все методы, и позволить обоим классам наследовать от этого класса, и реализовать эти методы.