Добавлен , опубликован

Заметки по Unity3D

Содержание:
Писал я скриптик, большой, жирный, с кучей вспомогательных методов. Дальше перешел к тестированию, пытаюсь перетащить его на объект. И вот, я получил ошибку!
Вы просто не представляете как было сложно найти причину этой ошибки. Пришлось удалять по строчке, пока не нашел проблему.
Сперва думал, что проблема в наследовании интерфейса. Но... нет.
Использование пространства имен? Тоже, мимо.
В ходе дальнейших экспериментов выяснил, что проблема возникла в написанных функциях. А если быть точнее в такой вот строчке
public bool IsUseResource(ResourceType resourceType, ResourceAction resourceAction = ResourceAction.Count)
Казалось бы, что тут может быть не так? А косяк в параметре по умолчанию.
// Замена 
ResourceAction resourceAction = ResourceAction.Count
// на 
ResourceAction resourceAction
решило проблему... Неожиданно, не правда ли???
Теперь мы можем сделать следующий вывод:
Не используйте параметры по умолчанию в методах MonoBehaviour!

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
10 лет назад
0
На самом деле этот баг свойственен если соблюдаются 4 условия:
  1. Задействовано пространство имен
  2. Имеются статические методы
  3. Имеется перегрузка метода
  4. Наследие от MonoBehaviour
В этом случае действительно происходит вот такой вот баг. Однако если хотя бы один из этих пунктов упущен - все будет работать на ура.
0
29
10 лет назад
0
Extravert, не совсем так, ибо я использую и пространство имен и статичные методы и перегрузку и даже наследуюсь от монобехайвеора
0
27
10 лет назад
Отредактирован Devion
0
alexprey, вот простейший пример, который я имел ввиду. Скрин: prntscr.com/390te5
Тело:
using UnityEngine;

namespace MyNamespace
{
    public class Test : MonoBehaviour
    {
        public static void Create(int a, Transform v = null)
        {
            
        }
    }
}
Уберите пространство имен, статик у метода, перегрузку, либо наследование и скрипт будет валидным. На этом я и построил вывод о том, что необходимо соблюдение всех 4 условий.
UPD: со статиком перегнул, он не обязателен.
Если вы кинули валидный скрипт - он никуда не денется (единственное что при перезагрузке может сбиться, либо поля захайдить), так как проверка идет при добавлении элемента.
0
29
8 лет назад
0
Devion, в твоем примере то кст, баг, описанный именно мной) Потому что у тебя там параметр по умолчанию :D
0
27
8 лет назад
Отредактирован Devion
0
alexprey, да, но это неверная логика.
Параметр по умолчанию, сам по себе, без этих условий не приводит к таким последствиям.
Пространства имён, сами по себе тоже.
Статик методы, наследие от монобехи, аналогично.
Проблема возникает комплексно, то есть нельзя выделить что-то одно, и сказать что проблема, например, из-за перегрузки методов (параметров по умолчанию).
Чтобы оставить комментарий, пожалуйста, войдите на сайт.