Вот например есть код два куска кода.Можно ли, если на объект повешен Forg, получить его с помощью чего-нибудь (GetComponent<Enemy ) не работает)?(Аля полиморфизм или наподобие CastTo в Ue4).
Код
using UnityEngine; using System.Collections;
public class Enemy : MonoBehaviour {
// Use this for initialization void Start () {
}
// Update is called once per frame void Update () {
} }
Код
using UnityEngine; using System.Collections;
public class Frog : Enemy {
// Use this for initialization void Start () { }
// Update is called once per frame void Update () {
// Use this for initialization public virtual void Me () { Debug.Log("Parent"); } }
Код
public class Child : Parent { // Use this for initialization public override void Me() { Debug.Log("Child"); } }
Код
public class Main : MonoBehaviour { public Parent MyScript; // Use this for initialization void Awake () { } }
Код
public class Check : MonoBehaviour {
// Use this for initialization void Start () { AddLogic(true); RunLogic();
} /// <summary> /// Или добавляем логику из скрипта, или вытаскиваем список компонентов из объекта и выбираем нужный. Смотря что нужно сделать. /// </summary> /// <param name="isChild"></param> void AddLogic(bool isChild) { var go = GameObject.Find("Main"); var comp = go.GetComponent<Main>(); comp.MyScript = (isChild) ? go.AddComponent<Child>() : go.AddComponent<Parent>(); } void RunLogic() { var go = GameObject.Find("Main"); var logic = go.GetComponent<Main>().MyScript; logic.Me(); } }
Necrolich, не могу понять зачем. По факту твой дочерний класс и так имеет все атрибуты родительского. Для чего именно ты хочешь это сделать? Ещё пример:
Код
// Родительский класс public class ParentClass : MonoBehaviour {
// Use this for initialization void Start () {
}
// Update is called once per frame void Update () {
}
public void Who() { Debug.Log("I'm Father"); } } ////////////////////////////////////////// // Дочерний класс public class ChildClass : ParentClass {
// Use this for initialization void Start () {
}
// Update is called once per frame void Update () {
}
public void Who() { Debug.Log("I'm Son"); } } ///////////////////////////////////////// // Manager public class Manager : MonoBehaviour {
public GameObject _child;
// Use this for initialization void Start () { _child.GetComponent<ParentClass> ().Who(); }
// Update is called once per frame void Update () {
} } ////////////////////////////////////////// // Результат: I'm Father - то есть, исполнится родительский метод
Если использовать переопределение метода (virtual-override), выдаст:
Код
I'm Son
То есть, по факту можно получить доступ к методам родителя. Но, конечно, нужен контекст использования. В C# не "аля полиморфизм", а самые настоящий, как наследование и инкапсуляция, в общем, все столпы ООП
Добавлено: Забыл сказать, если в это примере вызвать так:
Код
public class Manager : MonoBehaviour { ... void Start () { _child.GetComponent<ParentClass> ().Who(); _child.GetComponent<ChildClass> ().Who(); } ... }
То результат сперва будет "I'm Father", а потом - "I'm Son".
Сообщение отредактировал Rean - Воскресенье, 20 Ноября 2016, 18:43
Да понятно зачем. Necrolich, хочет единообразно обращаться к объектам имеющим разную логику.
Да это и так понятно. Меня интересует конкретный контекст использования. По сути, примеров выше должно хватать с головой без добавления доп. компонентов, используя исключительно возможности наследования.
Элементарно: если у нас есть несколько типов врагов, каждый из которых перемещается и атакует по-своему, но при касании любого из них игрок проигрывает, то достаточно в обработчике игрока проверить на коллизию с общим классом <Врага>, получив компонент Врага. Если компонент не удалось получить - значит это не враг.
Если контекст другой, более изощренный, то надо с ним ознакомиться, может действительно лучше раскидать логику по разным классам.
Сообщение отредактировал Rean - Понедельник, 21 Ноября 2016, 18:23