Пятница, 29 Марта 2024, 03:30

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » C# необычная функция с возвращением результата (Реально ли сделать такое?)
C# необычная функция с возвращением результата
alexsilentДата: Вторник, 07 Января 2020, 06:56 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Сейчас я допиливаю свой мини скриптер, чтобы программировать уровни без компиляции.
Я не особо программист, больше художник, но вроде пока получается,
до этого я давно на JS делал подобный скриптер в юнити, но с большим
количеством проблем и не оптимизированных моментов.

И хотел спросить, можно ли вместо такой функции:
Код

void Awake() {
    int MaxHP = 10;
    MaxHP = AddAction(MaxHP,1);
}

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, что если даже не замедляет скорость кода,
но точно это выглядит сложно и не оптимизированно:
Код

Game.Group[words[0].Substring(1)].num[words[1]] = AddAction(Game.Group[words[0].Substring(1)].num[words[1]],PlusNumber);


где Game.Group[words[0].Substring(1)].num[words[1]] повторяется два раза, это Dictionary в Dictionary,
довольно массивно, не правда ли?


Сообщение отредактировал alexsilent - Вторник, 07 Января 2020, 07:14
drcrackДата: Вторник, 07 Января 2020, 07:15 | Сообщение # 2
старожил
Сейчас нет на сайте
Код
void Awake() {
    var MaxHP = 10;
    AddAction(ref MaxHP, 1);
    // MaxHP == 11
}

void AddAction(ref int num, int num2) {
    num += num2;
}


Сообщение отредактировал drcrack - Вторник, 07 Января 2020, 07:15
alexsilentДата: Вторник, 07 Января 2020, 07:22 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
drcrack, точно Спасибо! Круто что в C# тоже можно сделать такое!
С этим же нет никаких проблем или подводных камней, можно ли ref делать с Dictionary?


Сообщение отредактировал alexsilent - Вторник, 07 Января 2020, 07:23
drcrackДата: Вторник, 07 Января 2020, 08:18 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата
С этим же нет никаких проблем или подводных камней, можно ли ref делать с Dictionary?

я на самом деле не дочитал до Dictionary
так вот, с Dictionary тебе в общем-то и ref не нужен, он и так всегда передается по ссылке
т.е. ты можешь внутри AddAction менять значения в своем словаре и это будет просто работать без лишнего кода


Сообщение отредактировал drcrack - Вторник, 07 Января 2020, 08:19
alexsilentДата: Вторник, 07 Января 2020, 08:38 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
Цитата drcrack ()
так вот, с Dictionary тебе в общем-то и ref не нужен, он и так всегда передается по ссылке
т.е. ты можешь внутри AddAction менять значения в своем словаре и это будет просто работать без лишнего кода

А как это работает, какой код надо написать?
Или имеется ввиду просто запомнить имя словаря и изменить его прямо в функции?
Просто у меня функция AddAction будет работать не только со словарём, но и несколькими другими переменными,
например там могут быть строки типа:
Код

AddAction(Game.WindPower,1);
AddAction(Game.Day,1);
AddAction(Hero.HP,1);

и другие переменные, которые не входят в словарь, тоже будут работать с этим скриптом
или я просто не так понял суть

Добавлено (07 Января 2020, 08:43)
---------------------------------------------


Сообщение отредактировал alexsilent - Вторник, 07 Января 2020, 08:47
drcrackДата: Вторник, 07 Января 2020, 09:09 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата
Просто у меня функция AddAction будет работать не только со словарём, но и несколькими другими переменными,

сделай несколько AddAction с разными комбинациями параметров
компилятор сам выберет нужную, это называется "перегрузка методов"

Цитата
Или имеется ввиду просто запомнить имя словаря и изменить его прямо в функции?

просто меняй как будто ты вообще не в функции а там откуда ты ее вызываешь

Цитата
А как это работает, какой код надо написать?

Код

void AddAction(Dictionary<тип> dict, string key, int num) {
  dict[key] += num
}

// Далее
AddAction(Game.Group[words[0].Substring(1)], words[1], 123);


PS еще погугли "C# generics"


Сообщение отредактировал drcrack - Вторник, 07 Января 2020, 09:13
alexsilentДата: Вторник, 07 Января 2020, 09:25 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
Цитата drcrack ()
просто меняй как будто ты вообще не в функции а там откуда ты ее вызываешь

