Писал я скриптик, большой, жирный, с кучей вспомогательных методов. Дальше перешел к тестированию, пытаюсь перетащить его на объект. И вот, я получил ошибку!
Вы просто не представляете как было сложно найти причину этой ошибки. Пришлось удалять по строчке, пока не нашел проблему.
Сперва думал, что проблема в наследовании интерфейса. Но... нет.
Использование пространства имен? Тоже, мимо.
В ходе дальнейших экспериментов выяснил, что проблема возникла в написанных функциях. А если быть точнее в такой вот строчке
public bool IsUseResource(ResourceType resourceType, ResourceAction resourceAction = ResourceAction.Count)
Казалось бы, что тут может быть не так? А косяк в параметре по умолчанию.
// Замена ResourceAction resourceAction = ResourceAction.Count // на ResourceAction resourceAction
решило проблему... Неожиданно, не правда ли???
Теперь мы можем сделать следующий вывод:
Не используйте параметры по умолчанию в методах MonoBehaviour!
Смотрите также:
Комментарии
На самом деле этот баг свойственен если соблюдаются 4 условия:
- Задействовано пространство имен
- Имеются статические методы
- Имеется перегрузка метода
- Наследие от MonoBehaviour
В этом случае действительно происходит вот такой вот баг. Однако если хотя бы один из этих пунктов упущен - все будет работать на ура.
Extravert, не совсем так, ибо я использую и пространство имен и статичные методы и перегрузку и даже наследуюсь от монобехайвеора
alexprey, вот простейший пример, который я имел ввиду. Скрин: http://prntscr.com/390te5
Тело:
using UnityEngine; namespace MyNamespace { public class Test : MonoBehaviour { public static void Create(int a, Transform v = null) { } } }
Уберите пространство имен, статик у метода, перегрузку, либо наследование и скрипт будет валидным. На этом я и построил вывод о том, что необходимо соблюдение всех 4 условий.
UPD: со статиком перегнул, он не обязателен.
Если вы кинули валидный скрипт - он никуда не денется (единственное что при перезагрузке может сбиться, либо поля захайдить), так как проверка идет при добавлении элемента.
Devion, в твоем примере то кст, баг, описанный именно мной) Потому что у тебя там параметр по умолчанию :D
alexprey, да, но это неверная логика.
Параметр по умолчанию, сам по себе, без этих условий не приводит к таким последствиям.
Пространства имён, сами по себе тоже.
Статик методы, наследие от монобехи, аналогично.
Проблема возникает комплексно, то есть нельзя выделить что-то одно, и сказать что проблема, например, из-за перегрузки методов (параметров по умолчанию).
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]