Пятница, 29 Марта 2024, 09:10

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Переход с UnityScript на Csharp для не программиста
Переход с UnityScript на Csharp для не программиста
alexsilentДата: Вторник, 17 Июля 2018, 10:39 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Новая версия юнити полностью отказалась от JavaScript и перешла только на C#,


Но я не программист, а художник, мне это очень тяжело давалось, но я справился с изучением явыскрипта,
и даже из-за этого сразу понял в С# некоторые моменты, но не все, например:

Как делать динамический массив? В юнискрипт - был Array, а тут советуют перейти на List,
но я не программист и увидев документацию на сайте майкрософт малость прифигел:

https://msdn.microsoft.com/ru-ru/library/system.array(v=vs.110).aspx



Можно вкратце объяснить как использовать List на примере Array?

1) Как инициализировать?
2) Как добавлять Add и Push
3) и как удалять один слот RemoveAt?
4) Как очищать весь массив?



Сообщение отредактировал alexsilent - Вторник, 17 Июля 2018, 10:50
InsaneSystemsДата: Вторник, 17 Июля 2018, 10:48 | Сообщение # 2
участник
Сейчас нет на сайте
Цитата
1) Как инициализировать?

Код
List<int> yourList = new List<int>();

Данный код создаёт пустой список типа int (целочисленный). Дальше в него можно добавлять элементы.

Цитата
2) Как добавлять Add и Push

Код
yourList.Add(1);

В скобках - ваш объект. В данном случае это число, поскольку список типа int. Элемент добавится в конец списка.

Цитата
3) и как удалять один слот RemoveAt?

Код
yourList.RemoveAt(0);

Где 0 - позиция удаляемого элемента.

Цитата
4) Как очищать весь массив?

Код
yourList.Clear();

Полная очистка всего списка.

Почему, собственно, вы не можете остаться на версии 2018.1? Там поддерживается UnityScript. А, как известно, погоня за последними версиями - не всегда хорошо.

P.S.: справка microsoft - ад. Лучше уж найдите что-то поадекватнее. Можно почитать тут первые две главы - metanit.com. Написано простым русским языком, коротко, с примерами. Правда насчёт качества уроков по основам я не знаю, я их изучал не там.


Сообщение отредактировал InsaneSystems - Вторник, 17 Июля 2018, 10:52
alexsilentДата: Вторник, 17 Июля 2018, 11:04 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
InsaneSystems, Спасибо большое! То что нужно.

Цитата InsaneSystems ()
Почему, собственно, вы не можете остаться на версии 2018.1? Там поддерживается UnityScript. А, как известно, погоня за последними версиями - не всегда хорошо.


Это да, просто там иногда хорошие вещи добавляют, в будущем я буду урезан в плане 2д новых фич. Поэтому придётся этот долгострой делать на 2018.1 и учить плавно С# , чтобы переходить плавно на новые версии юнити в будущем написав весь код с нуля.

Добавлено (17 Июля 2018, 11:04)
---------------------------------------------

А вот ещё один вопрос, как делать глобальные скрипты, чтобы можно было бы обращаться к ним вот так
из совершенно других функций?


Код
MyGlobalScript.MyFunction();


как будто это системные скрипты сделанные самой юнити, типа:

Код
Application.LoadLevel("MyLevel");


где функция не Static, потому-что функция статик всегда требует чтобы были все переменные были статичные,
а если я захочу там инициализировать пару локальных переменных, пока веду вычисления в функции,
то например в яваскрипте выдаётся ошибка, и требует чтобы все переменные были статичные, мне почему-то кажется,
что в C# легко сделать реализацию доступа к функции без Static свойства на функции, но может быть я ошибаюсь


Сообщение отредактировал alexsilent - Вторник, 17 Июля 2018, 11:10
InsaneSystemsДата: Вторник, 17 Июля 2018, 11:14 | Сообщение # 4
участник
Сейчас нет на сайте
alexsilent, это точно так же делается с помощью static, и все переменные скрипта тоже должны быть статик (кроме внутренних в самих функциях/методах). Как альтернатива - использовать паттерн Singleton. Он очень прост в понимании даже без особых знаний C#, почитайте. Если коротко, в скрипте можно написать вот такой код:
Код

public class YourScript : MonoBehaviour
{
    public static YourScript instance {get; private set;}

    void Awake()
    {
         instance = this;
    }

    public void TestMethod()
    {
         Debug.Log("It works");
    }
}


