Суббота, 11 Мая 2024, 07:12

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Записи участника » seaman [1323]
Результаты поиска
seamanДата: Понедельник, 08 Января 2018, 23:29 | Сообщение # 141 | Тема: Asset для создания визуальной новеллы
старожил
Сейчас нет на сайте
Fungus бесплатный и вроде там всего должно хватить. Vinoma не видел и он платный.
seamanДата: Понедельник, 08 Января 2018, 23:22 | Сообщение # 142 | Тема: Таблица рекордов в игре
старожил
Сейчас нет на сайте
Куда выложена?
Поиск "LeaderBoard"...
seamanДата: Пятница, 27 Октября 2017, 19:51 | Сообщение # 143 | Тема: Как в новом объекте воспроизвести метод из другого объекта ?
старожил
Сейчас нет на сайте
Цитата
нет ничего плохо в том, чтобы писать качественнее и лучше

Кто бы спорил!
Только писать if(true == true) не значит писать качественней. Более того совершенно нельзя использовать рекомендации C в C#. Почему? Потому что в C нет настоящего булевого типа. Там True это целое значение не равное 0, False - целое значение равное 0. Поэтому там можно "выстрелить себе в ногу" например так:
Код
int i = 0;
if (i = 1)
  printf("i == 1");
else
  printf("i == 0");

Тут в if перепутан == и = При этом ошибки никакой нет. Оператор присваивания i = 1 возвращает эту самую 1. А 1 трактуется как True. Следовательно выводиться будет всегда "i == 1". Это не то что хотел программист.
Чтобы избежать подобных ошибок и сделали рекомендацию - сравнивать с True, даже если переменная bool.
Ну а теперь перенесите это на шарп.
Да Вам сразу компилятор взвоет на if (i = 1) и не даст "выстрелить себе в ногу".
Ну и нафига рекомендации языка C использовать в C# в таком случае?

Добавлено (27 октября 2017, 19:51)
---------------------------------------------
Ну а в Unity вообще свои заморочки. Например для GameObject и MonoBehaviour переопределен оператор ==. Причины можете посмотреть тут: https://blogs.unity3d.com/ru/2014/05/16/custom-operator-should-we-keep-it/
Поэтому такой тип кеширования:

Код
private Transform m_CachedTransform
public Transform transform
{
  get
  {
    if (m_CachedTransform == null)
      m_CachedTransform = InternalGetTransform();
    return m_CachedTransform;
  }
}

(Вместо трансформ можно взять любой компонент) может даже и замедлить работу. Именно из-за == null.

Вывод - нельзя рекомендации одного языка тупо переносить на другие. Нельзя рекомендации одной среды тупо переносить на другие.
Ну а в C# использование if(flag == true) считается моветоном.
seamanДата: Пятница, 27 Октября 2017, 13:49 | Сообщение # 144 | Тема: Как в новом объекте воспроизвести метод из другого объекта ?
старожил
Сейчас нет на сайте
Цитата
что вас смущает?

1. Куда вы встраивать игру собираетесь?
2. Где вы видели в Юнити язык Си?
Пишите как хотите - Ваше же право. Можете даже писать для надежность if(true == true) (а вдруг не так - проверить же надо!)
seamanДата: Вторник, 24 Октября 2017, 21:30 | Сообщение # 145 | Тема: jdk 8
старожил
Сейчас нет на сайте
Ну переустановите винду - крайняя мера!
seamanДата: Пятница, 20 Октября 2017, 23:25 | Сообщение # 146 | Тема: Как в новом объекте воспроизвести метод из другого объекта ?
старожил
Сейчас нет на сайте
Цитата
Не вижу ничего плохого в этом.

Плохо тем, что выдает в Вас нуба.
if проверяет что внутри скобок. Если true - выполняет. Т.е. if(myVar) уже проверяет myVar == true или нет
Написав if(myVar == true) Вы просто повторяете то, что уже есть внутри C#.
Правда умный компилятор все равно и то и другое приведет к одному и тому же коду CIL.
seamanДата: Вторник, 10 Октября 2017, 23:58 | Сообщение # 147 | Тема: Таймер с отложенным действием
старожил
Сейчас нет на сайте
Недостатки
1. Нужен Unirx, хоть он и бесплатен.
2. Непонятно кто вызывает Update в Timer, ведь Timer не MonoBehaviour. Возможно это делает Unirx, хотя по описанию этого плагина такого не скажешь.
3. Если Это все же MonoBehaviour, то при большом количестве таймеров получим много Update, что плохо.
Достоинства - прост.

