Это должен быть простой вопрос для любого опытного разработчика в unity / C#, но мой недостаток опыта вынуждает меня спросить.
Я недавно купил Infinite Runner Engine у More Mountains - скрипт, который должен был запустить мой проект, но я борюсь ...
Я пытаюсь отделить их код от своего собственного, поэтому после обновления я могу легко заменить его, не нанося (слишком большого) ущерба.
Вот вопрос:
Возьмем, к примеру, их скрипт LevelManager:
using MoreMountains.Tools;
namespace MoreMountains.InfiniteRunnerEngine
{
public class LevelManager : Singleton<LevelManager>
{
// default methods
protected virtual void PrepareStart() {}
protected virtual IEnumerator PrepareStartCountdown() {}
public virtual void LevelStart() {}
.... and so on...
}
}
Чтобы избежать повреждения при обновлении, я подумал о том, чтобы сделать это так
using MoreMountains.Tools;
using MoreMountains.InfiniteRunnerEngine;
namespace MyNamespace.Test
{
public class TestLevelManager : LevelManager
{
// custom property
public GameObject TestGameObject;
// Overrides to existing methods
protected override void PrepareStart() {}
protected override IEnumerator PrepareStartCountdown() {}
public override void LevelStart() {}
.... and so on...
}
}
Я понял, что таким образом я не смогу добавлять какие-либо собственные методы в класс TestLevelManager.
Есть ли у кого-нибудь совет, как правильно организовать код?
Можно ли просто использовать существующие методы в своих классах и переопределить только те, которые уже существуют, а затем создать дополнительные классы для методов, которые мне нужны? Звучит слишком грязно.
Я мог бы получить:
Это будет мой третий пример файла дополнительных методов, который я бы использовал с помощью MoreMountains.Tools; using MoreMountains.InfiniteRunnerEngine;
namespace MyNamespace.Test
{
public class TestLevelManagerExtra : Singleton<TestLevelManagerExtra>
{
// store relation to my overriding class
public TestLevelManager testLevelManager;
// when class is initiated it should find
// my class and store it in testLevelManager variable
public virtual void Start()
{
testLevelManager = gameObject.GetComponent<TestLevelManager>();
}
// custom method to be used outside of this class
// it should let me access properties in TestLevelManager
public void AccessTestGameObject(bool state)
{
testLevelManager.SetActive(state);
}
public void CustomMethod1() {}
}
}
Извините за неправильную терминологию, использованную в вопросе, как я уже сказал, я плохо разбираюсь в C#.
Возможно, тогда что-то было не так. Когда я добавляю такой собственный метод, я могу вызывать его внутри себя, но внешне он недоступен ...
Вы не можете добавлять какие-либо переопределения, потому что они не реализованы в базе, но вы можете добавить любой метод, который хотите, только не используйте ключевое слово override
.
"но внешне это недостижимо" вы можете показать пример? Вы набираете это "внешнее" как TestLevelManager
или LevelManager
?
Есть ли способ получить доступ к этим новым методам извне? Если я попытаюсь получить доступ к этому: LevelManager.Instance.PrepareStart (), он сработает. Если я попытаюсь получить доступ к этому: TestLevelManager.Instance.CustomMethod (), он скажет, что CustomMethod не определен в LevelManager, да, комментарии не стилизованы ...
У меня есть класс, назовем его GameManager, из которого я получаю доступ к LevelManager. Я могу получить доступ к LevelManager.Instance.method (), но не могу получить доступ к LevelManager.Instance.customMethod () или TestLevelManager.Instance.customMethod ()
Позвольте нам продолжить обсуждение в чате.
Похоже, что класс Singleton (который, похоже, наследуется от monobehaviour) определен неправильно. Кажется, что одноэлементный класс не поддерживает наследование должным образом. У меня сама была эта проблема при создании собственного синглтон-класса, но мне удалось найти решение для нее. Дайте мне знать, если у вас все еще есть проблема, так как это может быть решением.
@ Безнравственность Я найду способ обойти свои обходные пути. :-) Я надеюсь увидеть, есть ли хороший способ сделать это, например как люди используют сторонние библиотеки. прямо сейчас я использую 2 класса на один базовый класс, один для его переопределения, а второй для добавления новых методов. Скорее всего, я посмотрю любые фрагменты / скриншоты, которые у вас есть.
TestLevelManager
?