А потом метод TestMethod можно вызвать из другого скрипта вот так:
Код
YourScript.instance.TestMethod();


Но тогда этот скрипт должен всегда быть на одном из объектов сцены. Как вариант - отказаться от MonoBehaviour, но это будет чуть сложнее.

P.S.: в идеале это всё делается более красиво, я для простоты понимания укоротил реализацию.


Сообщение отредактировал InsaneSystems - Вторник, 17 Июля 2018, 11:16
zhuravelsvДата: Вторник, 17 Июля 2018, 11:46 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Цитата InsaneSystems ()
справка microsoft - ад.

msdn конечно сложная, но очень детальная, но вместо неё уже есть новая docs.microsoft.com, там всё тоже очень понятно и с кучей примеров:
https://docs.microsoft.com/ru-ru/dotnet/standard/get-started
pixeyeДата: Вторник, 17 Июля 2018, 12:27 | Сообщение # 6
Red Winter Software
Сейчас нет на сайте
Настольная библия по Csharp - https://www.dotnetperls.com

ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

alexsilentДата: Вторник, 17 Июля 2018, 12:40 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
Цитата InsaneSystems ()
Как альтернатива - использовать паттерн Singleton. Он очень прост в понимании даже без особых знаний C#, почитайте. Если коротко, в скрипте можно написать вот такой код:


Спасибо! Жаль что нельзя делать как-то попроще, я почти так и делал в ЯваСКрипте, когда мне надоело
каждую функцию делать статичной, то сделал неуничтожаемый объект (после перезагрузки уровня),
и добавил почти такой же код на ЯваСкрипте в своих проектах:

Код
static var it : MyThisScript;
function Awake() {
// это чтобы не дублировалось, в каждом уровне такой объект есть, и удаляются, те кто создан позже
  if (It) {
   Destroy(gameObject);
   return;
  }
  It = this;
  DontDestroyOnLoad(gameObject);
}
function MyFunction() {
print("Ok!");
}


и потом обращался также:

Код

MyThisScript.it.MyFunction();


С другой стороны хорошо, что не придётся менять код в этом вопросе и почти также программировать на C#.)

Добавлено (17 Июля 2018, 12:40)
---------------------------------------------

Цитата zhuravelsv ()
msdn конечно сложная, но очень детальная, но вместо неё уже есть новая docs.microsoft.com, там всё тоже очень понятно и с кучей примеров:
https://docs.microsoft.com/ru-ru/dotnet/standard/get-started


Цитата pixeye ()
Настольная библия по Csharp - https://www.dotnetperls.com


Наверное самая большая проблема всех этих документаций, то что в них примеры не из юнити и очень сложно ориентироваться, если я не особо варю в программировании. :( Потому-что я всегда учился методом тыка, ищу
конкретный пример который будет 100% работать в этом движке и пробую тестировать, что-то менять, так и научился,
методом тыка)) потом уже начал больше вникать, но всё ещё примеры с незнакомыми функциями меня путают
и я не понимаю, что тут вообще написано иногда, потому в документации самой юнити я нормально ориентируюсь,
ибо все функции знакомы , даже если это пример на C#, с которым я не особо знаком.

И ещё важно чтобы код был очень коротким, чтобы была только самая важная суть в 1-10 строк.)

Но всё равно спасибо большое, попробую вникнуть, может быть будет очень полезной!


Сообщение отредактировал alexsilent - Вторник, 17 Июля 2018, 12:46
pixeyeДата: Вторник, 17 Июля 2018, 13:05 | Сообщение # 8
Red Winter Software
Сейчас нет на сайте
ты просто спрашивай моменты которые не понимаешь. Тем более если ты выучил Unityscript у тебя не должно будет возникнуть больших проблем.

ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Вторник, 17 Июля 2018, 13:20
alexsilentДата: Вторник, 17 Июля 2018, 13:30 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
Цитата InsaneSystems ()
Цитата
2) Как добавлять Add и Push

Код
yourList.Add(1);

В скобках - ваш объект. В данном случае это число, поскольку список типа int. Элемент добавится в конец списка.


А как в начало списка добавлять? Как Push в Array на UnityScript
InsaneSystemsДата: Вторник, 17 Июля 2018, 13:55 | Сообщение # 10
участник
Сейчас нет на сайте
alexsilent,
Код
yourList.Insert(0, item);

