Пятница, 08 Ноября 2024, 20:53

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Обращение с унаследованным компонентом как с родительским.
NecrolichДата: Воскресенье, 13 Ноября 2016, 20:53 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Вот например есть код два куска кода.Можно ли, если на объект повешен Forg, получить его с помощью чего-нибудь (GetComponent<Enemy >( ) не работает)?(Аля полиморфизм или наподобие CastTo в Ue4).

ReanДата: Воскресенье, 13 Ноября 2016, 21:29 | Сообщение # 2
участник
Сейчас нет на сайте
Necrolich, что значит
Код
если на объект повешен Forg

Имеется ввиду, что объект является экземпляром класса Frog?

Допустим, что
Код
public class ParentClass : MonoBehaviour {
...
}

и
Код
public class ChildClass : ParentClass {
    
    public int jumpSpeed = 10;
...
}

Последний класс, например, принадлежит префабу. Также у нас есть объект Manager, в котором мы выполняем логику:
Код
public class Manager : MonoBehaviour {

    [SerializeField]
    GameObject _child;
        ...
}

"Кидаем" на на этот GameObject наш префаб со скриптом ChildClass. И теперь где-нибудь в скрипте Manager продолжаем такой функцией:
Код
...
// Объявляем метод прыжка
void Jump (ParentClass parent)
{
    ChildClass child = parent;
    child.GetComponent<Transform>.Translate(Vector3.up * child.jumpSpeed);
}
...
...
void Update()
{
    if (Input.GetButtonDown("Jump"))
        Jump( _child.GetComponent<ParentClass> ));
}

Вот и весь полиморфизм. Ещё проще, если в Manager переменную _child объявить как ChildClass.


Сообщение отредактировал Rean - Понедельник, 14 Ноября 2016, 01:41
NecrolichДата: Воскресенье, 20 Ноября 2016, 11:25 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Rean, Не, я не так хочу.Возможно я не правильно выразился, но вот как я хочу.
Код

public class ParentClass : MonoBehaviour {
...
}

Код

public class ChildClass : ParentClass {
    
    public int jumpSpeed = 10;
...
}

На _child добавлен скрипт ChildClass
Код

public class Manager : MonoBehaviour {
    [SerializeField]
    GameObject _child;
    public void do(){
     _child.GetComponent<Parent <img rel="usm" src="/SML/angry.gif" border="0" align="absmiddle" alt=">(" /> );
     ...
    }
}
RangerДата: Воскресенье, 20 Ноября 2016, 17:43 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Код
using UnityEngine;
using System.Collections;

public class Parent : MonoBehaviour {

    // 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();
    }
}


ReanДата: Воскресенье, 20 Ноября 2016, 18:35 | Сообщение # 5
участник
Сейчас нет на сайте
Necrolich, не могу понять зачем. По факту твой дочерний класс и так имеет все атрибуты родительского. Для чего именно ты хочешь это сделать?
Ещё пример:

Если использовать переопределение метода (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
RangerДата: Понедельник, 21 Ноября 2016, 03:07 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата Rean ()
не могу понять зачем.

Да понятно зачем.
Necrolich, хочет единообразно обращаться к объектам имеющим разную логику.

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




Сообщение отредактировал Ranger - Понедельник, 21 Ноября 2016, 03:12
ReanДата: Понедельник, 21 Ноября 2016, 11:03 | Сообщение # 7
участник
Сейчас нет на сайте
Цитата Ranger ()
Да понятно зачем.
Necrolich, хочет единообразно обращаться к объектам имеющим разную логику.

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

Элементарно: если у нас есть несколько типов врагов, каждый из которых перемещается и атакует по-своему, но при касании любого из них игрок проигрывает, то достаточно в обработчике игрока проверить на коллизию с общим классом <Врага>, получив компонент Врага. Если компонент не удалось получить - значит это не враг.

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


Сообщение отредактировал Rean - Понедельник, 21 Ноября 2016, 18:23
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг