Юнити изучаю, ну наверное 3-ий день. С каждым продвижением все больше нравится, но до уровня хотя бы уверенного пользователя еще где-то год изучения точно. Очень удобная штука, зря раньше не стал изучать.
Буду плодить свои вопросы тут, чтобы не порождать новые темы на каждый вопрос.
Когда будет появляться новый вопрос, то в названии темы он будет под новым номером и без квадратных скобочек со словом [Решено].
Вопрос №3 - Решение (http://www.gamedev.ru/community/unity3d/forum/?id=219425#m3)
Вопрос №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)
Поэтому прошу помощи, что не так делаю?
StepEver
> GetComponent<Rigidbody>().WakeUp();
Я так понимаю это на С написано, потому как в Жабе это все так заработало:
GetComponent(Rigidbody).WakeUp();
Спасибо!
Вообще JavaScript довольно урезанный в юньке, та что лучше постарайся переходить на Шарп
Перелез на C#. Разница не особая (при моем уровне знания каждого языка), однако на С гораздо более удобный и подробный компилятор. Спасибо
Как я смог выяснить, это фигня происходит из-за обнуления. Как можно решить подобное? В чем может быть еще подвох?
Еще заметил, что лажа железная в том, что когда я проверяю активность, она не всегда срабатывает. Т.е. коллизии чекаются всегда.
Нашел я значит этот кусок кода:
foreach (GameObject ForObj in ComWire) { if (myCollision.gameObject == ForObj) { if (myCollision.gameObject.GetComponent<WireProperty>().Active == 1){ Active = 1; } } }
Т.е. я перебираю массив объектов с нужным мне тегом. Проверяю, не тот ли это объект, что взаимодействует c моим. Если это тот объект, начинаю проверять - есть ли у него нужно мне свойство в скрипте.
Если есть, то чекаю у этого объекта параметр Актив. Если нет, то нет.
Фишка в том, что если убрать сравнение свойств, то чекается все просто на раз. Вопрос, почему проверка параметра в цикле может не срабатывать?
Вот полный код:
Все, разобрался почему. Полностью переделал код.
Вопрос №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
Что я упускаю из виду?
Скорее всего проблема в layermask, попробуй объявить её как в примере https://docs.unity3d.com/ScriptReference/LayerMask.html
Sazonoff
Да, проблема была в этом. Не думал что их еще нужно спецом объявлять.
Спасибо!
Хм, подскажите, как вы делаете.
Допустим у меня есть кораблик и он пуляет снаряды. Нужно чтобы снаряд вылетел из корабля и дальше летит по этой прямой.
Вроде бы и пустяк, и на самом деле нифига.
Если я заставляю двигаться в своих координатах то порой происходит лажа (или так и делают? если да, то лажа в другом месте)
Просто как делал в Блитце/Хорсе - создавал объект либо с привязкой к родителю объекту, либо после привязывал. Задавал его координаты и углы. Убирал привязку. Т.е. объект уже был самостоятельным, но в нужном месте.
После чего делал нужные действия.
Тут как подобное сделать?
Точнее, самое что нужно, чтобы объект двигался относительно одной оси своих координат.
transform.Translate(transform.forward * Time.deltaTime * speed);
Но если есть RigidBody на снарядах. То двигать тело через трансформ плохая практика. Лучше так
rigidBody.MovePosition(transform.position + transform.forward * Time.fixedDeltaTime * speed);
MUG
Спасибо за идею (не знал что такие штуки даже есть)! Однако дело оказалось в другом - во время вращения я задевал предмет коллайдером и он летел по дуге после этого.
Но все равно спасибо!
MUG
> То двигать тело через трансформ плохая практика.
Ну, у меня там много Твердых тел. Почему плохо? В чем будет потом проблема?
> Ну, у меня там много Твердых тел. Почему плохо? В чем будет потом проблема?
Все что имеет ригидбоди, надо двигать, крутить и т.д. через ригидбоди. При этом все что двигается и имеет коллайдер, должно обязательно иметь ригидбоди. Эти ограничения связанны с перерасчетом физики для тел, которые двигаются неправильным образом и поэтому негативно влиять на ФПС.
На самом деле двигать через rigidBody.MovePosition, тоже не очень хорошо, на сколько я помню. в идеале все ригидбоди по хорошему надо двигать через
rb.AddForce rb.AddTorque
MUG
Оу, спасибо. Буду стараться так делать.
Тема в архиве.