Как вариант, вот так. Добавляешь item в первую позицию, сдвигая остальные.
alexsilentДата: Вторник, 17 Июля 2018, 14:46 | Сообщение # 11
почти ветеран
Сейчас нет на сайте
Цитата InsaneSystems ()
Как вариант, вот так. Добавляешь item в первую позицию, сдвигая остальные.

О, так можно добавлять вообще на любую позицию?! Круто!

Добавлено (01 Октября 2019, 09:14)
---------------------------------------------
Откопал свою старую тему, не совсем некропостинг, ибо всё ещё перехожу на C#,
и это всё ещё актуально, этот процесс сложен для художника. crazy

Появилось пару вопросов:

1) Можно ли работать с одной осью в C#, как на JS?

Код
transform.position.x += .5;


2) Зачем в С#, дополнительное отступление?
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {
    void Start () {
  print("Okay!");
    }
}


То есть зачем класс скобками окружать? В один скрипт что-ли можно два класса добавить?
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {
    void Start () {
  print("Okay!");
    }
}
// Можно ли добавить этот второй класс? Раз уж тут в скрипте есть отдельные скобки?
public class NewBehaviourScript2 : MonoBehaviour {
    void Start () {
  print("Okay 2!");
    }
}


Этот лишний TAB пробел меня отвлекает, как будто кажется я где-то скобку не закрыл, придётся привыкать! :(

Добавлено (01 Октября 2019, 09:19)
---------------------------------------------
PS Тут забавный баг на форуме, я это сообщение не могу отредактировать,
Может потому-что оно якобы старое?
Но я ведь новое сообщение написал, и оно "стакнулось" в старое сообщение, и может поэтому не могу
поправить текст.

InsaneSystemsДата: Вторник, 01 Октября 2019, 10:13 | Сообщение # 12
участник
Сейчас нет на сайте
alexsilent,
1) по дефолту нельзя. Можно сделать расширяющие методы, но вам пока рановато. Пишите transform.position += new Vector3(0.5f, 0f, 0f); или найдите более короткую запись. Может показаться неудобным, но на деле это незначительно.
2) Можно, но если второй класс MonoBehaviour, то он работать как компонент не будет. Или наоборот, первый отвалится. Но можно добавлять классы, которые не наследуются от MonoBehaviour. И это не лишний таб-пробел, в большинстве программ такое есть. Мне, например, так читать удобнее, код не совсем липнет к краю экрана.
alexsilentДата: Суббота, 05 Октября 2019, 07:57 | Сообщение # 13
почти ветеран
Сейчас нет на сайте
InsaneSystems, спасибо!

Добавлено (05 Октября 2019, 08:15)
---------------------------------------------
Мне понравилось как реализовано у pixeye в Actors, где скрипты отдельно от переменных,
но такое сложное программирование я не вывезу, мне нужно что-то полегче, но где тоже можно будет
вводить свои переменные сколько хочешь для отдельного объекта,
ну допустим я хочу для своего героя: HP, Life, Defense, Attack и прочие переменные.

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

Поэтому у меня появились новые вопросы по С#:

1) Можно ли получить быстрый доступ к переменной Life, через String "Life"?

2) (и если первый вариант сложен) Можно ли создать массив переменных, где можно легко и быстро
получить доступ к любой яйчейке массива по имени?
И какой лучше всего массив для этого подходит?
Я слышал что в C# очень много видов массивов, мне нужен очень быстрый + чтобы его можно было бы использовать
до 1000 и более объектов одновременно.

3) В юнити скрипты запускаются в случайном порядке, поэтому всегда сложно предугадать, какой скрипт в каком порядке
запускается, мне нравится больше, когда вся игра в одном скрипте написана, чтобы легко это контролировать было.
Но в юнити это очень сложно всё запихать в один скрипт (включая и проверку коллизии).
Можно ли как-то упорядочить, чтобы все скрипты всегда в точном порядке запускались?
В юнити есть Order (порядок действий скриптов), но я не уверен будет ли это работать для сотни скриптов,
и работает ли это для FixedUpdate и Update или только влияет на Awake и Start?

pixeyeДата: Суббота, 05 Октября 2019, 09:10 | Сообщение # 14
Red Winter Software
Сейчас нет на сайте
Цитата alexsilent ()
Мне понравилось как реализовано у pixeye в Actors, где скрипты отдельно от переменных,
но такое сложное программирование я не вывезу,


