Сейчас я допиливаю свой мини скриптер, чтобы программировать уровни без компиляции. Я не особо программист, больше художник, но вроде пока получается, до этого я давно на JS делал подобный скриптер в юнити, но с большим количеством проблем и не оптимизированных моментов.
int AddAction(int num, int num2) { return num+num2; }
Написать вот такую функцию:
Код
void Awake() { int MaxHP = 10; AddAction(MaxHP,1); // можно ли тут не повторять 2 раза "MaxHP" в строке? }
int AddAction(int num, int num2) { // похоже тут надо что-то изменить, чтобы num вернула результат назад? return num+num2; }
Чтобы моя функция AddAction вернула данные сразу в MaxHP, то есть чтобы на выходе MaxHP стал равен 11, я где-то давно встречал, что можно вернуть данные назад в вводную переменную в функции, но может быть это был не C#, а другой язык, и я даже не знаю как загуглить, ибо не знаю как это назвать правильно по английски.
Возможно что-то нужно написать в этой строке, рядом с num, чтобы данные назад вернулись оттуда прямо в MaxHP, но не могу вспомнить даже в каком языке это делал:
Код
int AddAction(int num, int num2) {
Добавлено (07 Января 2020, 07:13) --------------------------------------------- Просто к чему это я хочу сделать, у меня в реальном коде это выглядит малость сложнее, и два раза повторяется одно и тоже данное из Dictionary, что если даже не замедляет скорость кода, но точно это выглядит сложно и не оптимизированно:
С этим же нет никаких проблем или подводных камней, можно ли ref делать с Dictionary?
я на самом деле не дочитал до Dictionary так вот, с Dictionary тебе в общем-то и ref не нужен, он и так всегда передается по ссылке т.е. ты можешь внутри AddAction менять значения в своем словаре и это будет просто работать без лишнего кода
Сообщение отредактировал drcrack - Вторник, 07 Января 2020, 08:19
так вот, с Dictionary тебе в общем-то и ref не нужен, он и так всегда передается по ссылке т.е. ты можешь внутри AddAction менять значения в своем словаре и это будет просто работать без лишнего кода
А как это работает, какой код надо написать? Или имеется ввиду просто запомнить имя словаря и изменить его прямо в функции? Просто у меня функция AddAction будет работать не только со словарём, но и несколькими другими переменными, например там могут быть строки типа:
и другие переменные, которые не входят в словарь, тоже будут работать с этим скриптом или я просто не так понял суть
Добавлено (07 Января 2020, 08:43) ---------------------------------------------
Если по хорошему, то мой полный код выглядит ещё сложнее, не просто AddAction, где только плюс, а вот так сделал, где можно разные математические вещи делать взяв их из строки string, но для вопроса я упростил это до AddAction, это на JS, я пока ещё не переписал эту функцию на C#:
Код
// Математические операции function MathAction(A : float,WORD : String[]) : int { //print("MathAction: "+A+" "+WORD[1]+" "+WORD[2]+" "+WORD[3]+" "+WORD[4]); // {A} {=+-*/} {B} ( {+-*/} {C} ) if (WORD[3] == "//") {WORD[3]=null;WORD[4]=null;} var B : float = GrabInt(WORD[2]); var C : float = GrabInt(WORD[4]); switch (WORD[1]+WORD[3]) { case "=": return B;break; // A = B
case "=+": return B+C; break; // A = B + C case "=-": return B-C; break; // A = B - C case "=*": return B*C; break; // A = B * C case "=/": return B/C; break; // A = B / C
case "+": return A+B; break; // A += B case "-": return A-B; break; // A -= B case "*": return A*B; break; // A *= B case "/": return A/B; break; // A /= B
case "+*": return A+B*C; break; // A + B * C case "-*": return A-B*C; break; // A - B * C case "+/": return A+B/C; break; // A + B / C case "-/": return A-B/C; break; // A - B / C
default: return B; break; // A = B } }
Сообщение отредактировал alexsilent - Вторник, 07 Января 2020, 08:47
просто меняй как будто ты вообще не в функции а там откуда ты ее вызываешь
Большое Спасибо! Не знал что так можно делать, такой код хорошо читается и приятно выглядит!
Цитатаdrcrack ()
сделай несколько AddAction с разными комбинациями параметров компилятор сам выберет нужную, это называется "перегрузка методов"
Я боялся делать несколько функций с одинаковыми именами и разными входящими типами данных, мне казалось компилятор будет медленнее читать такой код, ибо будет искать 2 или больше функций вместо одной, но если это не влияет на производительность, то круто!
забыл добавить, если ты все-таки передаешь int (например Game.Group[words[0].Substring(1)].num[words[1]]), то нужен ref если так как у меня в посте выше (словарь отдельно, ключ отдельно) — ref не нужен
Xakep, спасибо! Всё время забываю, что можно инициировать переменную с помощью var.
drcrack, попытался почитать про "C# generic" и это сложно для меня, кажется будто тут совсем другой язык, который я ещё не изучал, и он достаточно сложный для художника) Например, пример:
Код
class MyGenericClass<T> { private T genericMemberVariable;
public MyGenericClass(T value) { genericMemberVariable = value; }
public T genericMethod(T genericParameter) { Console.WriteLine("Parameter type: {0}, value: {1}", typeof(T).ToString(),genericParameter); Console.WriteLine("Return type: {0}, value: {1}", typeof(T).ToString(), genericMemberVariable);
return genericMemberVariable; }
public T genericProperty { get; set; } }
смотрю в него и вижу что-то непонятное, возможно причина в том, что мне всегда сложно ООП даётся, и я только поверхностные основы освоил, как дизайнеру мне легче понимать простые скрипты, которые обычно в Lua или Basic используют, и на основе тех языков я пытаюсь учить C#. Попробую потом ещё погуглить, может быть встречу более простые и понятные примеры.
Добавлено (07 Января 2020, 16:06) --------------------------------------------- Кажется ref не работает с dictionary или я не так это делаю) буду гуглить, ибо что-то пошло не так, может я просто накосячил в коде.
Сообщение отредактировал alexsilent - Вторник, 07 Января 2020, 16:07
alexsilent, для Dictionary не нужен ref. Достаточно создать переменную в любом месте кода до вызова функции/метода, в котором он будет использоваться, и просто в него писать.
Рандомный набросок.
Код
void Foo() { var dict = new Dictionary<int, string>();
Bar(dict); // Теперь в dict есть запись, которая была добавлена в методе Bar. }
забыл добавить, если ты все-таки передаешь int (например Game.Group[words[0].Substring(1)].num[words[1]]), то нужен ref
я чето затупил, наверно потому что в реальной жизни такого никогда не писал так вот, это не работает т.е. нельзя индексатор передать как ref делай как у меня в посте с ключом в отдельном аргументе — так работает
Цитата
Рандомный набросок.
посмотри внимательно что именно тс пытается сделать
Сообщение отредактировал drcrack - Среда, 08 Января 2020, 00:03
drcrack, я пока там запутался и решил откат сделать) пришлось по 2 раза писать.
Код
string word = words[0].Substring(1); Game.Group[word].num[words[1]] = MathAction(Game.Group[word].num[words[1]], WORD);
Но зато пока работает) потестил, можно уже писать свой первый мини скрипт, где пока есть только print, проверка if и инициализация данных словаря + математика с этими данными)
Я тут сделал unitypackage (всего 10кб) со своими скриптами, чтоб дать оценить, но вряд ли это будет кому-то интересно, там пока готово 2 скрипта Code и Game: https://drive.google.com/open?id=1SIKqCwtIFKoU3HbvRghT4rjSUI0EeCUF
Язык у меня пока примитивный там, то есть надо обязательно слова разделять пробелом, например вот так не будет работать
Код
$hero.hp=10
а нужно вот так
Код
$hero.hp = 10
ибо у меня всё через Split(" "[0]) по пробелам ищу новые словам, и других будет куча ограничений, но зато можно будет легко делать уровневые скрипты, как я раньше на JS делал, в одной из своих игр:
Я просто не знаю как ещё делать скрипты для своих уровней без компиляции. Плагины обычно не обновляются и забрасываются, значить нужно искать свой вариант, пришлось думать, как сделать свой разбиватель текста на строки. А теперь ещё на C# переписываю с JS. Ибо юнити отказались от JS, а у меня весь движок был на нём написан.(
Сообщение отредактировал alexsilent - Четверг, 09 Января 2020, 08:05