Войти
UnityФорумОбщее

Начал изучать Unity3D. Глупые вопросы новичка | Вопрос №6 [Решено]

Страницы: 1 2 Следующая »
#0
8:47, 11 окт 2016

Юнити изучаю, ну наверное 3-ий день. С каждым продвижением все больше нравится, но до уровня хотя бы уверенного пользователя еще где-то год изучения точно. Очень удобная штука, зря раньше не стал изучать.
Буду плодить свои вопросы тут, чтобы не порождать новые темы на каждый вопрос.

Когда будет появляться новый вопрос, то в названии темы он будет под новым номером и без квадратных скобочек со словом [Решено].

+ Вопрос №1
+ Вопрос №2

Вопрос №3 - Решение (http://www.gamedev.ru/community/unity3d/forum/?id=219425#m3)

#1
8:47, 11 окт 2016

Вопрос №3

Столкнулся с тем, что физика затухает когда (если установлено значение), то объект более не считается.
Можно в глобальных настройках отключить и вовсе это, но тогда будут считать ВСЕ объекты, а это лишняя трата ресурсов.
Покопал интернеты и сайт Юнити. Для этого там рекомендуют использовать функцию WakeUp, чтобы привести объект в чувства.
Все бы ничего, но что-то я не понимаю, как ее прилепить.
Допустим, я хочу чтобы объект был постоянно активный.
Поэтому каждый FixedUpdate я планирую вызывать конструкцию rigidbody.WakeUp();
Однако на деле мне не удается этого сделать, т.к. компилятор посылает меня -
Error BCE0144: 'UnityEngine.Component.rigidbody' is obsolete. Property rigidbody has been deprecated. Use GetComponent<Rigidbody>() instead. (UnityUpgradable) (BCE0144) (Assembly-UnityScript)
Error BCE0019: 'WakeUp' is not a member of 'UnityEngine.Component'.  (BCE0019) (Assembly-UnityScript)

Поэтому прошу помощи, что не так делаю?

#2
9:54, 11 окт 2016

StepEver
> GetComponent<Rigidbody>().WakeUp();
Я так понимаю это на С написано, потому как в Жабе это все так заработало:

GetComponent(Rigidbody).WakeUp();

Спасибо!

#3
10:07, 11 окт 2016

Вообще JavaScript довольно урезанный в юньке, та что лучше постарайся переходить на Шарп

#4
7:19, 16 окт 2016

Перелез на C#. Разница не особая (при моем уровне знания каждого языка), однако на С гораздо более удобный и подробный компилятор. Спасибо



Возникла такая фигота. Я пытаюсь сделать логические элементы с помощью тригеров. Допустим, я касаюсь одним телом другого. У каждого есть rigidbody, но одно триггер.
То которое триггер, в нем проверяю, вошло ли тело. Если да, то меняю значение. Если нет, то нет. В функции FixedUpdate я его обнуляю, дабы оно было 0 и постоянно проверялось, есть ли контакт.
Так вот, этот триггер соединен с таким же как и он. И он должен активироваться, если находится в контакте с таким же активированным триггером.
Проблема заключается в том, что все работает через раз. Т.е. можно запустить и будет срабатывать 3 запуска подряд, а потом уже не срабатывать.

Как я смог выяснить, это фигня происходит из-за обнуления. Как можно решить подобное? В чем может быть еще подвох?
Еще заметил, что лажа железная в том, что когда я проверяю активность, она не всегда срабатывает. Т.е. коллизии чекаются всегда.
Нашел я значит этот кусок кода:

foreach (GameObject ForObj in ComWire) {  
      if (myCollision.gameObject == ForObj) {
        if (myCollision.gameObject.GetComponent<WireProperty>().Active == 1){
          Active = 1;
        }

      }
    }

Т.е. я перебираю массив объектов с нужным мне тегом. Проверяю, не тот ли это объект, что взаимодействует c моим. Если это тот объект, начинаю проверять - есть ли у него нужно мне свойство в скрипте.
Если есть, то чекаю у этого объекта параметр Актив. Если нет, то нет.
Фишка в том, что если убрать сравнение свойств, то чекается все просто на раз. Вопрос, почему проверка параметра в цикле может не срабатывать?

Вот полный код:

+ Показать
#5
11:22, 18 окт 2016

Все, разобрался почему. Полностью переделал код.

#6
18:48, 1 ноя 2016

Вопрос №5
Не могу понять, что не так делаю:

  RaycastHit hit;
  Ray ray;
  public Vector3 MV;
  
  // Update is called once per frame
  void Update () {
    ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray,out hit,Mathf.Infinity,8))
    {
      
      MV = hit.point;
    }
  }

Вроде трассирую луч на 8 слой, но нифига не работает...
Как мне объясняли в первом примере работает.
В справке вроде все сходится...

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
Parameters

Что я упускаю из виду?

#7
20:12, 1 ноя 2016

Скорее всего проблема в layermask, попробуй объявить её как в примере https://docs.unity3d.com/ScriptReference/LayerMask.html

#8
2:49, 2 ноя 2016

Sazonoff
Да, проблема была в этом. Не думал что их еще нужно спецом объявлять.
Спасибо!

#9
12:33, 2 ноя 2016

Хм, подскажите, как вы делаете.
Допустим у меня есть кораблик и он пуляет снаряды. Нужно чтобы снаряд вылетел из корабля и дальше летит по этой прямой.
Вроде бы и пустяк, и на самом деле нифига.
Если я заставляю двигаться в своих координатах то порой происходит лажа (или так и делают? если да, то лажа в другом месте)

Просто как делал в Блитце/Хорсе - создавал объект либо с привязкой к родителю объекту, либо после привязывал. Задавал его координаты и углы. Убирал привязку. Т.е. объект уже был самостоятельным, но в нужном месте.
После чего делал нужные действия.

Тут как подобное сделать?
Точнее, самое что нужно, чтобы объект двигался относительно одной оси своих координат.

#10
13:06, 2 ноя 2016
transform.Translate(transform.forward * Time.deltaTime * speed);

Но если есть RigidBody на снарядах. То двигать тело через трансформ плохая практика. Лучше так

rigidBody.MovePosition(transform.position + transform.forward * Time.fixedDeltaTime * speed);
#11
13:13, 2 ноя 2016

MUG
Спасибо за идею (не знал что такие штуки даже есть)! Однако дело оказалось в другом - во время вращения я задевал предмет коллайдером и он летел по дуге после этого.
Но все равно спасибо!

#12
13:14, 2 ноя 2016

MUG
> То двигать тело через трансформ плохая практика.
Ну, у меня там много Твердых тел. Почему плохо? В чем будет потом проблема?

#13
13:20, 2 ноя 2016

> Ну, у меня там много Твердых тел. Почему плохо? В чем будет потом проблема?

Все что имеет ригидбоди, надо двигать, крутить и т.д. через ригидбоди. При этом все что двигается и имеет коллайдер, должно обязательно иметь ригидбоди. Эти ограничения связанны с перерасчетом физики для тел, которые двигаются неправильным образом и поэтому негативно влиять на ФПС.

На самом деле двигать через rigidBody.MovePosition, тоже не очень хорошо, на сколько я помню. в идеале все ригидбоди по хорошему надо двигать через

rb.AddForce
rb.AddTorque
#14
13:22, 2 ноя 2016

MUG
Оу, спасибо. Буду стараться так делать.

Страницы: 1 2 Следующая »
UnityФорумОбщее

Тема в архиве.