Все что ты хочешь не то чтобы сложно но ты уже задаешь вопросы которые немного выходят за рамки вопросов нубов. Ты хочешь контроля и скорости.
Программирование на акторсах не сложное, просто думаешь иначе. У меня в группе есть человек который год назад вообще программировать не умел, ему хорошо за 30, и сейчас уже вполне шустро клепает игру на андроид на акторсах.

1) Получить можно, но либо
* через словарь ( dictionary<ключ,значение )
* через рефлексию ( найти в классе по string поле и работать с ним )

2) Можно и это именно то что я решал в акторсах.
Быстрота для контейнеров оч растяжимое понятие.
* Ничего не бывает просто так, за любую скорость приходится платить. Как правило памятью. Например самый простой перебор массива не так плох если у тебя в районе 10 элементов. Необязательно для этого юзать словарь. Если ты умудришься дешево упорядочить элементы то можно уже применить бинарный поиск на массив, это еще даст буста. Так например сортируются сущности в группах акторов. Они изначально туда попадают упорядоченными и при необходимости очень быстро *находятся*
* Я практически всегда пользуюсь просто массивами.

3) Можно и опять таки эту задачу решил.
В акторсах это сделано так. Все моно скрипты наследуются от единого родителя MonoCache. Стартер на запуске блокирует всем имеющимся скриптам возможность вызвать OnEnable, запускает сначала себя и все настраивает
после чего запускает события монокешей на сцене.

Почитай бложек
Гайд как настроить и запустить

Акторсы вообще уже идут с учебным проектом


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Суббота, 05 Октября 2019, 09:33
pixeyeДата: Суббота, 05 Октября 2019, 09:21 | Сообщение # 15
Red Winter Software
Сейчас нет на сайте
Причем в акторсах есть оч много всякого полезного и интересного. Например реактивное обозрение изменений для переменных как в Unirx ( только быстрее в силу большей простоты )



Код

    ScriptableTask task;
  TextMeshProUGUI textSource;
  
  public void SetAmount()
  {
   textSource = transform.Get<TextMeshProUGUI>("TMP Amount"); // упрощение бойлерплейта GetComponent до Get. фигня но набивать символов меньше
   task.ValueChange(src => task.source.participants.length, UpdateValue, ref observer); // подключаем обозреватель, если кол-во участников на работе поменяются то это отразится в интерфейсе
  }

  void UpdateValue(int arg)
  {
   textSource.SetText($"{arg} / {maxParticipants}");
  }


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Суббота, 05 Октября 2019, 09:26
alexsilentДата: Суббота, 05 Октября 2019, 09:30 | Сообщение # 16
почти ветеран
Сейчас нет на сайте
pixeye, больше всего в модах для юнити я боюсь отмены поддержки потом и сложные договоры.
Я не читал лицензионное соглашение по Актёрам ещё, может там всё в свободном доступе (это я просто назвал :) )
но пункт с поддержкой меня очень пугает, уже несколько хороших плагинов я перестал использовать на юнити,
потому-что авторы прекратили их поддерживать, они просто больше не запускаются на новых версиях юнити((
и поэтому решил пытаться сам всё изучать и даже написал
на JS свой собственный язык программирования внутри юнити, чтоб скрипты для уровней делать без компиляции,
проблема теперь в том, что надо на C# это всё переписывать(((

Хотя ради интереса мне интересно глянуть на Actors с точки зрения, насколько там легко создавать игры. :)
Похоже ли это на конструктор для дизайнера или всё ещё сложно для меня?!


Сообщение отредактировал alexsilent - Суббота, 05 Октября 2019, 09:38
pixeyeДата: Суббота, 05 Октября 2019, 09:41 | Сообщение # 17
Red Winter Software
Сейчас нет на сайте
Цитата alexsilent ()
pixeye, больше всего в модах для юнити я боюсь отмены поддержки потом и сложные договоры.
Я не читал лицензионное соглашение по Актёрам ещё, может там всё в свободном доступе (это я просто назвал )
но пункт с поддержкой меня очень пугает, уже несколько хороших плагинов я перестал использовать на юнити,
потому-что авторы прекратили их поддерживать, они просто больше не запускаются на новых версиях юнити((
и поэтому решил пытаться сам всё изучать и даже написал
на JS свой собственный язык программирования внутри юнити, чтоб скрипты для уровней делать без компиляции,
проблема теперь в том, что надо на C# это всё переписывать(((

Хотя ради интереса мне интересно глянуть на Actors с точки зрения, насколько там легко создавать игры.


1) Начал акторсы в октябре 2017. Сейчас октябрь 2019. У нас есть комьюнити на дискорде где сидят разные ребята с разным опытом. На скок знаю есть разработчик который уже выпустил игрушку на одной из старых (!) версий акторсов на мобилы.
2) Разработка игр не мое хобби, а профессия.И я как это говорят eat your own dog food. Тоесть разрабатываю на том же самом. Буквально. Это не абстрактно учебный проект. Мы сейчас всей командой поедем в мск на WhiteNights показывать игрушку. Вот свои собственне проекты убивал легко :) Потому что как раз много экспериментировал и больше думал о технической стороне. Сейчас уже акторсы в таком состоянии, что добавлять туда можно разве что всякие финтифлюши.
3)
Цитата alexsilent ()
на JS свой собственный язык программирования внутри юнити,
Ну если ты "пишешь языки программирования" то проблем у тебя быть не должно с кодом лол XDD


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Суббота, 05 Октября 2019, 09:44
alexsilentДата: Суббота, 05 Октября 2019, 09:48 | Сообщение # 18
почти ветеран
Сейчас нет на сайте
Цитата pixeye ()
// упрощение бойлерплейта GetComponent до Get. фигня но набивать символов меньше