Приведу свой таймер.
Сам таймер.
Код
    public class Timer
    {
  private float __timer;
  private bool __start;
  private int __currentCount;

  private readonly float __time;
  private readonly Action __actTick;
  private readonly Action __actEnd;
  private int __count;
  private readonly bool __delete;

  public Timer(float delay, int repeatCount, Action actionTick, Action actionEnd = null, bool autostart = false, bool autodelete = false)
  {
   __actTick = actionTick;
   __actEnd = actionEnd;
   __time = delay;
   __count = repeatCount;
   __timer = 0;
   __delete = autodelete;
   if(autostart) Start();
  }

  public void Start()
  {
   __currentCount = __count;
   __start = true;
  }

  public void Stop() { __start = false; }

  public bool Tick()
  {
   if(!__start) return false;
   __timer += Time.deltaTime;
   if (__timer < __time) return false;
   if(__actTick != null) __actTick.Invoke();
   __currentCount--;
   if(__currentCount != 0) return false;
   if (__actEnd != null) __actEnd.Invoke();
   __start = false;
   return __delete;
  }
    }

Таймер-менеджер
Код
    public class TimerManager : MonoBehaviour
    {
  private static readonly List<Timer> __timers = new List<Timer>();

  public void Update()
  {
   foreach (var timer in __timers)
   {
    if (timer.Tick()) __timers.Remove(timer);
   }
  }

  public static Timer AddTimer(float delay, int repeatCount, Action actionTick, bool autostart = false, bool autodelete = false, Action actionEnd = null)
  {
   var timer = new Timer(delay, repeatCount, actionTick, actionEnd, autostart, autodelete);
   __timers.Add(timer);
   return timer;
  }

  public static void StartTimer(Timer timer)
  {
   if(!__timers.Contains(timer)) __timers.Add(timer);
   timer.Start();
  }

  public static void StopTimer(Timer timer, bool delete = false)
  {
   if (!__timers.Contains(timer)) return;
   timer.Stop();
   if (delete) __timers.Remove(timer);
  }
    }

1. Ничего дополнительного не нужно.
2. Update один - в менеджере.
Создаем таймер через TimerManager.AddTimer
Можно задать количество срабатываний таймера.
Можно вызывать действие каждое срабатывание и дополнительно после последнего срабатывания
Можно указать автостарт при создании, можно сначала создать а запустить потом.
Можно указать автоудаление таймера после последнего срабатывания
Можно приостановить таймер.
Можно при приостановке таймера его автоматически удалить.
seamanДата: Среда, 20 Сентября 2017, 20:22 | Сообщение # 148 | Тема: Изменение color.a
старожил
Сейчас нет на сайте
Посмотри тут может поможет.
https://youtu.be/4uu8HWiDgjU?list=PLY7lEIeNqQdOsBi2QxPVgqLVecv3Br4TM&t=349
ЗЫ: по скриптам не разбирал, но в видео подобная проблема обсуждается


Сообщение отредактировал seaman - Среда, 20 Сентября 2017, 20:23
seamanДата: Вторник, 29 Августа 2017, 23:42 | Сообщение # 149 | Тема: Создать свое перо для работы с Terrain
старожил
Сейчас нет на сайте
Создаешь png файл с прозрачностью черно-белый. Кладешь его в папку Assets/Gizmos. Перезапускаешь Юнити. Радуешься! :o
seamanДата: Суббота, 26 Августа 2017, 18:50 | Сообщение # 150 | Тема: Сбрасывается диапазон Random.Range(...)
старожил
Сейчас нет на сайте
Цитата
начинает шпарить, как из пулемета

И при чем тут Random? Скорость зависит от многих вещей. Скорее всего Вы не учитываете fps и не используете Time.deltaTime...
seamanДата: Понедельник, 14 Августа 2017, 22:22 | Сообщение # 151 | Тема: Глюки камеры FirstPersonController'a
старожил
Сейчас нет на сайте
Из статьи (которую Вы скорее всего и нашли)
Цитата
Кватернионы и матрицы вращения это один из способов избежать шарнирного замка