Большое Спасибо! Не знал что так можно делать, такой код хорошо читается и приятно выглядит!

Цитата drcrack ()
сделай несколько AddAction с разными комбинациями параметров
компилятор сам выберет нужную, это называется "перегрузка методов"


Я боялся делать несколько функций с одинаковыми именами и разными входящими типами данных,
мне казалось компилятор будет медленнее читать такой код, ибо будет искать 2 или больше функций вместо одной,
но если это не влияет на производительность, то круто!
drcrackДата: Вторник, 07 Января 2020, 09:31 | Сообщение # 8
старожил
Сейчас нет на сайте
забыл добавить, если ты все-таки передаешь int (например Game.Group[words[0].Substring(1)].num[words[1]]), то нужен ref
если так как у меня в посте выше (словарь отдельно, ключ отдельно) — ref не нужен
XakepДата: Вторник, 07 Января 2020, 09:41 | Сообщение # 9
めちゃくちゃちゃ
Сейчас нет на сайте
добавлю еще, что вот это:

Код

Game.Group[words[0].Substring(1)].num[words[1]] = AddAction(Game.Group[words[0].Substring(1)].num[words[1]],PlusNumber);


можно переписать в более читабельный вид:

Код

var dict = Game.Group[words[0].Substring(1)].num;
dict[words[1]] = AddAction(dict[words[1]], PlusNumber);
alexsilentДата: Вторник, 07 Января 2020, 10:11 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
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
InsaneSystemsДата: Вторник, 07 Января 2020, 18:17 | Сообщение # 11
участник
Сейчас нет на сайте
alexsilent, для Dictionary не нужен ref. Достаточно создать переменную в любом месте кода до вызова функции/метода, в котором он будет использоваться, и просто в него писать.

Рандомный набросок.
Код

void Foo()
{
  var dict = new Dictionary<int, string>();

  Bar(dict);
  // Теперь в dict есть запись, которая была добавлена в методе Bar.
}

void Bar(Dictionary<int, string> inputDict)
{
  inputDict.Add(0, "something");
}


Сообщение отредактировал InsaneSystems - Вторник, 07 Января 2020, 18:19
drcrackДата: Среда, 08 Января 2020, 00:03 | Сообщение # 12
старожил
Сейчас нет на сайте
Цитата
забыл добавить, если ты все-таки передаешь int (например Game.Group[words[0].Substring(1)].num[words[1]]), то нужен ref

я чето затупил, наверно потому что в реальной жизни такого никогда не писал
так вот, это не работает т.е. нельзя индексатор передать как ref
делай как у меня в посте с ключом в отдельном аргументе — так работает

Цитата
Рандомный набросок.

посмотри внимательно что именно тс пытается сделать


Сообщение отредактировал drcrack - Среда, 08 Января 2020, 00:03
InsaneSystemsДата: Среда, 08 Января 2020, 12:32 | Сообщение # 13
участник
Сейчас нет на сайте
Цитата

посмотри внимательно что именно тс пытается сделать

Да, пожалуй стоило прочитать полностью :D
alexsilentДата: Четверг, 09 Января 2020, 07:24 | Сообщение # 14
почти ветеран
Сейчас нет на сайте
drcrack, я пока там запутался и решил откат сделать) пришлось по 2 раза писать.
Код

string word = words[0].Substring(1);
Game.Group[word].num[words[1]] = MathAction(Game.Group[word].num[words[1]], WORD);


Но зато пока работает)
потестил, можно уже писать свой первый мини скрипт, где пока есть только print, проверка if и инициализация данных словаря + математика с этими данными)



Язык у меня пока примитивный там, то есть надо обязательно слова разделять пробелом,
например вот так не будет работать
Код
$hero.hp=10
а нужно вот так
Код
$hero.hp = 10

ибо у меня всё через Split(" "[0]) по пробелам ищу новые словам, и других будет куча ограничений,
но зато можно будет легко делать уровневые скрипты, как я раньше на JS делал, в одной из своих игр:




Сообщение отредактировал alexsilent - Четверг, 09 Января 2020, 08:05
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » C# необычная функция с возвращением результата (Реально ли сделать такое?)
  • Страница 1 из 1
  • 1
Поиск:

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