про GetComponent мне понравилось) для меня впервую очередь это очень критично,
чем меньше символов, тем легче для меня читать код, а также писать быстрее намного...
Не люблю в юнити эти длинные команды типа:
Код
BroadcastMessage("Rename",Text,SendMessageOptions.DontRequireReceiver)
pixeyeДата: Суббота, 05 Октября 2019, 09:57 | Сообщение # 19
Red Winter Software
Сейчас нет на сайте
Цитата alexsilent ()
про GetComponent мне понравилось) для меня впервую очередь это очень критично,
чем меньше символов, тем легче для меня читать код, а также писать быстрее намного...
Не люблю в юнити эти длинные команды типа:


Единственное учиться все равно надо, акторы не серебряная пуля,я по максимуму убил бойлерплейт, но ты все равно будешь иметь дело с абстракцией которую надо понимать.

Вот например обработчик простых стейт машин

Код

// создаем процессор с группой сущностей у которых должен быть компонент ComponentFSM
sealed class ProcessorFSM : Processor<ComponentFSM>, ITick
{
  const int null_state = -1;
  // вместо апдейтов свой тик с уже вложенной дельтой
  public void Tick(float delta)
  {
   // source - это название группы если создаешь процессор таким образом
   // там есть свой итератор и ты можешь легко прогнать всех активных сущностей группы
   foreach (ent entity in source)
   {
   // достаем компонент из сущности.
    var     cFSM      = entity.ComponentFSM();
    ref var stateNext = ref cFSM.stateNext;
    ref var state     = ref cFSM.stateCurrent;

    cFSM.source.HandleUpdateState(entity, state, ref stateNext);

    if (stateNext != null_state && cFSM.stateCurrent != stateNext)
    {
     cFSM.source.HandleExitState(entity, state);
     cFSM.source.HandleSetState(entity, stateNext);
    
     state = stateNext;
     stateNext         = null_state;
    }
   }
  }
}


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Суббота, 05 Октября 2019, 10:00
alexsilentДата: Суббота, 05 Октября 2019, 09:57 | Сообщение # 20
почти ветеран
Сейчас нет на сайте
Цитата pixeye ()
Это не абстрактно учебный проект. Мы сейчас всей командой поедем в мск на WhiteNights показывать игрушку


Звучит прикольно! )

Цитата pixeye ()
Ну если ты "пишешь языки программирования" то проблем у тебя быть не должно с кодом лол XDD


Ну если коротко, то скрипт разделяет текст по пробелам через Split
и ищет через switch какая это команда и потом работает определённая функция, это не так уж и сложно)
То есть это почти начальный уровень программирования, все сложные ООП штуки я категорически избегаю)

Добавлено (05 Октября 2019, 10:05)
---------------------------------------------

Цитата pixeye ()
Вот например обработчик простых стейт машин


Честно говоря я вообще не понял этот код. :'(
Тут какой-то нужен новый уровень понимания,
я пишу стейт машину простыми вещами, примерно так (сорри что JS, на C# быстро пока не могу писать):
Код

var state : String = "idle";
switch (state) {
case "walk": WalkFunction();break;
case "idle": IdleFunction();break;
}


А тут я просто не понимаю, например что за HandleUpdate
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Переход с UnityScript на Csharp для не программиста
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

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