И? Как избежать? Использовать кватернионы! Можно и матрицы, но это имхо - перебор.
Соответственно - следующий этап поискать статью про них. Там много статей. Ищите, читайте. Узнаете много нового. Станете экспертом - будете гордиться!
seamanДата: Четверг, 10 Августа 2017, 15:31 | Сообщение # 152 | Тема: Вопрос и мнение по поводу сохранения
старожил
Сейчас нет на сайте
Т.е. своего рода менеджер персонажей.
Тогда почему бы не хранить ссылку на персонажа, а не его характеристики?
seamanДата: Четверг, 10 Августа 2017, 13:45 | Сообщение # 153 | Тема: Вопрос-[ответ] по Unity
старожил
Сейчас нет на сайте
В любой версии Юнити?
У меня сейчас стоит 4 версии - ни в одной такого нет.
seamanДата: Четверг, 10 Августа 2017, 13:43 | Сообщение # 154 | Тема: Вопрос и мнение по поводу сохранения
старожил
Сейчас нет на сайте
У Вас один единственный персонаж на всю игру? Нет ни врагов, ни нейтральных персонажей?
Просто если вынести здоровье в статический класс - оно будет одно у всех!
seamanДата: Среда, 09 Августа 2017, 22:21 | Сообщение # 155 | Тема: Вопрос-[ответ] по Unity
старожил
Сейчас нет на сайте
Вообще есть такой запрос:
https://issuetracker.unity3d.com/issues/webgl-win-il2cpp-dot-exe-did-not-run-properly-with-specific-path
У меня в 5.6 этого нет, а в 2017 появилось.
seamanДата: Среда, 09 Августа 2017, 20:05 | Сообщение # 156 | Тема: Руки в шутере не работают
старожил
Сейчас нет на сайте
Странно - не написали лицензию.
А в коммерции это использовать можно?
seamanДата: Среда, 09 Августа 2017, 14:50 | Сообщение # 157 | Тема: Вопрос-[ответ] по Unity
старожил
Сейчас нет на сайте
С нормалмапами может быть несколько причин:
1. Нормалмапы кривые
2. Меши кривые (в частности развертка, хотя может быть и другое)
3. Шейдеры кривые
4. Руки кривые
seamanДата: Среда, 09 Августа 2017, 14:44 | Сообщение # 158 | Тема: Руки в шутере не работают
старожил
Сейчас нет на сайте
Там в архиве пример сцены. Создаете тестовый проект для изучения этого пакета. Распаковываете пакет в папку Assets созданного проекта. Юнити все это дело импортирует. В Юнити дважды щелкаете на файл демосцены (с расширением .unity). Открывается сцена. Изучате ее. Увидите, что на камере висит скрипт, вращающий ее вокруг рук. А вот точки вращения в ней не задано. Подумайте как ее задать...

На самом деле там просто модель этих рук. Ни анимаций ни каких то там скриптов управляющих руками нет. Так что работы с ними еще масса. Просто так в игре не использовать.
seamanДата: Воскресенье, 06 Августа 2017, 23:59 | Сообщение # 159 | Тема: Вопрос-[ответ] по Unity
старожил
Сейчас нет на сайте
Transform, а не объект имеет детей. Потому его и перебираем. Иерархия строится не по объектам, а по трансформам. Почему? Потому что положение, поворот, скейл детей зависит от родителей. А все перечисленное и есть трансформ.
У объекта же есть масса всего, что у детей не зависит от родителей.
Почему именно так? Т.е. не так: foreach(var child in transform.childs), а просто in transform. Потому что Юнитеки сделали именно трансформ IEnumerable. Ну и вообще у трансформа нет такого свойства childs. Т.е. получить всех его детей можно только перебрав их.
Почему использовать лучше enemy.transform.SetParent(child)? Потому что Юнитеки постепенно убирают прямой доступ к полям MonoBehaviour. Раньше можно было просто обратиться go.renderer. Сейчас надо go.GetComponent<Renderer>. Аналогично и с parent. Ранее писали просто transform.parent = сейчас transform.SetParent


Сообщение отредактировал seaman - Понедельник, 07 Августа 2017, 00:08
seamanДата: Воскресенье, 06 Августа 2017, 20:06 | Сообщение # 160 | Тема: Глюки камеры FirstPersonController'a
старожил
Сейчас нет на сайте
Это называет gimbal Lock. На хабре была хорошая статья, объясняющая этот эффект. Поищите.
Форум игроделов » Записи участника » seaman [1323]
Поиск:

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